static GtsEdge * new_edge (GtsVertex * v1, GtsVertex * v2) { GtsSegment * s = gts_vertices_are_connected (v1, v2); return s == NULL ? gts_edge_new (GTS_EDGE_CLASS (gts_constraint_class ()), v1, v2) : GTS_EDGE (s); }
/** * gts_edge_belongs_to_tetrahedron: * @e: a #GtsEdge. * * Returns: %TRUE if @e is used by faces forming a tetrahedron, %FALSE * otherwise. */ gboolean gts_edge_belongs_to_tetrahedron (GtsEdge * e) { GSList * i; GtsVertex * v1, * v2; g_return_val_if_fail (e != NULL, FALSE); v1 = GTS_SEGMENT (e)->v1; v2 = GTS_SEGMENT (e)->v2; i = e->triangles; while (i) { GtsEdge * e1, * e2; GtsVertex * vt1; GSList * j = i->next; triangle_vertices_edges (i->data, e, &vt1, &e1, &e2); while (j) { GtsSegment * s5; GtsEdge * e3, * e4; GtsVertex * vt2; triangle_vertices_edges (j->data, e, &vt2, &e3, &e4); s5 = gts_vertices_are_connected (vt1, vt2); if (GTS_IS_EDGE (s5) && gts_triangle_use_edges (e1, e3, GTS_EDGE (s5)) && gts_triangle_use_edges (e2, e4, GTS_EDGE (s5))) return TRUE; j = j->next; } i = i->next; } return FALSE; }
static PyObject* is_connected(PygtsVertex *self, PyObject *args) { PyObject *v_; PygtsVertex *v; SELF_CHECK /* Parse the args */ if(! PyArg_ParseTuple(args, "O", &v_) ) { return NULL; } /* Convert to PygtsObjects */ if(!pygts_vertex_check(v_)) { PyErr_SetString(PyExc_TypeError,"expected a Vertex"); return NULL; } v = PYGTS_VERTEX(v_); if( gts_vertices_are_connected(PYGTS_VERTEX_AS_GTS_VERTEX(self), PYGTS_VERTEX_AS_GTS_VERTEX(v)) != NULL ) { Py_INCREF(Py_True); return Py_True; } else { Py_INCREF(Py_False); return Py_False; } }
/** * gts_edge_swap: * @e: a #GtsEdge. * @s: a #GtsSurface. * * Performs an "edge swap" on the two triangles sharing @e and * belonging to @s. */ void gts_edge_swap (GtsEdge * e, GtsSurface * s) { GtsTriangle * t1 = NULL, * t2 = NULL, * t; GtsFace * f; GSList * i; GtsVertex * v1, * v2, * v3, * v4, * v5, * v6; GtsEdge * e1, * e2, * e3, * e4; GtsSegment * v3v6; g_return_if_fail (e != NULL); g_return_if_fail (s != NULL); i = e->triangles; while (i) { if (GTS_IS_FACE (i->data) && gts_face_has_parent_surface (i->data, s)) { if (!t1) t1 = i->data; else if (!t2) t2 = i->data; else g_return_if_fail (gts_edge_face_number (e, s) == 2); } i = i->next; } g_assert (t1 && t2); gts_triangle_vertices_edges (t1, e, &v1, &v2, &v3, &e, &e1, &e2); gts_triangle_vertices_edges (t2, e, &v4, &v5, &v6, &e, &e3, &e4); g_assert (v2 == v4 && v1 == v5); v3v6 = gts_vertices_are_connected (v3, v6); if (!GTS_IS_EDGE (v3v6)) v3v6 = GTS_SEGMENT (gts_edge_new (s->edge_class, v3, v6)); f = gts_face_new (s->face_class, e1, GTS_EDGE (v3v6), e4); if ((t = gts_triangle_is_duplicate (GTS_TRIANGLE (f))) && GTS_IS_FACE (t)) { gts_object_destroy (GTS_OBJECT (f)); f = GTS_FACE (t); } gts_surface_add_face (s, f); f = gts_face_new (s->face_class, GTS_EDGE (v3v6), e2, e3); if ((t = gts_triangle_is_duplicate (GTS_TRIANGLE (f))) && GTS_IS_FACE (t)) { gts_object_destroy (GTS_OBJECT (f)); f = GTS_FACE (t); } gts_surface_add_face (s, f); gts_surface_remove_face (s, GTS_FACE (t1)); gts_surface_remove_face (s, GTS_FACE (t2)); }