Muszę obliczyć kąt między 3 punktami. W tym celu, to należy wykonać następujące czynności:Nieprawidłowy kąt, zła strona obliczona
- chwycić 3 punkty (poprzednie, prądu i następne, to jest w pętli)
- obliczenia odległości pomiędzy punktami z Pitagorasa
- obliczyć kąt w
Math.acos
Wydaje się, że działa to dobrze w przypadku kształtów bez aniołów powyżej 180 stopni, jednak jeśli kształt ma taki kąt, oblicza krótszy bok. Oto ilustracja, aby pokazać o co mi chodzi (czerwone wartości są źle):
Jest to kod, który wykonuje obliczenia:
// 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
Czy jest coś złego w kodzie, czy Zapominam o zrobieniu czegoś, czy też powinienem to zrobić zupełnie inaczej?
Można użyć [ 'Math.atan2()'] (https://developer.mozilla.org/en-US/docs/Web/ JavaScript/Reference/Global_Objects/Math/atan2) w celu obliczenia kątów od współrzędnych, ułatwi obliczenia. Możesz zobaczyć działający przykład [w tym skrzypcach] (http://jsfiddle.net/92jWG/6/). – Teemu
W jaki sposób trójkąt może mieć kąt większy niż 180 stopni?Suma kątów wynosi 180 stopni ..... – Jiminion
Problem polega na tym, że 'cos (90)' i 'cos (270)' są zarówno 0, więc przy wykonywaniu acos (0) będzie musiał wybrać, co dać i najwyraźniej wybiera 90 jako preferencję. Jednym ze sposobów rozwiązania tego problemu może być użycie atan2, jak sugeruje Teemu i wykreślenie kątów każdego segmentu linii i odjęcie ich. Myślę, że jeśli zrobisz to we właściwej kolejności, powinno ci to dostarczyć pełnych informacji (chociaż może potrzebować normalizacji, ponieważ może to być od -360 do 360). – Chris