gpt4 book ai didi

c# - 角度theta计算错误

转载 作者:行者123 更新时间:2023-11-30 17:03:02 26 4
gpt4 key购买 nike

此问题/错误与此 Angle Measurer in C# 直接相关.问题似乎是角度大于 180 时 theta 是错误的(我以度为单位,而不是弧度)。

这是一个有用的屏幕截图。这张照片代表了三只恐龙的俯 View 。恐龙的 body 是灰色的。头部是一个白点。每只恐龙的“视角”(并非所有物种都相同)是蓝线。

enter image description here

如您所见,每只恐龙的面孔都是正确的。 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 米处的点沿其轴线的投影是正确的:

enter image description here

最后更改后的屏幕截图:

enter image description here

这是“我对‘恐龙角’的定义”以及我所期望的:

  • Muffie 几乎面向东方(108 度)。约翰几乎就在她身后,偏左一点。我预计 Muffie 和 John 之间的角度约为 195 度。
  • Julie 面向西南(235 度)。约翰几乎就在朱莉的右边。我预计朱莉和约翰之间的角度约为 87 度。
  • John 几乎直视着 Julie(Julie 在“迎面”的右边)。我预计约翰和朱莉之间的角度约为 7 度。

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

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

最佳答案

问题是 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

关于c# - 角度theta计算错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19069577/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com