测试图:

原文出处:http://去掉zh.wikipedia.org/zh-cn/%E8%B2%9D%E8%8C%B2%E6%9B%B2%E7%B7%9A
中的三次方贝塞尔曲线
三次方贝塞尔曲线类:
代码
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);
}
