计算反射弧

时间:2018-04-18 04:26:28

标签: c# algorithm unity3d math

我使用以下代码计算使用线条渲染器绘制的圆弧的点。

html, body {
  height: 100%;
}

如何更改角度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表示要在0到360之间绘制的圆圈部分。

enter image description here

1 个答案:

答案 0 :(得分:0)

我不完全确定这是可能的,但我提出了另一种方式:

首先,辅助函数:

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)
    };
}

这里有它的实际效果: