最佳答案
尽管看起来有点像正弦波,但实际上是 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;
}
有更好的方法可以做到这一点,但这应该可以帮助您入门并为您提供一些用于进一步搜索的词汇。干杯!
关于math - 从 x1,y1 到 x2,y2 的正弦波线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44578873/