在给定中心点,半径和程度的圆上找出点

我做了这样的math已经有10年了…我正在用2D编程一个游戏,并且把玩家移动到周围。 当我移动玩家时,我正试图计算距离玩家位置200个像素圆上的点,在-360到360之间给出正的或负的angular度(度)。屏幕是1280×720,0.0是中心点的屏幕。 玩家在整个笛卡尔坐标系中移动。 我试图find的一点可能是在屏幕外。

我尝试了文章上的公式find半径和angular度的点,但我不相信我理解什么“angular度”是因为我越来越奇怪的结果,当我通过angular度为-360到360成为angular(COS)或罪(angular度)。

所以,例如,我有…

  • 1280×720在笛卡尔飞机上
  • 中心点(球员的位置):
    • 令x =最小-640到最大640之间的数字
    • 令y =最小-360到最大360之间的数字
  • 玩家周围的半径:让r总是= 200
  • angular度:让a = -360到360之间的数字(允许负向指向下或正向指向上,所以-10和350会给出相同的答案)

在圆上返回X的公式是什么?

在圆上返回Y的公式是什么?

在这里输入图像说明在这里输入图像说明

你已经链接的简单方程式给圆上点的X和Y坐标相对于的中心

X = r * cosine(angle) Y = r * sine(angle) 

这告诉你这个点离圆心有多远。 既然你有中心的坐标(Cx,Cy),只需要添加计算出的偏移量即可。

圆上点的坐标是:

 X = Cx + (r * cosine(angle)) Y = Cy + (r * sine(angle)) 

你应该发布你正在使用的代码。 这将有助于确切地确定问题。

但是,由于您提到用-360到360度量angular度,您可能使用了math库的不正确单位。 三angular函数的大部分实现都使用弧度来input。 如果你使用度数而不是…你的答案将是奇怪的错误。

 x_oncircle = x_origin + 200 * cos (degrees * pi / 180) y_oncircle = y_origin + 200 * sin (degrees * pi / 180) 

请注意,您可能还会遇到象限不符合您期望的情况。 这可以通过仔细select零点的位置来确定,或者手动检查您所期望的象限,并将自己的符号应用于结果值。

我强烈build议使用这种types的操作matrix。 这是最通用的方法,请参阅下面的示例:

 // The center point of rotation var centerPoint = new Point(0, 0); // Factory method creating the matrix var matrix = new RotateTransform(angleInDegrees, centerPoint.X, centerPoint.Y).Value; // The point to rotate var point = new Point(100, 0); // Applying the transform that results in a rotated point Point rotated = Point.Multiply(point, matrix); 
  • 侧面说明,惯例是以逆时针方向开始测量(正)X轴的angular度

当我将angular度从-360变为360成Cos(angular度)或Sin(angular度)时,我会得到奇怪的结果。

我认为你的尝试不起作用的原因是你以度数传递angular度。 sincos三angular函数期望用弧度表示的angular度,所以数字应该是从02*M_PI 。 对于d度,你传递M_PI*d/180.0M_PI是在math.h头文件中定义的常量。

我也需要这个来形成代码中的时钟之手的运动。 我尝试了几个公式,但他们没有工作,所以这就是我想到的:

  • 运动 – 顺时针
  • 点 – 每6度(因为360度除以60 minuites是6度)
  • 手长 – 65像素
  • 中心 – x = 75,y = 75

所以公式会是

 x=Cx+(r*cos(d/(180/PI)) y=Cy+(r*sin(d/(180/PI)) 

其中x和y是圆周上的点,Cx和Cy是中心的x,y坐标,r是半径,d是度数。

答案应该完全相反。

X = Xc + rSin(angular度)

Y = Yc + rCos(angular度)

其中Xc和Yc是圆的中心坐标,r是半径。

推荐:

  public static Vector3 RotatePointAroundPivot(Vector3 point, Vector3 pivot, Vector3 angles) { return Quaternion.Euler(angles) * (point - pivot) + pivot; }