我正在寻找一种计算三个点之间角度的方法,这三个点被视为两个向量(见下文):
如果您给出以下几点:
或以下内容:
你将得到相同的结果。我可以在函数返回中看到叉积的结果,第一种情况下是(0, 0, 10000),第二种情况下是(0, 0, -10000),但这个信息会因为cross.Length而丢失,它永远不会返回负数.
我想要的是一个结果范围在0-360之间,而不是仅限于0-180。我该如何实现这一点?
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。我该如何实现这一点?