00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00024
00025 #include <QVPolyline>
00026 #include <QVPolylineF>
00027
00028 #include <qvmath.h>
00029 #include <qvdefines.h>
00030
00031
00032 #include <iostream>
00033 #include <float.h>
00034
00035 QVPolylineF::QVPolylineF(const int estimatedSize): QList<QPointF>(),
00036 closed(false), direction(false)
00037 {
00038 qDebug() << "QVPolylineF()";
00039
00040 if (estimatedSize > 0)
00041 #ifdef QT_MIN_VERSION_4_7
00042 QList<QPointF>::reserve(estimatedSize);
00043 #else
00044 Q_WARNING("cannot reserve a size for Qt versions older than 4.7");
00045 #endif // QT_MIN_VERSION_4_7
00046
00047 qDebug() << "QVPolylineF() <~ return";
00048 };
00049
00050 QVPolylineF::QVPolylineF(const QVPolyline &polyline): QList<QPointF>(),
00051 closed(polyline.closed), direction(polyline.direction)
00052 {
00053 foreach(QPoint point, polyline)
00054 {
00055 append(QPointF(point));
00056 }
00057 qDebug() << "QVPolylineF(const QVPolylineF &)";
00058 qDebug() << "QVPolylineF(const QVPolylineF &) <~ return";
00059 };
00060
00061 QVPolylineF::QVPolylineF(const QVPolylineF &polyline): QList<QPointF>(polyline),
00062 closed(polyline.closed), direction(polyline.direction)
00063 {
00064 qDebug() << "QVPolylineF(const QVPolylineF &)";
00065 qDebug() << "QVPolylineF(const QVPolylineF &) <~ return";
00066 };
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00092
00093 QVPolylineF QVPolylineF::ellipse(uInt n, float x, float y, float maxRadio, float minRadio, float ang)
00094 {
00095 QVPolylineF ellipse;
00096 float w = 2*PI/(n-1);
00097 float maxArg = (maxRadio+minRadio)/2;
00098 float minArg = (maxRadio-minRadio)/2;
00099
00100 for (uInt t = 0; t < n; t++)
00101 ellipse.append(QPointF ( (x + maxArg*cos(ang+w*t) + minArg*cos(ang-w*t)),
00102 (y + maxArg*sin(ang+w*t) + minArg*sin(ang-w*t))
00103 ));
00104 return ellipse;
00105 }
00106
00107 QVPolylineF QVPolylineF::rectangle(float x1, float y1, float x2, float y2)
00108 {
00109 QVPolylineF rectangle;
00110 rectangle.append(QPointF( x1, y1 ));
00111 rectangle.append(QPointF( x1, y2 ));
00112 rectangle.append(QPointF( x2, y2 ));
00113 rectangle.append(QPointF( x2, y1 ));
00114 rectangle.append(QPointF( x1, y1 ));
00115 return rectangle;
00116 }
00117
00118 QVPolylineF::operator QVPolyline() const
00119 {
00120 QVPolyline polyline;
00121 foreach(QPointF pointf, *this)
00122 {
00123 polyline.append( QPoint(pointf.toPoint()) );
00124 }
00125 return polyline;
00126 }
00127
00128 bool QVPolylineF::surrounds(const QPointF &p) const
00129 {
00130 if (size() < 3)
00131 return false;
00132
00133 double angle = qvClockWiseAngle(operator[](0) - p, operator[](1) - p);
00134 for (int i=1; i<size()-1; i++)
00135 angle += qvClockWiseAngle(operator[](i) - p, operator[](i+1) - p);
00136
00137 return ABS(angle) >= PI;
00138 }
00139
00140 std::ostream& operator << ( std::ostream &os, const QVPolylineF &polylinef)
00141 {
00142 const int size = polylinef.size();
00143
00144 os << "QVPolyline (" << size << ")" ;
00145
00146 os << " [" ;
00147 for (int i=0; i < size; i++)
00148 {
00149 os << " (" << polylinef[i].x() << "," << polylinef[i].y() << ")";
00150 if(i!=size-1)
00151 os << ",";
00152 else
00153 os << " ";
00154 }
00155 os << "]" ;
00156 return os;
00157 }