两个3D向量之间的角度为0-360



我正在寻找一种计算三个点之间的角度的方法(见下文(:

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而丢失。结果。

我要寻找的是结果范围0-360不限于0-180。我该如何实现?

答案是提供参考向量:

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

您在寻找这个吗?

θ_radian= arccos((p·q(/(P的((with vectors p和q

θ_radian=θ_degree *π/180

编辑0-360范围

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

最新更新