Circle* triangle_circumcircle(Triangle *t) { if (t->circumcircle->radius) { Point *center = triangle_circumcenter(t); t->circumcircle = circle_new(center, triangle_circumcircle_radius(t, center)); free(center); } return t->circumcircle; }
gdouble element_circumcircle_radius( const Element *el ) { g_return_val_if_fail( el != NULL, 0.0 ); HalfEdge *he = el->adjacent_halfedge; Point2 *p1 = NODE_POSITION( he->origin ); Point2 *p2 = NODE_POSITION( he->pair->origin ); Point2 *p3 = NODE_POSITION( he->previous->origin ); return triangle_circumcircle_radius( p1, p2, p3 ); }
int test_element( int argc, char *argv[] ) { Element *e = element_new(); g_return_val_if_fail( e->adjacent_halfedge == NULL , 1 ); element_free( e ); Point2 p1, p2, p3; point2_set( &p1, 0.0, 1.0 ); point2_set( &p2, 0.0, 0.0 ); point2_set( &p3, sqrt( 3.0 ), 0.0 ); gdouble a1, a2, a3; triangle_angles( &p1, &p2, &p3, &a1, &a2, &a3 ); g_return_val_if_fail( fabs( a1 - G_PI/3.0) < SMALL_NUMBER, 1 ); g_return_val_if_fail( fabs( a2 - G_PI/2.0) < SMALL_NUMBER, 1 ); g_return_val_if_fail( fabs( a3 - G_PI/6.0) < SMALL_NUMBER, 1 ); a1 = triangle_circumcircle_radius( &p1, &p2, &p3 ); g_return_val_if_fail( fabs( a1 - 1.0 ) < SMALL_NUMBER, 1 ); a1 = triangle_circumcircle_radius_edge_length( 1.0, sqrt( 3.0 ), 2.0 ); g_return_val_if_fail( fabs( a1 - 1.0 ) < SMALL_NUMBER, 1 ); Point2 p; triangle_circumcenter_coordinates( &p1, &p2, &p3, &p ); g_return_val_if_fail( fabs( p.x - sqrt( 3.0 )/2.0 ) < SMALL_NUMBER, 1 ); g_return_val_if_fail( fabs( p.y - 1.0/2.0 ) < SMALL_NUMBER, 1 ); a1 = triangle_area( &p1, &p2, &p3 ); g_return_val_if_fail( fabs( a1 - sqrt( 3.0 )/2.0 ) < SMALL_NUMBER, 1 ); Mesh *mesh = mesh_new(); Node *n1 = mesh_add_node( mesh, 0.0, 1.0 ); Node *n2 = mesh_add_node( mesh, 0.0, 0.0 ); Node *n3 = mesh_add_node( mesh, sqrt(3.0), 0.0 ); Edge *e1 = mesh_add_edge( mesh, n1, n2 ); Edge *e2 = mesh_add_edge( mesh, n2, n3 ); Edge *e3 = mesh_add_edge( mesh, n3, n1 ); Element *el = mesh_add_element( mesh, &e1->he[0], &e2->he[0], &e3->he[0] ); gdouble l1, l2, l3; element_edge_lengths( el, &l1, &l2, &l3 ); g_return_val_if_fail( fabs( l1 - 1.0) < SMALL_NUMBER, 1); g_return_val_if_fail( fabs( l2 - sqrt(3.0)) < SMALL_NUMBER, 1); g_return_val_if_fail( fabs( l3 - 2.0) < SMALL_NUMBER, 1); HalfEdge *he = element_min_edge( el, &l1 ); g_return_val_if_fail( he->edge == e1, 1 ); g_return_val_if_fail( fabs( l1 - 1.0) < SMALL_NUMBER, 1); l1 = element_min_edge_length( el ); g_return_val_if_fail( fabs( l1 - 1.0) < SMALL_NUMBER, 1); he = element_max_edge( el, &l1 ); g_return_val_if_fail( he->edge == e3, 1 ); g_return_val_if_fail( fabs( l1 - 2.0) < SMALL_NUMBER, 1); l1 = element_max_edge_length( el ); g_return_val_if_fail( fabs( l1 - 2.0) < SMALL_NUMBER, 1); element_angles( el, &a1, &a2, &a3 ); g_return_val_if_fail( fabs( a1 - G_PI/3.0) < SMALL_NUMBER, 1); g_return_val_if_fail( fabs( a2 - G_PI/2.0) < SMALL_NUMBER, 1); g_return_val_if_fail( fabs( a3 - G_PI/6.0) < SMALL_NUMBER, 1); a1 = element_maximum_angle( el ); g_return_val_if_fail( fabs( a1 - G_PI/2.0) < SMALL_NUMBER, 1); a1 = element_minimum_angle( el ); g_return_val_if_fail( fabs( a1 - G_PI/6.0) < SMALL_NUMBER, 1); element_circumcenter_coordinates( el, &p ); g_return_val_if_fail( fabs( p.x - sqrt( 3.0 )/2.0 ) < SMALL_NUMBER, 1); g_return_val_if_fail( fabs( p.y - 1.0/2.0 ) < SMALL_NUMBER, 1); point2_set( NODE_POSITION( n3 ), 3.0, 0.0 ); a1 = element_area( el ); g_return_val_if_fail( fabs( a1 - 3.0/2.0) < SMALL_NUMBER, 1); return 0; }