给定两个已知长度和段之间的角度(AB和BC),如果已知A和B的坐标,如何计算C点的坐标?

时间:2019-07-19 01:52:12

标签: c# vector geometry trigonometry

我正在创建一个绘制路径的C#代码。问题是我没有路径顶点的坐标。相反,我知道每个线段的长度以及相邻线段之间的角度。

假设路径的第一点具有坐标(0; 0),我想绘制一条路径,该路径根据给定的线段长度和角度计算每个顶点。我的三角学不好,但我希望有可能。

我尝试遍历线段的集合以计算每一步的下一个点坐标。因此,在任何一步,我都有以下数据:

enter image description here

给出长度为L1的第一段AB,长度为L2的下一段BC,段AB和BC之间的角度ABC。已知点A和B的坐标,因为它们在上一步中进行了评估。

如果可能,如何根据给定数据计算点C的坐标?

这是细分集合的示例:

    public ObservableCollection<SequenceStep> Sequence { get; set; }

其中:

    public class SequenceStep
    {
        public double Length { get; set; }
        public double Angle { get; set; }
    }

我循环执行以下顺序:

    for (var i = 1; i < Sequence.Count; i++)
    {
        var sequenceStep = Sequence[i];
        var angleInRadians = Math.PI * sequenceStep.Angle / 180.0;

        // Calculate next point coordinates from (0,0)

        var x = Math.Cos(angleInRadians) * sequenceStep.Length;
        var y = Math.Sin(angleInRadians) * sequenceStep.Length;
    }

// I start from segment[1], because segment[0] has points (0,0) and (segment[0].Length, 0).

但是评估的坐标仅适用于点和X轴之间的角度。我想我需要旋转那些x,y坐标,以与BC线段的方向相对应。但是我总是得到错误的坐标。

我将不胜感激,希望提供任何帮助,C#方法或一组公式。

1 个答案:

答案 0 :(得分:1)

您可以像已经进行的那样累积角度并计算位置:

double angle = 0.0;
double x = Seqence[0].Length;
double y = 0.0;
for (var i = 1; i < Sequence.Count; i++)
{
    var sequenceStep = Sequence[i];
    var angleInRadians = Math.PI * sequenceStep.Angle / 180.0;

    // update the current angle
    angle += Math.PI - angleInRadians; 
    //    ^-- might also be -= depending on your definition of orientation

    // Calculate next point coordinates

    x += Math.Cos(angle) * sequenceStep.Length;
    y += Math.Sin(angle) * sequenceStep.Length;

    // Now use (x, y)
}