Làm cách nào để tính điểm trên chu vi của vòng tròn?


223

Làm thế nào các chức năng sau đây có thể được thực hiện trong các ngôn ngữ khác nhau?

Tính (x,y)điểm trên chu vi của một vòng tròn, cho các giá trị đầu vào của:

  • Bán kính
  • Góc
  • Nguồn gốc (tham số tùy chọn, nếu được hỗ trợ bởi ngôn ngữ)

Câu trả lời:


593

Các phương trình tham số cho một vòng tròn

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

Trong trường hợp r là bán kính, cx, cy nguồn gốc, và một góc.

Điều đó khá dễ dàng để thích nghi với bất kỳ ngôn ngữ nào với các chức năng cơ bản. Lưu ý rằng hầu hết các ngôn ngữ sẽ sử dụng radian cho góc trong các hàm trig, thay vì đi xe đạp qua 0..360 độ, bạn đang đạp xe qua radian 0..2PI.


107
Lưu ý rằng aphải bằng radian - điều đó thực sự khó đối với tôi khi mới bắt đầu hiểu.
ioan

13
Tôi đã cố gắng rút ra phương trình này trong một giờ. Cảm ơn. Ai biết được danh tính trig bạn đã học ở trường trung học sẽ rất hữu ích.
Isioma Nnodum

1
@Dean Không cần thêm dấu ngoặc vì ưu tiên toán tử. Khi bạn có +*thích trong hai phương trình đó và không có bất kỳ dấu ngoặc nào, bạn luôn luôn đi *đầu tiên và sau đó cho +.
rbaleksandar

13
@IsiomaNnodum Không thể hữu ích nếu tất cả chúng ta quay lại đây chỉ để nhớ phương trình là gì.
b1nary.atr0phy

48

Đây là triển khai của tôi trong 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
Tính toán trước hệ số chuyển đổi để ít có khả năng bạn nhập sai chuyển đổi bằng cách sử dụng các số được mã hóa cứng.
Scottie T

15

Ai cần trig khi bạn có số phức :

#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 ) );
}

Cái này hoạt động ra sao? Làm thế nào để nó so sánh tốc độ khôn ngoan? Tại sao điều này không được sử dụng phổ biến hơn?
Đánh dấu A. Ropper

@ MarkA.Ropper làm thế nào để số phức làm việc? - tra cứu một hướng dẫn toán học hoặc đi từ en.wikipedia.org/wiki/Euler%27s_identity nếu bạn đã biết một số phức là gì. Nó có thể không hiệu quả về tốc độ so với việc thực hiện tội lỗi như một bảng tra cứu, nhưng đôi khi bạn đang sử dụng các số phức để biểu thị các điểm xuyên suốt để khai thác các thuộc tính khác của chúng. Tương tự như việc sử dụng bậc bốn cho phép quay 3D, nó không thực sự là tốc độ mà là khả năng mà chúng mang lại cho bạn.
Pete Kirkham

2

Được triển khai trong 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 ];

}

Sử dụng:

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

Codepen

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.