如何计算圆的圆周上的点?


Answers:


593

一个圆的参数方程

x = cx + r * cos(a)
y = cy + r * sin(a)

[R为半径,CX,CY的起源,和一个角度。

通过基本的Trig函数,很容易适应任何语言。请注意,大多数语言在Trig函数中都将弧度用作角度,因此,不是循环0..360度,而是循环0..2PI弧度。


107
请注意,a必须以弧度为单位-对于初学者来说,这真的很难理解。
ioan 2013年

13
我一直在试图推导这个方程一个小时。谢谢。谁知道您在高中学习到的三角身份会很有帮助。
Isioma Nnodum

1
@Dean由于运算符优先级,因此不需要多余的括号。当你+*喜欢在这两个公式,没有任何括号你老去的*,然后再为+
rbaleksandar

13
@IsiomaNnodum如果我们都回到这里只是想记住方程式的话,那可能没有那么大的帮助。
b1nary.atr0phy,2016年

48

这是我在C#中的实现:

    public static PointF PointOnCircle(float radius, float angleInDegrees, PointF origin)
    {
        // Convert from degrees to radians via multiplication by PI/180        
        float x = (float)(radius * Math.Cos(angleInDegrees * Math.PI / 180F)) + origin.X;
        float y = (float)(radius * Math.Sin(angleInDegrees * Math.PI / 180F)) + origin.Y;

        return new PointF(x, y);
    }

5
预先计算转换系数,因此使用硬编码数字输入转换错误的机会较小。
Scottie T

15

当您有复数时,谁需要触发:

#include <complex.h>
#include <math.h>

#define PI      3.14159265358979323846

typedef complex double Point;

Point point_on_circle ( double radius, double angle_in_degrees, Point centre )
{
    return centre + radius * cexp ( PI * I * ( angle_in_degrees  / 180.0 ) );
}

这是如何运作的?如何比较速度?为什么不更常用呢?
马克·A·罗珀

@ MarkA.Ropper复数如何工作?-查找数学教程,或者如果您已经知道复数是什么,请访问en.wikipedia.org/wiki/Euler%27s_identity。与说实现sin作为查询表相比,它的速度可能不那么高效,但是有时您会使用复数来表示各个点以利用它们的其他属性。与使用四元数进行3D旋转类似,这实际上不是速度,而是它们为您提供的功能。
皮特·柯坎

2

JavaScript(ES6)中实现

/**
    * Calculate x and y in circle's circumference
    * @param {Object} input - The input parameters
    * @param {number} input.radius - The circle's radius
    * @param {number} input.angle - The angle in degrees
    * @param {number} input.cx - The circle's origin x
    * @param {number} input.cy - The circle's origin y
    * @returns {Array[number,number]} The calculated x and y
*/
function pointsOnCircle({ radius, angle, cx, cy }){

    angle = angle * ( Math.PI / 180 ); // Convert from Degrees to Radians
    const x = cx + radius * Math.cos(angle);
    const y = cy + radius * Math.sin(angle);
    return [ x, y ];

}

用法:

const [ x, y ] = pointsOnCircle({ radius: 100, angle: 180, cx: 150, cy: 150 });
console.log( x, y );

码笔

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.