计算角度θ时出错

时间:2013-09-28 17:12:56

标签: c# angle

此问题/错误与此Angle Measurer in C#直接相关。问题似乎是角度大于180时θ是错误的(我是以度数工作,而不是弧度)。

这是一个有用的屏幕截图。这张照片代表三只恐龙的俯视图。恐龙的身体是灰色的。头是白点。每只恐龙的“视角”(所有物种都不一样)是蓝线。

enter image description here

正如您所看到的,每只恐龙的面部都是正确的。约翰和朱莉之间角度的θ看起来是正确的。然而,从朱莉到约翰和穆菲到约翰的角度都是错误的。每个应该> 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米处的投影是正确的:

enter image description here

上次更改后的屏幕截图:

enter image description here

这是'我对'恐龙角度'的定义以及我所期望的:

  • Muffie面向近东(108度)。约翰几乎直接在她身后,左边几乎没有。我希望Muffie和John之间的角度大约是195度。
  • 朱莉面向西南(235度)。约翰几乎直接与朱莉的权利。我希望朱莉和约翰之间的角度大约是87度。
  • 约翰几乎直接看着朱莉(朱莉在'正面'的右边有一点点)。我希望约翰和朱莉之间的角度大约是7度。

我想知道这些数字是否正确但是我们需要将它们“正常化”到“观察者恐龙”面临的方向吗?我想要的“恐龙之间的角度”与相应的恐龙有关。

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

1 个答案:

答案 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