测试图:

原文出处:http://去掉zh.wikipedia.org/zh-cn/%E8%B2%9D%E8%8C%B2%E6%9B%B2%E7%B7%9A 

中的三次方贝塞尔曲线

三次方贝塞尔曲线类:

 

代码
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Xna.Framework;

namespace XnaStructure
{
    
public class Bezier
    {
        
float ax, bx, cx;
        
float ay, by, cy;
        
float tSquared, tCubed;
        Vector2 result;

        
/// <summary>
        
/// cp在此必须是四个元素的阵列:
        
/// cp[0]为起始点,或上圖中的P0
        
/// cp[1]为第一个控制点,或上图中的P1
        
/// cp[2]为第二个控制点,或上图中的P2
        
/// cp[3]为结束点,或上图中的P3
        
/// t为参数值,0<=t<=1
        /// </summary>
        
/// <param name="cp"></param>
        
/// <param name="t"></param>
        
/// <returns></returns>
        Vector2 PointOnCubicBezier(Vector2[] cp, float t)
        {
            
//计算多项式系数
            cx = 3.0f * (cp[1].X - cp[0].X);
            bx 
= 3.0f * (cp[2].X - cp[1].X) - cx;
            ax 
= cp[3].X - cp[0].X - cx - bx;

            cy 
= 3.0f * (cp[1].Y - cp[0].Y);
            by 
= 3.0f * (cp[2].Y - cp[1].Y) - cy;
            ay 
= cp[3].Y - cp[0].Y - cy - by;

            
//計算位於參數值t的曲線點
            tSquared = t * t;
            tCubed 
= tSquared * t;

            result.X 
= (ax * tCubed) + (bx * tSquared) + (cx * t) + cp[0].X;
            result.Y 
= (ay * tCubed) + (by * tSquared) + (cy * t) + cp[0].Y;

            
return result;
        }

        
float dt;

        
/// <summary>
        
/// ComputeBezier以控制点cp所产生的曲线点,填入Point2D结构的阵列
        
/// 呼叫者必須分配足夠的内存以供输出结果
        
/// </summary>
        
/// <param name="cp"></param>
        
/// <param name="nuberOfPoints"></param>
        
/// <param name="curve"></param>
        internal Vector2[] ComputeBezier(Vector2[] cp, Vector2[] curve)
        {
            dt 
= 1.0f / (curve.Length - 1);

            
for (int i = 0; i < curve.Length; i++)
                curve[i] 
= PointOnCubicBezier(cp, i * dt);

            
return curve;
        }
    }
}

 

 

1.使用类的时候首先声明参数:

//贝塞尔曲线
Bezier bezier = new Bezier();
Vector2[] cp1 = new Vector2[4];
Vector2[] vector2Curve = new Vector2[100];

 

2.在构造函数中写入如下代码

 

//贝塞尔曲线
cp1[0].X = 100;
cp1[1].X = 100;
cp1[2].X = 100;
cp1[3].X = 100;

cp1[0].Y = 100;
cp1[1].Y = 150;
cp1[2].Y = 120;
cp1[3].Y = 100;

vector2Curve = bezier.ComputeBezier(cp1, vector2Curve);

for (int i = 0; i < vector2Curve.Length; i++)
{
  vector2Curve[i].X += i;
}

 

3.在Draw方法中写入如下代码:(素材请自己搞定)

//画贝塞尔曲线
            for(int i=0;i<vector2Curve.Length;i++)
            {
                Game3.spriteBatch2.Draw(
                    myTexture2D,
                    vector2Curve[i],
                    myRec,
                    Color.White,
                    0,
                    myVector2,
                    0.1f,
                    SpriteEffects.None,
                    0);
            }