">0))); for (uint i = 0; i < p.count() - 2; i += 2) { int x1 = p.at(i)->x(); int xa = p.at(i + 1)->x(); int x4 = p.at(i + 2)->x(); int x2 = (x1 + xa) / 2; int x3 = (xa + x4) / 2; int y1 = p.at(i)->y(); int ya = p.at(i + 1)->y(); int y4 = p.at(i + 2)->y(); int y2 = (y1 + ya) / 2; int y3 = (ya + y4) / 2; rt.append(new QPoint(x2 ,y2)); rt.append(new QPoint(x3 ,y3)); rt.append(new QPoint(x4 ,y4)); } return rt; } FNPointList ToCurves(FNPointList& p) { if (3 <= p.count()) { //�x�W�F�ɂ��⊮ return ToBezier(p); } else { FNPointList rt; for (uint i = 0; i < p.count(); ++i) { rt.append(new QPoint(*p.at(i))); } return rt; } } FNPointList AutoFormat(FNPointList& p) { FNPointList tp = ExtractAngle(p, PHASE1_ANGLE); uint n; do { n = tp.count(); tp = SumupPoints(tp); tp = ExtractAngle(tp, PHASE1_ANGLE); tp = ArrangePoints(tp); } while (n > tp.count()); tp = SnapPoints(tp); tp = ReducePoints(tp); FNPointList rt; if (2 == tp.count()) { if (*tp.first() == *tp.last()) { return rt; } } for (uint i = 0; i < tp.count(); ++i) { rt.append(new QPoint(*tp.at(i))); } return rt; } FNPointList ToEllipse(int x, int y, int w, int h) { FNPointList rt; QPointArray pa; pa.makeEllipse(x, y, w, h); for (uint i = 0; i < pa.count(); ++i) { rt.append(new QPoint(pa.point(i))); } return rt; } FNPointList AutoCurve(FNPointList& p) { FNPointList tp2; tp2.setAutoDelete(true); FNPointList tp4; tp4.setAutoDelete(true); /* QPoint sp = SnapPoint(*p.at(0)); QPoint ep = SnapPoint(*p.at(p.count()-1)); if (sp == ep) { //�ȉ~ int sx = p.at(0)->x(); int sy = p.at(0)->y(); int ex = sx; int ey = sy; for (uint i = 1; i < p.count(); ++i) { QPoint tp = *p.at(i); if (sx > tp.x()) { sx = tp.x(); } else if (ex < tp.x()) { ex = tp.x(); } if (sy > tp.y()) { sy = tp.y(); } else if (ey < tp.y()) { ey = tp.y(); } } sp = SnapPoint(QPoint(sx, sy)); ep = SnapPoint(QPoint(ex, ey)); tp2.append(new QPoint(sp.x(), sp.y())); tp2.append(new QPoint(ep.x(), ep.y())); } else { */ FNPointList tp = ExtractAngle2(p, PHASE2_ANGLE); uint n; do { n = tp.count(); tp = SumupPoints(tp); tp = ExtractAngle2(tp, PHASE2_ANGLE); tp = SnapPoints(tp); } while (n > tp.count()); tp = SumupPoints(tp); tp = ReducePoints(tp); tp4 = TuningPoints(tp); tp2 = ToCurves(tp4); //} FNPointList rt; if (2 == tp2.count()) { if (*tp2.first() == *tp2.last()) { return rt; } } for (uint i = 0; i < tp2.count(); ++i) { rt.append(new QPoint(*tp2.at(i))); } return rt; } FNPointList Smoothing(FNPointList& p) { int tsnap = SNAP_SIZE; SNAP_SIZE=8; FNPointList tp = ExtractAngle2(p, PHASE2_ANGLE); tp = SumupPoints(tp); tp = ReducePoints(tp); FNPointList tp4 = TuningPoints(tp); tp4.setAutoDelete(true); FNPointList tp2 = ToCurves(tp4); tp2.setAutoDelete(true); FNPointList rt; for (uint i = 0; i < tp2.count(); ++i) { rt.append(new QPoint(*tp2.at(i))); } SNAP_SIZE = tsnap; return rt; } FNPointList Reduce(FNPointList& p) { FNPointList tp = ReducePoints(p); FNPointList rt; for (uint i = 0; i < tp.count(); ++i) { rt.append(new QPoint(*tp.at(i))); } return rt; } QRect GetBounds(FNPointList& v) { if (1 > v.count()) { return QRect(0, 0, 1, 1); } QPoint sp = *v.at(0); QPoint ep = sp; for (uint i = 1; i < v.count(); ++i) { QPoint& p = *v.at(i); if (sp.x() > p.x()) { sp.setX(p.x()); } if (sp.y() > p.y()) { sp.setY(p.y()); } if (ep.x() < p.x()) { ep.setX(p.x()); } if (ep.y() < p.y()) { ep.setY(p.y()); } } return QRect(sp, ep); } FNPointList Translate(FNPointList& v, int x, int y, double xs, double ys) { FNPointList rt; for (uint i = 0; i < v.count(); ++i) { QPoint& p = *v.at(i); int X = (int)((p.x() - x) * xs); int Y = (int)((p.y() - y) * ys); rt.append(new QPoint(X, Y)); } return rt; } double ToStrokeDeg(double v) { double d = ((int)(v * 10 / 225)) * 22.5; return d; } int sign(int v) { if (0 > v) { return -1; } else if (0 < v) { return 1; } else { return 0; } };