2009-03-23 33 views
35

Tôi tưởng tượng rằng đây là một câu hỏi đơn giản, nhưng tôi nhận được một số kết quả lạ với mã hiện tại của mình và tôi không có nền tảng toán học để hiểu đầy đủ lý do tại sao. Mục tiêu của tôi là đơn giản, như đã nêu trong tiêu đề: Tôi chỉ muốn tìm điểm ở một khoảng cách và góc nào đó từ một điểm trung tâm.Tính điểm trên chu vi vòng tròn từ góc trong C#?

mã hiện tại của tôi:

Point centerPoint = new Point (0, 0); 
Point result  = new Point (0, 0); 
double angle  = 0.5; //between 0 and 2 * PI, angle is in radians 
int distance  = 1000; 

result.Y = centerPoint.Y + (int)Math.Round(distance * Math.Sin(angle)); 
result.X = centerPoint.X + (int)Math.Round(distance * Math.Cos(angle)); 

Nói chung, điều này dường như làm việc khá hợp lý, nhưng tôi nhận được vấn đề tại các điểm khác nhau, đáng chú ý nhất khi góc tương ứng với điểm trong x tiêu cực và trục y. Rõ ràng là tôi đang làm điều gì đó sai - suy nghĩ về điều đó là gì?

CẬP NHẬT: Đây là lỗi của tôi, mã này hoạt động tốt - một vài ngoại lệ không hoạt động thực sự là do lỗi trong cách tính 1,5PI. Tôi nghĩ rằng tôi đã kiểm tra đủ tốt, nhưng rõ ràng là không. Nhờ tất cả mọi người vì thời gian của họ, hy vọng mã làm việc ở trên sẽ chứng tỏ hữu ích cho người khác.

+0

Ý anh là gì "tôi nhận được vấn đề tại các điểm khác nhau"? –

+0

là centerPoint cố ý không sử dụng? Không nên centerPoint.X và .Y được thêm vào kết quả? – spender

+0

bạn có thể cung cấp ví dụ về sự cố không? –

Trả lời

29

Bạn quên thêm điểm trung tâm:

result.Y = (int)Math.Round(centerPoint.Y + distance * Math.Sin(angle)); 
result.X = (int)Math.Round(centerPoint.X + distance * Math.Cos(angle)); 

Phần còn lại sẽ ok ... (những gì kết quả kỳ lạ được bạn nhận được bạn có thể cho một đầu vào chính xác?)

+0

Ah, đây là một điểm tốt về điểm trung tâm - nó không được sử dụng trong trường hợp này. Điểm cụ thể mà tôi đang làm việc với hiện tại là với một điểm trung tâm là 0,0, vì vậy nó không liên quan trong trường hợp đó, nhưng trong các trường hợp khác, nó chắc chắn sẽ tạo ra sự khác biệt. Tôi đã cập nhật ví dụ để bao gồm nó một cách chính xác. – x4000

6

Thứ nhất, vì bạn đang ở trong radian nó có thể mang lại lợi ích để xác định góc độ của bạn như vậy:

double angle = (Math.PI/3); // 60 degrees... 

Các chức năng bản thân đang làm việc tốt. Làm tròn sẽ chỉ ảnh hưởng đến câu trả lời của bạn nếu khoảng cách của bạn đủ nhỏ. Khác hơn thế, câu trả lời sẽ xuất hiện tốt.

Nếu nó làm tròn bạn đang lo lắng về, hãy nhớ rằng theo mặc định, NET không banker's rounding, và bạn có thể muốn:

result.X = (int)Math.Round(centerPoint.X + distance * Math.Cos(angle), MidpointRounding.AwayFromZero); 
result.Y = (int)Math.Round(centerPoint.Y + distance * Math.Sin(angle), MidpointRounding.AwayFromZero); 

để thay thế.

Ngoài ra, trong câu hỏi bạn muốn khoảng cách X và góc Y ... Tôi cho rằng bạn không liên quan đến điểm (X,Y), bởi vì điều đó hoàn toàn khác.

Công thức khoảng cách là:

double distance = Math.Sqrt((centerPoint.X + result.X)^2 + (centerPoint.Y + result.Y)^2); 
+0

John, Cảm ơn vì cá. Tôi đã vui mừng không biết rằng C# đã làm tròn tính toán đôi chút, hãy để một mình hết sức (IMHO). – corlettk

1

Nếu không có thêm thông tin về lỗi chính xác, thật khó để nói điều gì sai. Các phương trình nhìn đúng và nên hoạt động. Bạn có chắc chắn các góc bạn đang đi vào là chính xác cho các góc> 90 độ? Điều duy nhất tôi có thể nghĩ đến là bạn nhân khoảng cách (một int) với kết quả của Math.sin (double) nhưng điều đó không thực sự là một vấn đề.

+0

Bạn hoàn toàn đúng, đầu vào góc đã thực sự tắt. – x4000

0

Tôi không biết C#, dù sao nếu bạn đang cố gắng để vẽ các điểm ở đâu đó bạn phải xem xét thực tế là trục Y nhăn từ trên xuống dưới cùng của màn hình, vì vậy tội yếu tố bạn nên có là -sin (...) và không phải + sin (...)

nên

result.Y = centerPoint.Y + (int)Math.Round(distance * Math.Sin(angle)); 

nên trở thành:

result.Y = centerPoint.Y - (int)Math.Round(distance * Math.Sin(angle)); 

Nếu bạn không cố gắng để vẽ chúng tôi không thể tưởng tượng ra vấn đề là gì, bạn có thể đưa ra một số ví dụ?

+0

result.Y nên sử dụng cos không sin kiểm tra liên kết này http://www.webdeveloper.com/forum/showthread.php?t=190439 – RVN

1
-(NSMutableArray *)GetPointsForCircle 
    { 
     NSMutableArray *Points = [[NSMutableArray alloc] init]; 
     CGPoint CenterPoint = CGPointMake(160, 230); 
     CGPoint Point; 
     for (float Angel = 0; Angel <= 360; Angel+= 60) 
     { 
      Point.x = CenterPoint.x + 100 * cos(Angel); 
      Point.y = CenterPoint.y + 100 * sin(Angel); 
      [Points addObject:[NSValue valueWithCGPoint:Point]]; 
     } 
     return Points; 
    } 

    - (CGPoint)pointOnCircle:(int)thisPoint withTotalPointCount:(int)totalPoints 
    { 
        CGPoint centerPoint = CGPointMake(self.view.frame.size.width/2, self.view.frame.size.height/2); 
        float radius = 100.0; 
        float angle = (2 * M_PI/(float)totalPoints) * (float)thisPoint; 
        CGPoint newPoint; 
     newPoint.x = (centerPoint.x) + (radius * cosf(angle)); 
     newPoint.y = (centerPoint.y) + (radius * sinf(angle)); 
        return newPoint;   
    } 
+0

Trả về 6 điểm cho một vòng tròn bán kính 100. Phương trình tham số cho một vòng tròn là x = cx + r * cos (a) y = cy + r * sin (a) Trong đó r là bán kính, cx, cy xuất xứ và góc từ 0..2PI radian hoặc 0..360 độ . – Waseem

2

phiên bản A Swift3

func pointOnCircle(radius: Double, angleInDegrees: Double, origin: CGPoint) -> CGPoint { 
    let x = abs(Double(origin.x) + radius * cos(angleInDegrees * (.pi/180))) 
    let y = abs(Double(origin.y) - radius * sin(angleInDegrees * (.pi/180))) 

    return CGPoint(x: x, y: y) 
} 
Các vấn đề liên quan