如何从两个坐标计算角度?

我正在开发一个基于3D的对象的项目,并通过我的程序操作它们。 我目前有一个文本框,允许我放置一个度数的标题和一个按钮,它将计算所需的值,使我的主要对象改变其标题。 这是该函数的代码:

private void btnSetHeading_Click(object sender, EventArgs e) { if (this.textBoxHeading.Text.Length == 0) return; float heading = (float)0; try { heading = float.Parse(this.textBoxHeading.Text); } catch (FormatException ex) { MessageBox.Show(ex.Message); return; } if (heading  (float)360) { MessageBox.Show("Invalid heading parameter. Acceptable range: 0 - 360"); return; } float tempCosine = (float)Math.Cos(((heading * Math.PI) / (float)360.0)); float tempSine = -((float)Math.Sin(((heading * Math.PI) / (float)360.0))); try { ProgramInterop.CreateInstance.SetHeading(tempCosine, tempSine); } catch (Exception ex) { MessageBox.Show("Caught: " + ex.Message); } } 

如果我提供90作为面向的标题,结果是tempCosine = 0.7071068和tempSine = -0.7071068,然后使我的主要对象面向90度或正东。

该程序要求标题以两个单独的值(tempCosine和tempSine)给出,我不熟悉几何,足以理解为什么我会乘以360而不是180,但这就是它需要工作的方式。

现在我的项目的下一部分涉及使我的主对象面对另一个对象给出它们的(x,y)坐标。 例如,如果我的主要对象位于(9112.94,22088.74)并且我要面对的新对象位于(9127.04,22088.88),那么它将需要几乎正好90度的标题使其面向新对象。

如何从这两个坐标计算tempCosine和tempSine?

关于180,这是真的。 我习惯了这样的扩展类来处理弧度和度数。

 public static class Extension { public static double ToRadians(this double degree) { return degree * Math.PI / 180; } public static double ToDegrees(this double val) { return val * 180 / Math.PI; } } 

关于正弦和余弦(我不确定我理解正确的事情)但是如果我使用下面的代码

 float x1 = 9112.94f; float y1 = 22088.74f; float x2 = 9127.04f; float y2 = 22088.88f; float r = (float) Math.Pow((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1), 0.5); float cosine = (x2 - x1) /r; float sine = (y2 - y1) /r; 

我将得到角度0.5712978(不等于90)。

对不起,如果我误解了这个问题。

我能够使用Dani建议使用Atan2(y,x)来解决问题。 谢谢Dani。

 float x1 = 9112.94f; float y1 = 22088.74f; float x2 = 9127.04f; float y2 = 22088.88f; float angleRadians; float diffX = x2 - x1; float diffY = y2 - y1; float atan2Result = (float)Math.Atan2(diffX, diffY); angleRadians = atan2Result / 2; if (angleRadians < 0.0f) angleRadians += (float)Math.PI; float tempCosine = (float)Math.Cos(angleRadians); float tempSine = -((float)Math.Sin(angleRadians));