P2trEdge *flipped = p2tr_cdt_try_flip (self, edge);
if (flipped != NULL)
{
- p2tr_vedge_set_add2 (candidates, p2tr_vedge_new (A, C1));
- p2tr_vedge_set_add2 (candidates, p2tr_vedge_new (A, C2));
- p2tr_vedge_set_add2 (candidates, p2tr_vedge_new (B, C1));
- p2tr_vedge_set_add2 (candidates, p2tr_vedge_new (B, C2));
+ p2tr_vedge_set_add (candidates, p2tr_point_get_edge_to (A, C1, TRUE));
+ p2tr_vedge_set_add (candidates, p2tr_point_get_edge_to (A, C2, TRUE));
+ p2tr_vedge_set_add (candidates, p2tr_point_get_edge_to (B, C1, TRUE));
+ p2tr_vedge_set_add (candidates, p2tr_point_get_edge_to (B, C2, TRUE));
p2tr_edge_unref (flipped);
}
}
static void
p2tr_vedge_init (P2trVEdge *self,
P2trPoint *start,
- P2trPoint *end)
+ P2trPoint *end,
+ gboolean constrained)
{
- self->start = start;
- self->end = end;
- self->refcount = 0;
+ self->start = start;
+ self->end = end;
+ self->constrained = constrained;
+ self->refcount = 0;
}
P2trVEdge*
p2tr_vedge_new (P2trPoint *start,
- P2trPoint *end)
+ P2trPoint *end,
+ gboolean constrained)
{
- P2trVEdge *self = g_slice_new (P2trVEdge);
+ P2trVEdge *self = g_slice_new (P2trVEdge);
- p2tr_vedge_init (self, start, end);
+ p2tr_vedge_init (self, start, end, constrained);
p2tr_point_ref (start);
p2tr_point_ref (end);
}
P2trVEdge*
-p2tr_vedge_new2 (P2trEdge *real)
+p2tr_vedge_new2 (P2trEdge *real)
{
- return p2tr_vedge_new (P2TR_EDGE_START (real), real->end);
+ return p2tr_vedge_new (P2TR_EDGE_START (real), real->end,
+ real->constrained);
}
P2trVEdge*
return p2tr_point_has_edge_to (self->start, self->end);
}
+void
+p2tr_vedge_create (P2trVEdge *self)
+{
+ P2trMesh *mesh;
+ P2trEdge *edge;
+
+ g_assert (! p2tr_vedge_is_real (self));
+
+ mesh = p2tr_vedge_get_mesh (self);
+ if (mesh != NULL)
+ {
+ edge = p2tr_mesh_new_edge (mesh, self->start, self->end, self->constrained);
+ p2tr_mesh_unref (mesh);
+ }
+ else
+ edge = p2tr_edge_new (self->start, self->end, self->constrained);
+
+ p2tr_edge_unref (edge);
+}
+
+void
+p2tr_vedge_remove (P2trVEdge *self)
+{
+ P2trEdge *edge = p2tr_vedge_is_real (self);
+
+ g_assert (edge != NULL);
+
+ p2tr_edge_remove (edge);
+}
+
void
p2tr_vedge_free (P2trVEdge *self)
{
P2trPoint *start;
/** The end point of this virtual edge */
P2trPoint *end;
-
+ /** A flag to make whether this is a constrained edge */
+ gboolean constrained;
/** A count of references to the virtual edge */
- guint refcount;
+ guint refcount;
};
P2trVEdge* p2tr_vedge_new (P2trPoint *start,
- P2trPoint *end);
+ P2trPoint *end,
+ gboolean constrained);
P2trVEdge* p2tr_vedge_new2 (P2trEdge *real);
P2trEdge* p2tr_vedge_is_real (P2trVEdge *self);
+void p2tr_vedge_create (P2trVEdge *self);
+
+void p2tr_vedge_remove (P2trVEdge *self);
+
P2trEdge* p2tr_vedge_get (P2trVEdge *self);
/**
* Add the given edge to the flip set. THE EDGE MUST HAVE BEEN REFFED
* BEFORE THE CALL TO THIS FUNCTION!
*/
-void p2tr_vedge_set_add (P2trVEdgeSet *self,
- P2trEdge *to_flip);
+void p2tr_vedge_set_add (P2trVEdgeSet *self,
+ P2trEdge *to_flip);
/**
* Add the given virtual edge to the flip set. THE VIRTUAL EDGE MUST
* HAVE BEEN REFFED BEFORE THE CALL TO THIS FUNCTION!
*/
-void p2tr_vedge_set_add2 (P2trVEdgeSet *self,
- P2trVEdge *to_flip);
+void p2tr_vedge_set_add2 (P2trVEdgeSet *self,
+ P2trVEdge *to_flip);
/**
* Try popping a virtual edge from the set. If succeeds, THE RETURNED
* VIRTUAL EDGE MUST BE UNREFFED!
*/
gboolean p2tr_vedge_set_pop (P2trVEdgeSet *self,
- P2trVEdge **value);
+ P2trVEdge **value);
/**
* Free the flip set. IT IS THE REPONSIBILITY OF THE CALLER TO MAKE
* SURE NO VIRTUAL EDGES WERE LEFT IN THE SET!
*/
-void p2tr_vedge_set_free (P2trVEdgeSet *self);
+void p2tr_vedge_set_free (P2trVEdgeSet *self);
gboolean p2tr_vedge_undirected_equals (const P2trVEdge *e1,
const P2trVEdge *e2);
return NULL;
}
+void
+p2tr_vtriangle_create (P2trVTriangle *self)
+{
+ P2trMesh *mesh;
+ P2trEdge *e1, *e2, *e3;
+ P2trTriangle *tri;
+
+ g_assert (! p2tr_vtriangle_is_real (self));
+
+ mesh = p2tr_vtriangle_get_mesh (self);
+ e1 = p2tr_point_get_edge_to (self->points[0], self->points[1], FALSE);
+ e2 = p2tr_point_get_edge_to (self->points[1], self->points[2], FALSE);
+ e3 = p2tr_point_get_edge_to (self->points[2], self->points[0], FALSE);
+
+ if (mesh != NULL)
+ {
+ tri = p2tr_mesh_new_triangle (mesh, e1, e2, e3);
+ p2tr_mesh_unref (mesh);
+ }
+ else
+ tri = p2tr_triangle_new (e1, e2, e3);
+
+ p2tr_triangle_unref (tri);
+}
+
+void
+p2tr_vtriangle_remove (P2trVTriangle *self)
+{
+ P2trTriangle *tri = p2tr_vtriangle_is_real (self);
+
+ g_assert (tri != NULL);
+
+ p2tr_triangle_remove (tri);
+}
+
P2trTriangle*
p2tr_vtriangle_get (P2trVTriangle *self)
{
P2trTriangle* p2tr_vtriangle_is_real (P2trVTriangle *self);
+void p2tr_vtriangle_create (P2trVTriangle *self);
+
+void p2tr_vtriangle_remove (P2trVTriangle *self);
+
P2trTriangle* p2tr_vtriangle_get (P2trVTriangle *self);
#endif