我正在寻找一种方法来计算视为两个向量三个点之间的角度(见下文):与结果范围0两个3D向量之间的角度 - 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中丢失了,它永远不会返回-ve结果。
我在找的是一个结果范围0 - 360不限于0 - 180.我该如何做到这一点?
将不会从Math.PI这是180度减去。你的结果是0到360,所以当你从180减去你得到的结果从+180到-180。 – jdweng
在3D空间中,两个矢量之间的角度仅在0到180度之间定义。在什么情况下你想要180度和360度之间的答案?这很容易在2D空间中定义为有向或有符号的角度,但这不会延伸到3D空间。 –