2013-07-08 36 views
5

Điều này có thể đã được trả lời trước đó, xin lỗi nếu có. Tôi về cơ bản cần phải có được góc từ gốc đến điểm. Vì vậy, giả sử Xuất xứ là (0, 0)điểm mục tiêu của chúng tôi là (3, 0).Nhận góc giữa điểm và nguồn gốc

3 O'clock = 90 độ

6 O'clock = 180 độ

9 O'clock = 270 độ

12 O'clock = 0 độ


Bằng cách nào đó, tôi phải làm một số phép thuật toán học, và tìm ra rằng góc là 90 độ (Top là 0). Nguồn gốc có thể khác nhau, vì vậy tôi cần một phương pháp có hai tham số, Nguồn gốc và TargetPoint, trả về góc kép ở Độ.

Yea, tôi nhận thấy điều này có vẻ ngắn và không có cấu trúc, nhưng tôi đã làm cho câu hỏi đơn giản và dễ hiểu nhất có thể. Tất cả các câu hỏi khác đều đóng cửa -.-

Cảm ơn

+3

Góc là giữa hai dòng ... không phải hai điểm, trừ khi bạn đang nói về góc của một đường so sánh để nói, bản thân thế giới? Ngoài ra ... là điều này cho một bài tập về nhà? – LightStriker

+0

Không, tôi cần góc giữa điểm gốc và điểm. Hãy nghĩ về nó như một chiếc đồng hồ, 3 giờ là 90 độ về nguồn gốc (giữa). Không, tôi đang làm một trò chơi. – Dave

+1

@LightStriker Tại sao mọi người gặp nhiều khó khăn khi hiểu câu hỏi này? Trong số ** KHÓA HỌC ** bạn không thể _technically_ có một góc giữa hai điểm, nhưng tại sao thật khó để hiểu rằng rất nhiều lập trình viên đã không được dạy điều này? Tất cả họ biết là họ 0 độ là lên và họ cần phải tìm một góc mà sẽ làm cho một điểm sprite tại sprite khác. Hầu hết các lập trình viên hỏi câu hỏi này đơn giản là không có nền toán để nắm bắt khái niệm cần ba điểm (hoặc hai dòng, nếu bạn thích) cho một góc. [/ rant] – Clonkex

Trả lời

11

Các vector giữa hai điểm A và B là B-A = (B.x-A.x, B.y-A.y). Góc giữa hai vec-tơ có thể được tính bằng dot product hoặc atan2.

var vector2 = Target - Origin; 
var vector1 = new Point(0, 1) // 12 o'clock == 0°, assuming that y goes from bottom to top 

double angleInRadians = Math.Atan2(vector2.Y, vector2.X) - Math.Atan2(vector1.Y, vector1.X); 

Xem thêm Finding Signed Angle Between Vectors

+1

Vì vậy: 'Math.Atan2 (Origin.Y - Target.Y, Origin.X - Target.X);'? Và đây là Radian, phải không? – Dave

+0

@ user2544245: Bạn cần ** hai ** vectơ. Vectơ thứ hai trỏ vào hướng mà bạn muốn biểu thị 0 °. Theo chiều kim đồng hồ, vâng. Công thức của bạn là sai, mặc dù. –

+0

Trong công thức của bạn, có vấn đề gì là nguồn gốc và mục tiêu nào? – Dave

1

Giả sử x là tích cực, một cái gì đó như thế này:

angle = Math.Atan(y/x) * 180/Math.PI + 90 

Edited để cho phép âm x giá trị:

Nếu nó có thể là tiêu cực, chỉ cần làm theo từng trường hợp. Một cái gì đó như thế này:

if (x < 0) { 
    angle = 270 - (Math.Atan(y/-x) * 180/Math.PI); 
} else { 
    angle = 90 + (Math.Atan(y/x) * 180/Math.PI); 
} 
+0

X và Y có thể dương hoặc âm. – Dave

+2

Đừng bỏ phiếu cho anh ta, anh ấy chỉ đang cố gắng giúp đỡ. – Dave

0
public static double GetAngleDegree(Point origin, Point target) { 
    var n = 270 - (Math.Atan2(origin.Y - target.Y, origin.X - target.X)) * 180/Math.PI; 
    return n % 360; 
} 

static void Main(string[] args) 
{ 
    Console.WriteLine(GetAngleDegree(new Point(0, 0), new Point(0, 3)));//0 
    Console.WriteLine(GetAngleDegree(new Point(0, 0), new Point(3, 0)));//90 
    Console.WriteLine(GetAngleDegree(new Point(0, 0), new Point(0, -3)));//180 
    Console.WriteLine(GetAngleDegree(new Point(0, 0), new Point(-3, 0)));//270 
} 
+1

Điều này có vẻ như nó sẽ CounterClockwise, với ** (0, 3) ** là 0 độ. – Dave

+0

Đây là giải pháp hoàn hảo để phân loại các điểm theo góc. –

0

Trên thực tế không có cách nào để tìm hiểu góc giữa điểm và nguồn gốc do thực tế rằng nguồn gốc là (0,0). Chúng ta có thể tính toán góc giữa 2 điểm beacuse chúng được xử lý như vectơ và như vậy chúng có hướng, nhưng gốc không có hướng. Vì lý do đó, nếu bạn muốn tìm góc bằng cách sử dụng ví dụ của đồng hồ, bạn có thể tính toán góc giữa điểm và (1,0) ví dụ như điểm đó ở 0 độ.

Tôi xin lỗi tôi không thành thạo trong C# nhưng bạn có thể có một cái nhìn tại mã này java mà là tương tự:

double getAngle2PointsRad(double p1_x, double p1_y, double p2_x, double p2_y) { 
    return Math.acos((((p1_x * p2_x) + (p1_y * p2_y))/(Math.sqrt(Math.pow(p1_x, 2) + Math.pow(p1_y, 2)) * Math.sqrt(Math.pow(p2_x, 2) + Math.pow(p2_y, 2))))); 
} 

double getAngle2PointsDeg(double p1_x, double p1_y, double p2_x, double p2_y) { 
    return Math.acos((((p1_x * p2_x) + (p1_y * p2_y))/(Math.sqrt(Math.pow(p1_x, 2) + Math.pow(p1_y, 2)) * Math.sqrt(Math.pow(p2_x, 2) + Math.pow(p2_y, 2))))) * 180/Math.PI; 
} 

Nếu bạn cố gắng tính toán sử dụng (0,0), bạn sẽ nhận được NaN beacuse nó cố gắng chia cho số không.

Các vấn đề liên quan