这个问题/错误与C# 中的这个角度测量器直接相关。问题似乎是角度大于 180 的 theta 是错误的(我的工作单位是度数,而不是弧度)。
这是一个有用的屏幕截图。这张照片代表了三只恐龙的俯视图。恐龙的身体是灰色的。头部是一个白点。每只恐龙的“视角”(并非所有物种都相同)是蓝线。
如您所见,每只恐龙的朝向都是正确的。John 和 Julie 之间的角度的 theta 看起来是正确的。然而,从朱莉到约翰和马菲到约翰的角度是完全错误的。每个都应 > 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 米处沿其轴的投影是正确的:
最后更改后的屏幕截图:
这是“恐龙角度”的“我的定义”,也是我所期望的:
- Muffie 几乎面向东方(108 度)。约翰几乎就在她身后,左边一点。我希望 Muffie 和 John 之间的角度约为 195 度。
- 朱莉面向西南(235 度)。约翰几乎直接在朱莉的右边。我预计朱莉和约翰之间的角度约为 87 度。
- 约翰几乎直视朱莉(朱莉在“正面”的右边一点)。我预计约翰和朱莉之间的角度约为 7 度。
我想知道这些数字是否正确,但我们需要将它们“标准化”到“观众恐龙”所面临的方向?我想要的“恐龙之间的角度”是相对于各自的恐龙而言的。
本质上,我试图根据物种的“视角”确定哪些恐龙可以看到哪些恐龙。