2017-06-16 106 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