自从我做这样的数学运算以来已经 10 年了……我正在编写 2D 游戏并移动玩家。当我移动玩家时,我试图计算距离玩家位置 200 像素的圆上的点,给定 -360 到 360 之间的正或负角度(度)。屏幕为 1280x720,0,0 为中心点的屏幕。玩家在整个笛卡尔坐标系中移动。我试图找到的点可能不在屏幕上。
我尝试了文章 Find the point with radius and angle 中的公式,但我不相信我理解“角度”是什么,因为当我将角度作为 -360 到 360 传递到 Cos(角度)或 Sin(角度)时,我得到了奇怪的结果。
所以例如我有...
1280x720 在笛卡尔平面上
中心点(玩家的位置):让 x = 最小 -640 到最大 640 之间的数字让 y = 最小 -360 到最大 360 之间的数字
让 x = 最小值 -640 到最大值 640 之间的数字
让 y = 最小值 -360 到最大值 360 之间的数字
玩家周围的圆半径:让 r 始终 = 200
角度:让 a = 一个介于 -360 到 360 之间的数字(允许负数表示向下或正数表示向上,因此 -10 和 350 会给出相同的答案)
在圆上返回 X 的公式是什么?
在圆上返回 Y 的公式是什么?
https://i.stack.imgur.com/OxJkt.gif
链接中的简单方程式给出了圆上点相对于圆心的 X 和 Y 坐标。
X = r * cosine(angle)
Y = r * sine(angle)
这告诉您该点偏离圆心的距离。由于您有中心的坐标(Cx,Cy),因此只需添加计算出的偏移量。
圆上点的坐标为:
X = Cx + (r * cosine(angle))
Y = Cy + (r * sine(angle))
您应该发布您正在使用的代码。这将有助于准确识别问题。
但是,由于您提到用 -360 到 360 来测量角度,因此您的数学库可能使用了不正确的单位。大多数三角函数的实现都使用弧度作为输入。如果你改用度数......你的答案将是奇怪的错误。
x_oncircle = x_origin + 200 * cos (degrees * pi / 180)
y_oncircle = y_origin + 200 * sin (degrees * pi / 180)
请注意,您可能还会遇到象限不是您所期望的情况。这可以通过仔细选择角度零的位置来解决,或者通过手动检查您期望的象限并将您自己的符号应用于结果值来解决。
(deg * (pi / 180))
还是相反的((deg * pi) / 180)
?还要感谢您指定 rad 与 deg 之间的差异。
我强烈建议使用矩阵进行此类操作。这是最通用的方法,请参见下面的示例:
// 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轴
我还需要它来形成代码中时钟指针的运动。我尝试了几个公式,但它们都不起作用,所以这就是我想出的:
运动 - 顺时针
积分 - 每 6 度(因为 360 度除以 60 分钟是 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 是度数。
cos
|sin
确定方向,180
确定整个圆。
当我将角度作为 -360 到 360 传递给 Cos(角度)或 Sin(角度)时,我得到了奇怪的结果。
我认为您的尝试无效的原因是您以度数传递角度。 sin
和 cos
三角函数期望以弧度表示的角度,因此数字应该从 0
到 2*M_PI
。对于 d
度,您通过 M_PI*d/180.0
。 M_PI
是在 math.h
标头中定义的常量。
d
是从 0
到 360
或从 -180
到 180
(一个完整的圆圈),而不是从 -360
到 360
(两个完整的圆圈)。
这是c#实现。该方法将返回以 radius
、center
和 angle interval
作为参数的圆形点。角度以弧度传递。
public static List<PointF> getCircularPoints(double radius, PointF center, double angleInterval)
{
List<PointF> points = new List<PointF>();
for (double interval = angleInterval; interval < 2 * Math.PI; interval += angleInterval)
{
double X = center.X + (radius * Math.Cos(interval));
double Y = center.Y + (radius * Math.Sin(interval));
points.Add(new PointF((float)X, (float)Y));
}
return points;
}
和调用示例:
List<PointF> LEPoints = getCircularPoints(10.0f, new PointF(100.0f, 100.0f), Math.PI / 6.0f);
答案应该正好相反。
X = Xc + rSin(角度)
Y = Yc + rCos(角度)
其中 Xc 和 Yc 是圆的中心坐标,r 是半径。
推荐:
public static Vector3 RotatePointAroundPivot(Vector3 point, Vector3 pivot, Vector3 angles)
{
return Quaternion.Euler(angles) * (point - pivot) + pivot;
}
你可以使用这个:
圆方程
(xk)2+(yv)2=R2
其中 k 和 v 是常数,R 是半径
不定期副业成功案例分享
X = xcircle + (r * sine(angle))
不应该是X = xcircle + (r * cosine(angle))
(反之亦然Y
)?