void SBezierLoop::MakePwlInto(SContour *sc, double chordTol) { SBezier *sb; for(sb = l.First(); sb; sb = l.NextAfter(sb)) { sb->MakePwlInto(sc, chordTol); // Avoid double points at join between Beziers; except that // first and last points should be identical. if(l.NextAfter(sb) != NULL) { sc->l.RemoveLast(1); } } // Ensure that it's exactly closed, not just within a numerical tolerance. if((sc->l.elem[sc->l.n - 1].p).Equals(sc->l.elem[0].p)) { sc->l.elem[sc->l.n - 1] = sc->l.elem[0]; } }
void Entity::GenerateEdges(SEdgeList *el, bool includingConstruction) { if(construction && !includingConstruction) return; SBezierList sbl; ZERO(&sbl); GenerateBezierCurves(&sbl); int i, j; for(i = 0; i < sbl.l.n; i++) { SBezier *sb = &(sbl.l.elem[i]); List<Vector> lv; ZERO(&lv); sb->MakePwlInto(&lv); for(j = 1; j < lv.n; j++) { el->AddEdge(lv.elem[j-1], lv.elem[j], style.v); } lv.Clear(); } sbl.Clear(); }