2012-12-31 51 views
58

,因为我没有任何这样的数学......我编程的2D游戏,走动球员它已经10年圆的交点。当我移动玩家时,我试图计算距离玩家位置200个像素圆上的点,给定-360到360之间的正或负角度(度)。屏幕为1280x720,0.0为中心点的屏幕。玩家在整个笛卡尔坐标系中移动。我试图找到的观点可能会脱离屏幕。查找与给定的中心点,半径和程度

我试过Find the point with radius and angle文章的公式,但我不相信我理解什么是“角度”,因为当我将角度从-360变为360时,我得到了奇怪的结果,成为Cos(角度)或Sin(角度)。

所以,比如我有...

  • 1280×720笛卡尔平面
  • 中心点(玩家的位置):
    • 让最小值之间X =一个数字 - 640〜640最大
    • 让Y =到最大360
  • 最小-360之间的数
  • 玩家周围的半径:让r总是= 200
  • 角度:让a = -360到360之间给定的数字(允许负向指向下或正向指向上,所以-10和350会给出相同的答案)

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

什么是上一圈返回Y中的公式?

enter image description here enter image description here

+5

这是一个很好的问题! +1 – FrostyFire

+0

问题:大多数游戏中没有左上角的坐标是0,0吗? y轴向下,不起来? – Persijn

回答

44

您链接的简单方程式给出圆圈上的点的X和Y坐标相对于圆心的中心。

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

这告诉你距离圆心的距离有多远。既然你有中心(CX,CY)的坐标,只需算出偏移。

在圆上的点的坐标是:

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

我的困惑首先在于ANGLE和DEGREE的区别。我认为他们是同样的事情。然后我以为我得到了飞机上的点(x,y),但我实际上已经获得了x和y两侧的长度。我把它绘制在纸上,然后用excel覆盖它以覆盖度数范围以检查公式。它现在在我的代码中工作。 –

+1

不应'X = xcircle +(R *正弦(角度))''是X = xcircle +(R *余弦(角度))'(反之为'Y'反之亦然)? – txtechhelp

+0

@txtechhelp是的。不知何故,我错过了它,没有人注意到3年多。此外,考虑到问题中轴的编号和角度的顺时针测量,y偏移量应该可能从中心坐标中减去,而不是加上。 **编辑**:重新阅读问题(再次)后,我认为我的第二次更正是不正确的。 – yoozer8

6

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

但是,既然你提到测量-360方面你的角度到360,你可能正在使用不正确的单位为你的数学库。三角函数的大部分实现都使用弧度来输入。如果你使用度数而不是...你的答案会是奇怪的错误。

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

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

+1

这应该是一个评论,而不是一个答案。然而,很好的抓住弧度与度数。 – yoozer8

+0

你说得对,我应该回答这个家伙的问题。 –

+0

僵尸帖子问题:在parens中,是(deg *(pi/180))'还是'((deg * pi)/ 180)'?还要感谢指定rad与deg之间的差异。 – monsto

4

我得到奇怪的结果时,我通过角度为-360至360成的Cos(角度)或SIN(角度)。

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

+0

我想通角度和程度很可能是不一样的事情,所以我是纠正说角= M_PI * d/180.0,其中d可以是数字,从360到360或者我需要一个步骤? –

+1

@Kyle'D'是从'0'到'360'或从'-180'到'180'(一个完整的圆),而不是从'-360'到'360'(两个完整的圆圈)。 – dasblinkenlight

+0

谢谢我把它映射到Excel中。现在我更接近了。 –

6

我强烈建议使用这种类型的操作矩阵。这是最通用的方法,见下面的例子:

// 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轴
2

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

  • 运动 - 顺时针
  • 点 - 每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是度数。

0

答案应该完全相反。

X = XC + RSIN(角度)

Y = YC + RCOS(角度)

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

0

推荐:

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

相关问题