两个 3D 矢量之间的角度,结果范围为 0 - 360

问题描述 投票:0回答:3

我正在寻找一种方法来计算被视为两个向量的三个点之间的角度(见下文):

using System.Windows.Media.Media3D;

public static float AngleBetweenThreePoints(Point3D[] points)
{
    var v1 = points[1] - points[0];
    var v2 = points[2] - points[1];

    var cross = Vector3D.CrossProduct(v1, v2);
    var dot = Vector3D.DotProduct(v1, v2);

    var angle = Math.PI - Math.Atan2(cross.Length, dot);
    return (float) angle;
}

如果您给出以下几点:

var points = new[]
{
    new Point3D(90, 100, 300),
    new Point3D(100, 200, 300),
    new Point3D(100, 300, 300)
};

或以下内容:

var points = new[]
{
    new Point3D(110, 100, 300),
    new Point3D(100, 200, 300),
    new Point3D(100, 300, 300)
};

您会得到相同的结果。我可以看到函数中的叉积在第一种情况下返回 (0, 0, 10000),在第二种情况下返回 (0, 0, -10000),但此信息会随着 cross.Length 丢失,而它永远不会返回 -ve结果。

我正在寻找的是结果范围 0 - 360,不限于 0 - 180。我如何实现这一点?

c# math 3d
3个回答
4
投票

答案是提供参考UP向量:

public static float AngleBetweenThreePoints(Point3D[] points, Vector3D up)
{
    var v1 = points[1] - points[0];
    var v2 = points[2] - points[1];

    var cross = Vector3D.CrossProduct(v1, v2);
    var dot = Vector3D.DotProduct(v1, v2);

    var angle = Math.Atan2(cross.Length, dot);

    var test = Vector3D.DotProduct(up, cross);
    if (test < 0.0) angle = -angle;
    return (float) angle;
}

这来自这里:https://stackoverflow.com/a/5190354/181622


2
投票

你在找这个吗?

θ_radian = arccos ( (P⋅Q) / (∣P∣∣Q∣) ) 与向量 P 和 Q

θ_弧度 = θ_度 * π / 180

编辑 0-360 范围

angle = angle * 360 / (2*Math.PI);
if (angle < 0) angle = angle + 360;

0
投票

您已经拥有所需的所有信息。如果叉积为正,则角度在 0 到 180 之间;如果叉积为负,则在 0 到 -180(或 180 到 360)之间 一个简单的 if 语句可以用来翻转角度上的符号。

© www.soinside.com 2019 - 2024. All rights reserved.