Math 从x1,y1到x2,y2的正弦波线

Math 从x1,y1到x2,y2的正弦波线,math,unity3d,game-maker,trigonometry,Math,Unity3d,Game Maker,Trigonometry,: 我希望能够从一个点到另一个点绘制线,就像上图中所示的线一样,但我不知道如何去做 我使用的是GML,但如果你给我任何其他代码,那么我很可能会理解它。尽管看起来有点像正弦波,但实际上这是一个错误。Wikipedia的那篇文章经过了数学运算,是一篇介绍实现的文章,应该相当简单。假设您通常像UE4蓝图中那样水平绘制线,我会将控制点放置在水平中点,并与每个点控制的端点位于相同的y水平,创建一个“阶梯”形状: 首先,您需要创建一个函数来计算给定曲线上的点。下面是文章中的C#实现: Vector3 Ca

:

我希望能够从一个点到另一个点绘制线,就像上图中所示的线一样,但我不知道如何去做


我使用的是GML,但如果你给我任何其他代码,那么我很可能会理解它。

尽管看起来有点像正弦波,但实际上这是一个错误。Wikipedia的那篇文章经过了数学运算,是一篇介绍实现的文章,应该相当简单。假设您通常像UE4蓝图中那样水平绘制线,我会将控制点放置在水平中点,并与每个点控制的端点位于相同的y水平,创建一个“阶梯”形状:

首先,您需要创建一个函数来计算给定曲线上的点。下面是文章中的C#实现:

Vector3 CalculateBezierPoint(float t,
  Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3)
{
    float u = 1 – t;
    float tt = t*t;
    float uu = u*u;
    float uuu = uu * u;
    float ttt = tt * t;

    Vector3 p = uuu * p0; //first term
    p += 3 * uu * t * p1; //second term
    p += 3 * u * tt * p2; //third term
    p += ttt * p3; //fourth term

    return p;
}
q0 = CalculateBezierPoint(0, p0, p1, p2, p3);

for(int i = 1; i <= SEGMENT_COUNT; i++)
{
    t = i / (float) SEGMENT_COUNT;
    q1 = CalculateBezierPoint(t, p0, p1, p2, p3);
    DrawLine(q0, q1);
    q0 = q1;
}
您可以将Vector3更改为2D Vector2结构,或者将其分解为x/y值,然后调整数学以进行补偿(很抱歉,我使用GML已经十年了,所以我不确定您必须使用哪种类型的数据结构)

现在您已经有了计算曲线上点的方法,您可以编写一个函数来绘制曲线。绘制它而不丢失任何像素的最简单方法是绘制一系列线段。同样,这是本文中的C#实现:

Vector3 CalculateBezierPoint(float t,
  Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3)
{
    float u = 1 – t;
    float tt = t*t;
    float uu = u*u;
    float uuu = uu * u;
    float ttt = tt * t;

    Vector3 p = uuu * p0; //first term
    p += 3 * uu * t * p1; //second term
    p += 3 * u * tt * p2; //third term
    p += ttt * p3; //fourth term

    return p;
}
q0 = CalculateBezierPoint(0, p0, p1, p2, p3);

for(int i = 1; i <= SEGMENT_COUNT; i++)
{
    t = i / (float) SEGMENT_COUNT;
    q1 = CalculateBezierPoint(t, p0, p1, p2, p3);
    DrawLine(q0, q1);
    q0 = q1;
}
q0=CalculateBezierPoint(0,p0,p1,p2,p3);
对于(int i=1;i