Tôi cần tính góc giữa 3 điểm. Đối với điều này, tôi làm như sau:Góc sai, mặt sai được tính
- Grab 3 điểm (trước đây, hiện tại và tiếp theo, đó là trong một vòng lặp)
- Tính khoảng cách giữa các điểm với Pythagoras
- Tính góc bằng
Math.acos
Điều này có vẻ hoạt động tốt đối với hình dạng không có thiên thần trên 180 độ, tuy nhiên nếu hình dạng có góc như vậy, nó tính toán cạnh ngắn. Dưới đây là một minh họa để hiển thị những gì tôi có nghĩa là (các giá trị màu đỏ là sai):
Đây là mã mà không được tính toán:
// Pythagoras for calculating distance between two points (2D)
pointDistance = function (p1x, p1y, p2x, p2y) {
return Math.sqrt((p1x - p2x)*(p1x - p2x) + (p1y - p2y)*(p1y - p2y));
};
// Get the distance between the previous, current and next points
// vprev, vcur and vnext are objects that look like this:
// { x:float, y:float, z:float }
lcn = pointDistance(vcur.x, vcur.z, vnext.x, vnext.z);
lnp = pointDistance(vnext.x, vnext.z, vprev.x, vprev.z);
lpc = pointDistance(vprev.x, vprev.z, vcur.x, vcur.z);
// Calculate and print the angle
Math.acos((lcn*lcn + lpc*lpc - lnp*lnp)/(2*lcn*lpc))*180/Math.PI
Có điều gì sai trong các mã, đã làm Tôi quên làm một cái gì đó, hoặc nó nên được thực hiện một cách hoàn toàn khác nhau?
Bạn có thể sử dụng [ 'Math.atan2()'] (https://developer.mozilla.org/en-US/docs/Web/ JavaScript/Reference/Global_Objects/Math/atan2) để tính toán góc từ tọa độ, nó sẽ làm cho việc tính toán đơn giản hơn. Bạn có thể thấy một ví dụ làm việc [trong fiddle] này (http://jsfiddle.net/92jWG/6/). – Teemu
Làm thế nào một tam giác có một góc trên 180 độ?Tổng số góc là 180 độ ..... – Jiminion
Vấn đề là 'cos (90)' và 'cos (270)' đều là 0 vì vậy khi thực hiện acos (0) nó sẽ phải chọn cái để cho bạn và rõ ràng chọn 90 làm tùy chọn. Một cách để sửa lỗi này có thể sử dụng atan2 như Teemu gợi ý và tính toán các góc của mỗi đoạn đường và trừ chúng. Tôi nghĩ rằng nếu bạn làm điều đó theo đúng thứ tự, điều này sẽ cung cấp cho bạn thông tin đầy đủ (mặc dù có thể cần bình thường hóa vì nó có thể nằm trong khoảng từ -360 đến 360). – Chris