/* Check if prospective vertex would create overlapping triangle */ static int overlaps_tri(const RBFNODE *bv0, const RBFNODE *bv1, const RBFNODE *pv) { const MIGRATION *ej; RBFNODE *vother[2]; int im_rev; /* find shared edge in mesh */ for (ej = pv->ejl; ej != NULL; ej = nextedge(pv,ej)) { const RBFNODE *tv = opp_rbf(pv,ej); if (tv == bv0) { im_rev = is_rev_tri(ej->rbfv[0]->invec, ej->rbfv[1]->invec, bv1->invec); break; } if (tv == bv1) { im_rev = is_rev_tri(ej->rbfv[0]->invec, ej->rbfv[1]->invec, bv0->invec); break; } } if (!get_triangles(vother, ej)) /* triangle on same side? */ return(0); return(vother[im_rev] != NULL); }
/* Find vertices completing triangles on either side of the given edge */ int get_triangles(RBFNODE *rbfv[2], const MIGRATION *mig) { const MIGRATION *ej1, *ej2; RBFNODE *tv; rbfv[0] = rbfv[1] = NULL; if (mig == NULL) return(0); for (ej1 = mig->rbfv[0]->ejl; ej1 != NULL; ej1 = nextedge(mig->rbfv[0],ej1)) { if (ej1 == mig) continue; tv = opp_rbf(mig->rbfv[0],ej1); for (ej2 = tv->ejl; ej2 != NULL; ej2 = nextedge(tv,ej2)) if (opp_rbf(tv,ej2) == mig->rbfv[1]) { rbfv[is_rev_tri(mig->rbfv[0]->invec, mig->rbfv[1]->invec, tv->invec)] = tv; break; } } return((rbfv[0] != NULL) + (rbfv[1] != NULL)); }