ChatGPT解决这个技术问题 Extra ChatGPT

在给定中心点、半径和度数的圆上找到点

自从我做这样的数学运算以来已经 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

这是一个很好的问题!!! +1
问题:大多数游戏的左上角不是有坐标到 0,0 吗? y轴下降,而不是上升?
对于通过搜索找到此内容的任何人:它因游戏引擎而异。不仅如此,在某些引擎中,Y 向上,而在其他引擎中,Z 向上。

y
yoozer8

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

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

这告诉您该点偏离圆心的距离。由于您有中心的坐标(Cx,Cy),因此只需添加计算出的偏移量。

圆上点的坐标为:

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

我的困惑首先是角度和度数之间的区别。我以为他们是一样的。然后我以为我得到了平面上的点 (x,y),但实际上我得到了 x 和 y 边的长度。我把它画在纸上,然后把它放在 Excel 中以涵盖度数范围以检查公式。它现在可以在我的代码中使用。
X = xcircle + (r * sine(angle)) 不应该是 X = xcircle + (r * cosine(angle))(反之亦然 Y)?
请注意,角度应该是以弧度为单位的值!
S
Seth Battin

您应该发布您正在使用的代码。这将有助于准确识别问题。

但是,由于您提到用 -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 之间的差异。
@monsto 僵尸仍然发送通知。 :)。内部括号无关紧要,因为乘法和除法是可交换的 demonstrations.wolfram.com/…。我长期以来一直因为在我的代码中放置过多的括号而感到内疚。我假装是为了清楚起见,但显然这不是完全正确的,否则你不会被它打扰。
J
Johan Larsson

我强烈建议使用矩阵进行此类操作。这是最通用的方法,请参见下面的示例:

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


C
Chait

我还需要它来形成代码中时钟指针的运动。我尝试了几个公式,但它们都不起作用,所以这就是我想出的:

运动 - 顺时针

积分 - 每 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 确定整个圆。
S
Sergey Kalinichenko

当我将角度作为 -360 到 360 传递给 Cos(角度)或 Sin(角度)时,我得到了奇怪的结果。

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


我认为角度和度数可能不是一回事,所以我说 Angle = M_PI*d/180.0 是否正确,其中 d 可以是 -360 到 360 之间的数字,还是我需要再走一步?
@Kyle d 是从 0360 或从 -180180(一个完整的圆圈),而不是从 -360360(两个完整的圆圈)。
M
MD. Nazmul Kibria

这是c#实现。该方法将返回以 radiuscenterangle 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);

请注意,由于舍入错误,这可能会比预期少返回 1 个项目!因此,我添加了一些maring,以便最终获得正确数量的项目(我的示例有浮点数而不是双精度数); for (float interval = angleInterval; interval < 2 * Math.PI + 0.0000099f; interval += angleInterval)
A
Aditya Aggarwal

答案应该正好相反。

X = Xc + rSin(角度)

Y = Yc + rCos(角度)

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


y
yoozer8

推荐:

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

B
Bhargav Rao

你可以使用这个:

圆方程

(xk)2+(yv)2=R2

其中 k 和 v 是常数,R 是半径


关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅