2017-06-16 105 views
2

EXAMPLE PICTURESIN波线,Y2

我希望能够从一个点画线到另一就像在上图中示出的线,但我不知道如何去做。

我正在使用GML,但是如果你给我任何其他代码,那么我将更有可能了解它。

回答

5

尽管看起来像一个正弦波,实际上是一个cubic Bézier curve。维基百科文章通过数学,而here是一篇文章,通过一个应该相当简单的实现。假设你通常像在UE4蓝图中那样水平绘制线,我会将控制点放置在水平中点,并且与每个正在控制的端点处于相同的y水平,从而创建“阶梯”形状:

p0 . . . p1 . . . . 
. . . . . . . . . 
. . . . p2 . . . p3 

首先,您需要创建一个函数来计算给定曲线上的点。下面是文章的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; 
} 

您可以更改的Vector3成2D Vector2结构,或打破它伸到x/y值,只是调整的数学补偿(我道歉,它已经大约十年因为我使用过GML,所以我不确定你需要使用哪种类型的数据结构)。

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

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; 
} 

有这样做的更好的方法,但应该让你开始,并给你一些词汇进行进一步搜索。干杯!

+0

非常感谢!超级有用和信息! – CKlidify