void Path::InsertCubicTo(Geom::Point const &iPt, Geom::Point const &iStD, Geom::Point const &iEnD, int at) { if ( at < 0 || at > int(descr_cmd.size()) ) { return; } if ( at == int(descr_cmd.size()) ) { CubicTo(iPt,iStD,iEnD); return; } descr_cmd.insert(descr_cmd.begin() + at, new PathDescrCubicTo(iPt, iStD, iEnD)); }
void UIShape::CubicTo(qreal Control1X, qreal Control1Y, qreal Control2X, qreal Control2Y, qreal EndpointX, qreal EndpointY) { CubicTo(QPointF(Control1X, Control1Y), QPointF(Control2X, Control2Y), QPointF(EndpointX, EndpointY)); }
void Path::DoSimplify(int off, int N, double treshhold) { // non-dichotomic method: grow an interval of points approximated by a curve, until you reach the treshhold, and repeat if (N <= 1) { return; } int curP = 0; fitting_tables data; data.Xk = data.Yk = data.Qk = NULL; data.tk = data.lk = NULL; data.fk = NULL; data.totLen = 0; data.nbPt = data.maxPt = data.inPt = 0; Geom::Point const moveToPt = pts[off].p; MoveTo(moveToPt); Geom::Point endToPt = moveToPt; while (curP < N - 1) { int lastP = curP + 1; int M = 2; // remettre a zero data.inPt = data.nbPt = 0; PathDescrCubicTo res(Geom::Point(0, 0), Geom::Point(0, 0), Geom::Point(0, 0)); bool contains_forced = false; int step = 64; while ( step > 0 ) { int forced_pt = -1; int worstP = -1; do { if (pts[off + lastP].isMoveTo == polyline_forced) { contains_forced = true; } forced_pt = lastP; lastP += step; M += step; } while (lastP < N && ExtendFit(off + curP, M, data, (contains_forced) ? 0.05 * treshhold : treshhold, res, worstP) ); if (lastP >= N) { lastP -= step; M -= step; } else { // le dernier a echoue lastP -= step; M -= step; if ( contains_forced ) { lastP = forced_pt; M = lastP - curP + 1; } AttemptSimplify(off + curP, M, treshhold, res, worstP); // ca passe forcement } step /= 2; } endToPt = pts[off + lastP].p; if (M <= 2) { LineTo(endToPt); } else { CubicTo(endToPt, res.start, res.end); } curP = lastP; } if (Geom::LInfty(endToPt - moveToPt) < 0.00001) { Close(); } g_free(data.Xk); g_free(data.Yk); g_free(data.Qk); g_free(data.tk); g_free(data.lk); g_free(data.fk); }