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

标签 c# math 3d

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

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。我该如何实现?

最佳答案

答案是提供一个引用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

关于c# - 结果范围为 0 - 360 的两个 3D 矢量之间的角度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43493711/

相关文章:

php - 如何将两个四元数相乘

c++ - 检查框内是否有 3D 点

c# - 如何从 C# 中的 SQL 存储过程中检索结果集和 PRINT 消息?

C# 异步 Http 请求,如何停止跳过?

r - R中的logit函数

javascript - 从数组中选取特定元素

pdf - 如何从 ABAQUS/Viewer 打印 3D pdf?

c# - 跨线程属性行为

C# - 创建一个可保存的对象

math - 余弦相似度LSH和随机超平面