static void quadBezRec(struct SVGParser* p, float x1, float y1, float x2, float y2, float x3, float y3, int level) { float x12,y12,x23,y23,x123,y123,d; if (level > 12) return; x12 = (x1+x2)*0.5f; y12 = (y1+y2)*0.5f; x23 = (x2+x3)*0.5f; y23 = (y2+y3)*0.5f; x123 = (x12+x23)*0.5f; y123 = (y12+y23)*0.5f; d = distPtSeg(x123, y123, x1,y1, x3,y3); if (level > 0 && d < p->tol*p->tol) { svgPathPoint(p, x123, y123); return; } quadBezRec(p, x1,y1, x12,y12, x123,y123, level+1); quadBezRec(p, x123,y123, x23,y23, x3,y3, level+1); }
void ofxSVGPathParser::quadBezRec( float x1, float y1, float x2, float y2, float x3, float y3, int level) { float x12,y12,x23,y23,x123,y123,d; if (level > 12) return; // don't go too deep x12 = (x1+x2)*0.5f; y12 = (y1+y2)*0.5f; x23 = (x2+x3)*0.5f; y23 = (y2+y3)*0.5f; x123 = (x12+x23)*0.5f; y123 = (y12+y23)*0.5f; d = distPtSeg(x123, y123, x1,y1, x3,y3); if (level > 0 && d < 1000) // tol*tol) { pathInstance->quadBezierTo(ofPoint(x1, x2), ofPoint(y2, y3), ofPoint( x123, y123 )); return; } quadBezRec(x1,y1, x12,y12, x123,y123, level+1); quadBezRec(x123,y123, x23,y23, x3,y3, level+1); }
static void quadBez(struct SVGParser* p, float x1, float y1, float cx, float cy, float x2, float y2) { quadBezRec(p, x1,y1, cx,cy, x2,y2, 0); svgPathPoint(p, x2, y2); }
void ofxSVGPathParser::quadBez(float x1, float y1, float cx, float cy, float x2, float y2) { quadBezRec(x1,y1, cx,cy, x2,y2, 0); }