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 #include <qvmatrixalgebra.h>
00031
00032 #include <iostream>
00033 #include <float.h>
00034
00035 QVPolylineF::QVPolylineF(): QList<QPointF>(),
00036 closed(false), direction(false)
00037 {
00038 qDebug() << "QVPolylineF()";
00039 qDebug() << "QVPolylineF() <~ return";
00040 };
00041
00042 QVPolylineF::QVPolylineF(const QVPolyline &polyline): QList<QPointF>(),
00043 closed(polyline.closed), direction(polyline.direction)
00044 {
00045 foreach(QPoint point, polyline)
00046 {
00047 append(QPointF(point));
00048 }
00049 qDebug() << "QVPolylineF(const QVPolylineF &)";
00050 qDebug() << "QVPolylineF(const QVPolylineF &) <~ return";
00051 };
00052
00053 QVPolylineF::QVPolylineF(const QVPolylineF &polyline): QList<QPointF>(polyline),
00054 closed(polyline.closed), direction(polyline.direction)
00055 {
00056 qDebug() << "QVPolylineF(const QVPolylineF &)";
00057 qDebug() << "QVPolylineF(const QVPolylineF &) <~ return";
00058 };
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00084
00085 QVPolylineF QVPolylineF::ellipse(uInt n, float x, float y, float maxRadio, float minRadio, float ang)
00086 {
00087 QVPolylineF ellipse;
00088 float w = 2*PI/(n-1);
00089 float maxArg = (maxRadio+minRadio)/2;
00090 float minArg = (maxRadio-minRadio)/2;
00091
00092 for (uInt t = 0; t < n; t++)
00093 ellipse.append(QPointF ( (uInt) (x + maxArg*cos(ang+w*t) + minArg*cos(ang-w*t)),
00094 (uInt) (y + maxArg*sin(ang+w*t) + minArg*sin(ang-w*t))
00095 ));
00096 return ellipse;
00097 }
00098
00099 QVPolylineF QVPolylineF::rectangle(float x1, float y1, float x2, float y2)
00100 {
00101 QVPolylineF rectangle;
00102 rectangle.append(QPointF( x1, y1 ));
00103 rectangle.append(QPointF( x1, y2 ));
00104 rectangle.append(QPointF( x2, y2 ));
00105 rectangle.append(QPointF( x2, y1 ));
00106 rectangle.append(QPointF( x1, y1 ));
00107 return rectangle;
00108 }
00109
00110 QVPolylineF::operator QVPolyline() const
00111 {
00112 QVPolyline polyline;
00113 foreach(QPointF pointf, *this)
00114 {
00115 polyline.append( QPoint(pointf.toPoint()) );
00116 }
00117 return polyline;
00118 }
00119
00120 bool QVPolylineF::surrounds(const QPointF &p) const
00121 {
00122 if (size() < 3)
00123 return false;
00124
00125 double angle = qvClockWiseAngle(operator[](0) - p, operator[](1) - p);
00126 for (int i=1; i<size()-1; i++)
00127 angle += qvClockWiseAngle(operator[](i) - p, operator[](i+1) - p);
00128
00129 return ABS(angle) >= PI;
00130 }
00131