【问题标题】:Calculating a reflected arc计算反射弧
【发布时间】:2018-09-28 04:36:40
【问题描述】:

我正在使用以下代码来计算使用 Line Renderer 绘制的圆弧的点。

for (int i = 0; i <= pts; i++)
{
    float x = center.x + radius * Mathf.Cos(ang * Mathf.Deg2Rad);
    float y = center.y + radius * Mathf.Sin(ang * Mathf.Deg2Rad);
    arcLine.positionCount = i + 1;
    arcLine.SetPosition(i, new Vector2(x, y));
    ang += (float)totalAngle / pts;
}

如何更改角度ang 以沿P1P2 线创建反射弧,如下图所示?

请注意,totalAngle 表示要在 0 到 360 之间绘制的圆部分。

【问题讨论】:

    标签: c# algorithm unity3d math


    【解决方案1】:

    我不完全确定这是否可行,但我想出了另一种类似这样的方法:

    首先,一个辅助函数:

    Vector2 GetPosition (float radius, float angle)
    {
        angle *= Mathf.Deg2Rad;
    
        return new Vector2
        {
            x = radius * Mathf.Cos(angle),
            y = radius * Mathf.Sin(angle)
        };
    }
    

    然后,计算p1p2 的位置:

    var p1 = GetPosition(radius, ang);
    var p2 = GetPosition(radius, totalAngle);
    

    推导出中点p3

    var p3 = (p1 + p2) * 0.5f;
    

    最后将原点绕p3旋转得到反射点:

    var pos = p3 * 2f - GetPosition(radius, ang);
    

    就是这样!您的代码应如下所示:

    void Draw ()
    {    
        var p1 = GetPosition(radius, ang);
        var p2 = GetPosition(radius, totalAngle);
        var p3 = (p1 + p2) * 0.5f;
    
        for (int i = 0; i <= pts; i++)
        {           
            var pos = p3 * 2f - GetPosition(radius, ang);       
    
            arcLine.positionCount = i + 1;
            arcLine.SetPosition(i, center + pos);
            ang += totalAngle / pts;
        }
    }
    
    Vector2 GetPosition (float radius, float angle)
    {
        angle *= Mathf.Deg2Rad;
    
        return new Vector2
        {
            x = radius * Mathf.Cos(angle),
            y = radius * Mathf.Sin(angle)
        };
    }
    

    下面是实际操作:

    【讨论】:

      猜你喜欢
      • 2013-01-06
      • 2011-05-08
      • 2021-01-08
      • 1970-01-01
      • 2016-07-11
      • 1970-01-01
      • 1970-01-01
      • 2023-02-16
      • 2012-04-27
      相关资源
      最近更新 更多