此问题/错误与此Angle Measurer in C#直接相关。问题似乎是角度大于180时θ是错误的(我是以度数工作,而不是弧度)。
这是一个有用的屏幕截图。这张照片代表三只恐龙的俯视图。恐龙的身体是灰色的。头是白点。每只恐龙的“视角”(所有物种都不一样)是蓝线。
正如您所看到的,每只恐龙的面部都是正确的。约翰和朱莉之间角度的θ看起来是正确的。然而,从朱莉到约翰和穆菲到约翰的角度都是错误的。每个应该> 180度。
以下是代码段:
double DinoAFacing = FindAngle(
Dinosaurs[DinoA].Head.X,
Dinosaurs[DinoA].Head.Y,
Dinosaurs[DinoA].Location[Dinosaurs[DinoA].Location.Count - 1].X,
Dinosaurs[DinoA].Location[Dinosaurs[DinoA].Location.Count - 1].Y);
int Specie = ReturnDinosaurSpecie(DinoA);
double x = 50 * Math.Cos((DinoAFacing - 90) * (Math.PI / 180.0));
double y = 50 * Math.Sin((DinoAFacing - 90) * (Math.PI / 180.0));
x += Dinosaurs[DinoA].Head.X;
y += Dinosaurs[DinoA].Head.Y;
System.Windows.Point A = new System.Windows.Point();
A.X = x - Dinosaurs[DinoA].Head.X;
A.Y = y - Dinosaurs[DinoA].Head.Y;
System.Windows.Point B = new System.Windows.Point();
B.X = Dinosaurs[DinoB].Head.X - Dinosaurs[DinoA].Head.X;
B.Y = Dinosaurs[DinoB].Head.Y - Dinosaurs[DinoA].Head.Y;
double ALen = Math.Sqrt(Math.Pow(A.X, 2) + Math.Pow(A.Y, 2));
double BLen = Math.Sqrt(Math.Pow(B.X, 2) + Math.Pow(B.Y, 2));
double dotProduct = A.X * B.X + A.Y * B.Y;
double Angle
= Math.Abs(((180 / Math.PI) * Math.Acos(dotProduct / (ALen * BLen))));
slug = Dinosaurs[DinoA].PersonalName
+ " is facing: "
+ string.Format("{0:f2}", string.Format("{0:f2}", DinoAFacing))
+ "\nThe angle between "
+ Dinosaurs[DinoA].PersonalName
+ " and "
+ Dinosaurs[DinoB].PersonalName
+ " is "
+ string.Format("{0:f2}", Angle)
+ "\n"
+ Dinosaurs[DinoA].PersonalName
+ " CAN see "
+ Dinosaurs[DinoB].PersonalName;
System.Windows.MessageBox.Show(
slug,
"Dino vision",
System.Windows.MessageBoxButton.OK);
你们中的任何一个数学家都可以看到我的方式错误吗?
谢谢!
编辑: 屏幕截图显示恐龙沿其轴线前方50米处的投影是正确的:
上次更改后的屏幕截图:
这是'我对'恐龙角度'的定义以及我所期望的:
我想知道这些数字是否正确但是我们需要将它们“正常化”到“观察者恐龙”面临的方向吗?我想要的“恐龙之间的角度”与相应的恐龙有关。
从本质上讲,我试图根据物种的视角来确定哪些恐龙可以看到哪些恐龙。
答案 0 :(得分:2)
问题是Math.Acos
仅返回[0, π]
范围内的角度。这是因为两个向量之间总是存在两个角度,并且您的计算将始终返回较小的向量。要解决这个问题,你需要重新定义“恐龙之间的角度”的概念。要解决这种不确定性,您可以计算向量之间的顺时针角度:
//...
double dotProduct = A.X * B.X + A.Y * B.Y;
double determinant = A.X * B.Y - A.Y * B.X;
double angle = (180 / Math.PI)
* (Math.Atan2(determinant , dotProduct));
if (angle < 0)
{
angle += 360;
}
我在这里找到了解决方案:Direct way of computing clockwise angle between 2 vectors