2009-05-08 8 views
185

Làm cách nào để thực hiện chức năng sau bằng nhiều ngôn ngữ?Làm cách nào để tính điểm trên chu vi vòng tròn?

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

  • Radius
  • Góc
  • xứ (tham số tùy chọn, nếu bằng ngôn ngữ được hỗ trợ)
+2

Không chắc, @Binary, kể từ khi ông đăng một câu trả lời. Đây là một trong những câu hỏi tự trả lời (được cho phép, theo thông tin từ những người kiểm duyệt trước đó). Nhưng cho nó đã được trả lời trong http://stackoverflow.com/questions/674225/calculating-point-on-a-circles-circumference-from-angle-in-c, nó có lẽ là tốt nhất đóng cửa như là một dupe. Các ngôn ngữ làm điều này sẽ không khác biệt. – paxdiablo

+21

Tôi vừa đăng nhập để nói điều này: thưa bạn (Rook) là một Jerk. Không phải ai cũng có cùng trình độ học vấn như bạn nhưng vẫn có thể viết mã, vì vậy không có điều này không phải là một câu hỏi golf nhỏ. Xấu hổ về bạn. – Braineeee

Trả lời

468

Các parametric equation for a circle

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

đâu r là bán kính, cx, cy nguồn gốc, và một góc.

Khá dễ dàng để thích ứng với bất kỳ ngôn ngữ nào 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 radians cho góc trong các chức năng trig, vì vậy thay vì đạp xe qua 0,360 độ, bạn đang đi xe đạp qua radi 0..2PI.

+74

Lưu ý rằng 'a' phải bằng radian - điều đó thực sự khó cho tôi khi mới bắt đầu hiểu. – ioanb7

+8

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

+1

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

43

Đâ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 để có ít cơ hội bạn nhập sai chuyển đổi bằng cách sử dụng các số được mã hóa cứng. –

16

Ai cần trang điểm khi bạn có complex numbers:

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

Tính năng này hoạt động như thế nào? 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? –

+0

@ MarkA.Ropper cách số phức làm việc? - tra cứu một hướng dẫn về toán học hoặc truy cập https://en.wikipedia.org/wiki/Euler%27s_identity nếu bạn đã biế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 diễn các điểm trong suốt để khai thác các thuộc tính khác của chúng. Tương tự như sử dụng quaternions cho quay 3D, nó không thực sự là tốc độ nhưng khả năng mà họ cung cấp cho bạn. –