2017-02-10 5 views
0

Es verwendet, ist bereits eine Antwort auf diese Frage, aber für ein 2D-Gitter: Angles of triangles of a 3D mesh using #CGALWinkel der Dreiecke eines 2D-Mesh #CGAL

Ich verstehe, dass die Antwort in Bezug auf 2D unterscheidet. Also: Wie berechnet man die Winkel von Dreiecken eines 2D-Netzes in CGAL? Ich kann die Scheitelpunkte und ihren jeweiligen Vektor nehmen, indem ich Paare mache, aber ich suche nach einer geradlinigen Möglichkeit, die Winkel zu berechnen, ohne zu überprüfen, ob es der äußere oder der innere Winkel ist.

Wenn es einen Unterschied macht, wurde dieses Netz von einem CDT hergestellt.

Antwort

0

Es war einfach in Ordnung, aber ich dachte, es könnte jemand helfen, da ein Kommentar von Laurent Rineauin in der ersten 3D-Mesh-Frage, dass die Lösung anders ist. Also hier ist es:

// faces_iterator iterates through the triangles of l_cdt CDT triangulation 

CGAL::Point_2<K> vertex1 = l_cdt.triangle(faces_iterator)[0]; 
CGAL::Point_2<K> vertex2 = l_cdt.triangle(faces_iterator)[1]; 
CGAL::Point_2<K> vertex3 = l_cdt.triangle(faces_iterator)[2]; 

double a = CGAL::sqrt((vertex2.x() - vertex3.x()) * (vertex2.x() - vertex3.x()) + (vertex2.y() - vertex3.y()) * (vertex2.y() - vertex3.y())); 
double b = CGAL::sqrt((vertex1.x() - vertex3.x()) * (vertex1.x() - vertex3.x()) + (vertex1.y() - vertex3.y()) * (vertex1.y() - vertex3.y())); 
double c = CGAL::sqrt((vertex2.x() - vertex1.x()) * (vertex2.x() - vertex1.x()) + (vertex2.y() - vertex1.y()) * (vertex2.y() - vertex1.y())); 

// constants::PI is just π, for conversion to degrees instead of radians 
double angle1 = ((std::acos((b*b + c*c - a*a)/(2*b*c))) * 180)/constants::PI; 
double angle2 = ((std::acos((a*a + c*c - b*b)/(2*a*c))) * 180)/constants::PI; 
double angle3 = ((std::acos((a*a + b*b - c*c)/(2*b*a))) * 180)/constants::PI; 
+1

Ich glaube, Sie können 'CGAL :: squared_distance' verwenden, um a, b und c zu berechnen. –

+0

Ja, es ist wahr .. – foxTox