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

标签 math unity-game-engine game-maker trigonometry

EXAMPLE PICTURE :

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

我正在使用 GML,但如果您给我任何其他代码,那么我很可能能够理解它。

最佳答案

尽管看起来有点像正弦波,但实际上是 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/

相关文章:

android - Game Maker Export 问题

java - 2 个物体之间的角度

math - 在给定旋转矩阵的情况下找到顶点的新位置

c# - 用于计算着色器步幅的自定义结构体的 sizeof

c - 数学指数函数的Python源代码?

javascript - Unity3d和Sockets.IO不会握手

android - 如何通过来自 3 个不同游戏对象的触发器使游戏对象出现

c++ - 如何使用 C++ 在 SFML 中播放播放器

math - 使用旋转矩阵从 body 轴到地球轴? [OpenGL]

c++ - Windows时间戳(C++)