首页 文章

找到具有给定中心点,半径和度数的圆上的点

提问于
浏览
68

自从我做了这样的数学运算已经10年了......我正在编写2D游戏并移动玩家 . 当我移动玩家时,我试图计算距离玩家位置200像素的圆上的点,给出-360到360之间的正OR负角度(度) . 屏幕是1280x720,其中0,0是中心点的屏幕 . 玩家在整个笛卡尔坐标系中移动 . 我试图找到的重点可能是屏幕外的 .

我尝试了文章Find the point with radius and angle上的公式,但我不相信我理解"Angle"是什么,因为当我将角度-360到360传递到Cos(角度)或Sin(角度)时,我得到了奇怪的结果 .

So for example I have...

笛卡尔平面上的

  • 1280x720

  • 中心点(玩家的位置):

  • let x =最小-640到最大640之间的数字

  • 设y =最小-360到最大360之间的数字

  • 玩家周围的圆圈半径:让r总是= 200

  • 角度:设a = -360到360之间给出的数字(允许负向下指向或正向向上指向,因此-10和350会给出相同的答案)

What is the formula to return X on the circle?

What is the formula to return Y on the circle?

enter image description here

enter image description here

8 回答

  • 10

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

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

    这会告诉您该点距离圆心的距离有多远 . 由于您具有中心坐标(Cx,Cy),只需添加计算的偏移量即可 .

    圆上的点的坐标是:

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

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

    但是,由于您提到使用-360到360来测量角度,因此您可能正在使用数学库中不正确的单位 . 大多数三角函数的实现使用弧度作为输入 . 如果你使用学位代替......你的答案将是奇怪的错误 .

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

    请注意,您可能还会遇到象限不是您所期望的情况 . 这可以通过仔细选择角度零的位置来修复,或者通过手动检查您期望的象限并将自己的符号应用于结果值来解决 .

  • 0

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

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

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

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

  • 3

    我还需要这个来在代码中形成时钟指针的运动 . 我尝试了几个公式,但它们没有用,所以这就是我提出的:

    • 运动 - 顺时针

    • 点 - 每6度(因为360度除以60度)是6度

    • 手长 - 65像素

    • center - 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是度数 .

  • 4

    这是c#实现 . 该方法将返回以 radiuscenterangle interval 为参数的循环点 . 角度以Radian形式传递 .

    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

    答案应该恰恰相反 .

    X = Xc rSin(角度)

    Y = Yc rCos(角度)

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

  • 0

    推荐:

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

相关问题