【问题标题】:Sin wave line from x1,y1 to x2,y2从 x1,y1 到 x2,y2 的正弦波线
【发布时间】:2017-11-18 14:51:00
【问题描述】:

EXAMPLE PICTURE

我希望能够从一点画线到另一点,就像上图所示的线一样,但我不知道该怎么做。

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

【问题讨论】:

    标签: math unity3d game-maker trigonometry


    【解决方案1】:

    尽管看起来有点像正弦波,但实际上是cubic Bézier curve。那篇 Wikipedia 文章介绍了数学,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;
    }
    

    有更好的方法,但这应该可以帮助您入门并为您提供一些词汇以供进一步搜索。干杯!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-02
      • 1970-01-01
      • 1970-01-01
      • 2015-09-12
      • 1970-01-01
      • 2020-11-17
      相关资源
      最近更新 更多