2012-01-17 40 views
8

Hãy xem ví dụ ở đây: http://www.brianhare.com/physics/so.htmlDescartes đến tọa độ cực

Hãy xem console.log nơi tôi đang sử dụng hai chức năng chính:

function distanceBetween2pts(x1, y1, x2, y2) { 
     console.log("Particle: ("+x1+","+y1+") Mouse: ("+x2+","+y2+")"); 
     // Pythagoras Theorem 
     // PQ = sqrt((x2-x1)^2 + (y2-y1)^2) 
     var x = (x2-x1); 
     var y = (y2-y1); 

     this.radius = Math.sqrt(x*x + y*y); 
     this.x = x; 
     this.y = y; 
    } 

    function polar2cartesian(R, theta) { 
     this.x = R * Math.cos(theta); 
     this.y= R * Math.sin(theta); 
    } 

đâu khi chuột ở trên và ở bên phải của hạt (vòng tròn trung tâm) như: enter image description here

Giao diện điều khiển màn hình đăng nhập:

Particle: (300,250) Mouse: (326,223) 
artan(-27/26) = angle: -46.08092418666069 - theta -0.8042638494191191 

nơi cần phải là arctan (27/26) = góc: 46: theta = 0,8. bởi vì ngay cả chuột là "trên" trung tâm, nó đọc y2-y1 là -27 bởi vì hệ thống điều phối dựa trên 0,0 là trên cùng bên trái.

Vấn đề sau đó là khi cả X và Y đều âm tính làm cho tích cực theta, khi nó phải trỏ hướng ngược lại (ra ngoài từ điểm giữa). Tôi biết tôi chỉ có thể làm một thủ thuật 180 độ ở đây nhưng tôi muốn hiểu những gì im làm sai.

+4

Nguyên nhân khi cả hai y và x là số âm, phân chia chúng dẫn đến một số dương (mà là tagent của góc tương ứng, và khi một tiếp tuyến góc là dương tính, góc riêng của mình là tích cực. –

+0

Có rất nhiều các giá trị mà bạn có thể chuyển tới các hàm trig (sin, cos, tan) sẽ cho giá trị giống nhau, các giá trị cho sin là 0, Pi, 2 * pi, 3 * pi, v.v. Chúng chỉ cung cấp các giá trị duy nhất trong một phạm vi nhất định (ví dụ như cho sin của nó -Pi/2 đến + pi/2) Điều này có nghĩa là khi thực hiện chức năng trig nghịch đảo để quay trở lại bản gốc biết kết quả của hàm trig là không sử dụng trừ khi bạn cũng biết khoảng đó nằm trong phạm vi nào. Cách bạn xác định đó là sử dụng các dấu hiệu của x và y để làm việc ra những gì góc phần tư nó là đầu tiên và do đó cho dù bạn cần phải thêm, trừ hoặc bất cứ điều gì để có được góc bên phải. – Chris

Trả lời

13

Trong Javascript và nhiều ngôn ngữ có chức năng atan2 để giải quyết vấn đề này. Đây là hàm lấy 2 đối số (các tọa độ xy), do đó hệ thống có thể thêm hoặc trừ π để tạo ra góc chính xác. Thay vì gọi

Math.atan(y/x) 

bạn chỉ cần gọi thay vì

Math.atan2(y, x) 
+1

Hm, ok. Khi tôi googled arctan cho javascript nó nói với tôi các chức năng là giống nhau, tôi đã chọn cho atan bởi vì nó không để lại đọc tự hỏi những gì atan2 là ... điều này giải quyết vấn đề mặc dù. – ParoX

2

Không biết làm thế nào để bạn muốn vẽ các đường thẳng, nhưng một trong những sẽ giải quyết vấn đề của bạn.

theta = Math.atan2(distance.y , distance.x); 
theta = Math.PI + Math.atan2(distance.y , distance.x); 
Các vấn đề liên quan