C# 获取点和原点之间的角度

C# 获取点和原点之间的角度,c#,xna,directx,angle,C#,Xna,Directx,Angle,这个问题以前可能已经得到了回答,如果是的话,很抱歉。 我基本上需要得到从原点到点的角度。 假设原点是(0,0),我的目标点是(3,0) 3点钟=90度 6点钟=180度 9点钟=270度 12点钟=0度 不知怎的,我必须做一些数学魔术,发现角度是90度(顶部是0)。 原点可以变化,所以我需要一个有两个参数的方法,原点和TargetPoint,返回双角度(度) 是的,我意识到这看起来很短而且没有建设性,但是我做了 问题尽可能简单易懂。所有其他 问题已结束-- 谢谢两点A和B之间的向量是B-A=(

这个问题以前可能已经得到了回答,如果是的话,很抱歉。 我基本上需要得到从原点到点的角度。 假设原点是(0,0),我的目标点是(3,0)

3点钟=90度

6点钟=180度

9点钟=270度

12点钟=0度


不知怎的,我必须做一些数学魔术,发现角度是90度(顶部是0)。 原点可以变化,所以我需要一个有两个参数的方法,原点和TargetPoint,返回双角度(度)

是的,我意识到这看起来很短而且没有建设性,但是我做了 问题尽可能简单易懂。所有其他 问题已结束--


谢谢

两点A和B之间的向量是B-A=(B.x-A.x,B.y-A.y)。两个矢量之间的角度可以用or计算


另请参见

假设
x
为正,如下所示:

angle = Math.Atan(y / x) * 180 / Math.PI + 90
编辑以允许负值
x
值:

如果可以是否定的,就按情况来做。大概是这样的:

if (x < 0) {
    angle = 270 - (Math.Atan(y / -x) * 180 / Math.PI);
} else {
    angle = 90 + (Math.Atan(y / x) * 180 / Math.PI);
}
if(x<0){
角度=270-(数学Atan(y/-x)*180/数学PI);
}否则{
角度=90+(数学坐标(y/x)*180/数学坐标i);
}

实际上,由于原点为(0,0),无法确定点与原点之间的角度。我们可以计算两点之间的角度,因为它们被视为向量,因此它们有方向,但原点没有方向。因此,如果您想使用时钟的示例查找角度,您可以计算该点与(1,0)之间的角度,例如0度处的该点

很抱歉,我不精通C语言,但您可以看看类似的java代码:

double getAngle2PointsRad(double p1_x, double p1_y, double p2_x, double p2_y) {
  return Math.acos((((p1_x * p2_x) + (p1_y * p2_y)) / (Math.sqrt(Math.pow(p1_x, 2) + Math.pow(p1_y, 2)) * Math.sqrt(Math.pow(p2_x, 2) + Math.pow(p2_y, 2)))));
}

double getAngle2PointsDeg(double p1_x, double p1_y, double p2_x, double p2_y) {
  return Math.acos((((p1_x * p2_x) + (p1_y * p2_y)) / (Math.sqrt(Math.pow(p1_x, 2) + Math.pow(p1_y, 2)) * Math.sqrt(Math.pow(p2_x, 2) + Math.pow(p2_y, 2))))) * 180 / Math.PI;
}

如果你尝试用(0,0)计算,你会得到NaN,因为它试图除以零。

两条线之间有一个角度。。。不是两点,除非你说的是直线的角度,或者说,世界本身?也。。。这是作业吗?不,我需要原点和点之间的角度。把它想象成一个时钟,3点钟是原点(中心)的90度角。不,我正在做一个游戏。@LightStriker为什么人们在理解这个问题上有这么多困难?当然,从技术上讲,你不可能在两点之间有一个角度,但是为什么很多程序员都没有学过这一点,所以很难理解呢?他们所知道的是他们0度是向上的,他们需要找到一个角度,使一个精灵指向另一个精灵。大多数问这个问题的程序员根本没有数学背景来理解角度需要三个点(或者两条线,如果你愿意的话)的概念。所以:
Math.Atan2(Origin.Y-Target.Y,Origin.X-Target.X)?这是弧度,对吗?@user2544245:你需要两个向量。第二个向量指向要表示0°的方向。顺时针,是的。不过,你的公式是错误的。在你的公式中,哪个是来源,哪个是目标重要吗?@user2544245:你的问题没有意义。你需要两个向量!其中一个来自原点和目标,另一个来自0°向量的方向。另外,如何使用弧度角和长度从原点获取点。或我应该问一个新问题吗?X和Y可以是正的,也可以是负的。这看起来像是逆时针的,(0,3)是0度。
public static double GetAngleDegree(Point origin, Point target) {
    var n = 270 - (Math.Atan2(origin.Y - target.Y, origin.X - target.X)) * 180 / Math.PI;
    return n % 360;
}

static void Main(string[] args)
{
    Console.WriteLine(GetAngleDegree(new Point(0, 0), new Point(0, 3)));//0
    Console.WriteLine(GetAngleDegree(new Point(0, 0), new Point(3, 0)));//90
    Console.WriteLine(GetAngleDegree(new Point(0, 0), new Point(0, -3)));//180
    Console.WriteLine(GetAngleDegree(new Point(0, 0), new Point(-3, 0)));//270 
}
double getAngle2PointsRad(double p1_x, double p1_y, double p2_x, double p2_y) {
  return Math.acos((((p1_x * p2_x) + (p1_y * p2_y)) / (Math.sqrt(Math.pow(p1_x, 2) + Math.pow(p1_y, 2)) * Math.sqrt(Math.pow(p2_x, 2) + Math.pow(p2_y, 2)))));
}

double getAngle2PointsDeg(double p1_x, double p1_y, double p2_x, double p2_y) {
  return Math.acos((((p1_x * p2_x) + (p1_y * p2_y)) / (Math.sqrt(Math.pow(p1_x, 2) + Math.pow(p1_y, 2)) * Math.sqrt(Math.pow(p2_x, 2) + Math.pow(p2_y, 2))))) * 180 / Math.PI;
}