Math-Geometry-Delaunay
view release on metacpan or search on metacpan
src_Win64/triangle.c view on Meta::CPAN
attrib = 0.5 * (elemattribute(top, i) + elemattribute(horiz, i));
setelemattribute(top, i, attrib);
setelemattribute(horiz, i, attrib);
}
if (b->vararea) {
if ((areabound(top) <= 0.0) || (areabound(horiz) <= 0.0)) {
area = -1.0;
} else {
/* Take the average of the two triangles' area constraints. */
/* This prevents small area constraints from migrating a */
/* long, long way from their original location due to flips. */
area = 0.5 * (areabound(top) + areabound(horiz));
}
setareabound(top, area);
setareabound(horiz, area);
}
if (m->checkquality) {
newflip = (struct flipstacker *) poolalloc(&m->flipstackers);
newflip->flippedtri = encode(horiz);
newflip->prevflip = m->lastflip;
m->lastflip = newflip;
}
#ifdef SELF_CHECK
if (newvertex != (vertex) NULL) {
if (counterclockwise(m, b, leftvertex, newvertex, rightvertex) <
0.0) {
printf("Internal error in insertvertex():\n");
printf(" Clockwise triangle prior to edge flip (bottom).\n");
}
/* The following test has been removed because constrainededge() */
/* sometimes generates inverted triangles that insertvertex() */
/* removes. */
/*
if (counterclockwise(m, b, rightvertex, farvertex, leftvertex) <
0.0) {
printf("Internal error in insertvertex():\n");
printf(" Clockwise triangle prior to edge flip (top).\n");
}
*/
if (counterclockwise(m, b, farvertex, leftvertex, newvertex) <
0.0) {
printf("Internal error in insertvertex():\n");
printf(" Clockwise triangle after edge flip (left).\n");
}
if (counterclockwise(m, b, newvertex, rightvertex, farvertex) <
0.0) {
printf("Internal error in insertvertex():\n");
printf(" Clockwise triangle after edge flip (right).\n");
}
}
#endif /* SELF_CHECK */
if (b->verbose > 2) {
printf(" Edge flip results in left ");
lnextself(topleft);
printtriangle(m, b, &topleft);
printf(" and right ");
printtriangle(m, b, &horiz);
}
/* On the next iterations, consider the two edges that were */
/* exposed (this is, are now visible to the newly inserted */
/* vertex) by the edge flip. */
lprevself(horiz);
leftvertex = farvertex;
}
}
}
if (!doflip) {
/* The handle `horiz' is accepted as locally Delaunay. */
#ifndef CDT_ONLY
if (triflaws) {
/* Check the triangle `horiz' for quality. */
testtriangle(m, b, &horiz);
}
#endif /* not CDT_ONLY */
/* Look for the next edge around the newly inserted vertex. */
lnextself(horiz);
sym(horiz, testtri);
/* Check for finishing a complete revolution about the new vertex, or */
/* falling outside of the triangulation. The latter will happen */
/* when a vertex is inserted at a boundary. */
if ((leftvertex == first) || (testtri.tri == m->dummytri)) {
/* We're done. Return a triangle whose origin is the new vertex. */
lnext(horiz, *searchtri);
lnext(horiz, m->recenttri);
return success;
}
/* Finish finding the next edge around the newly inserted vertex. */
lnext(testtri, horiz);
rightvertex = leftvertex;
dest(horiz, leftvertex);
}
}
}
/*****************************************************************************/
/* */
/* triangulatepolygon() Find the Delaunay triangulation of a polygon that */
/* has a certain "nice" shape. This includes the */
/* polygons that result from deletion of a vertex or */
/* insertion of a segment. */
/* */
/* This is a conceptually difficult routine. The starting assumption is */
/* that we have a polygon with n sides. n - 1 of these sides are currently */
/* represented as edges in the mesh. One side, called the "base", need not */
/* be. */
/* */
/* Inside the polygon is a structure I call a "fan", consisting of n - 1 */
/* triangles that share a common origin. For each of these triangles, the */
/* edge opposite the origin is one of the sides of the polygon. The */
/* primary edge of each triangle is the edge directed from the origin to */
/* the destination; note that this is not the same edge that is a side of */
/* the polygon. `firstedge' is the primary edge of the first triangle. */
/* From there, the triangles follow in counterclockwise order about the */
/* polygon, until `lastedge', the primary edge of the last triangle. */
/* `firstedge' and `lastedge' are probably connected to other triangles */
/* beyond the extremes of the fan, but their identity is not important, as */
/* long as the fan remains connected to them. */
/* */
/* Imagine the polygon oriented so that its base is at the bottom. This */
( run in 1.120 second using v1.01-cache-2.11-cpan-71847e10f99 )