3

这个问题/错误与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 度。

我想知道这些数字是否正确,但我们需要将它们“标准化”到“观众恐龙”所面临的方向?我想要的“恐龙之间的角度”是相对于各自的恐龙而言的。

本质上,我试图根据物种的“视角”确定哪些恐龙可以看到哪些恐龙。

4

1 回答 1

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;
}

我在这里找到了解决方案:计算 2 个向量之间的顺时针角度的直接方法

于 2013-09-28T17:59:47.143 回答