00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00024
00025 #include <iostream>
00026 #include <float.h>
00027
00028 #include <qvmath.h>
00029 #include <qvdefines.h>
00030 #include <qvmatrixalgebra.h>
00031
00032 #include <QVPolyline>
00033 #include <QVPolylineF>
00034
00035 QVPolyline::QVPolyline(): QList<QPoint>(),
00036 closed(false), direction(false)
00037 {
00038 qDebug() << "QVPolyline()";
00039 qDebug() << "QVPolyline() <~ return";
00040 };
00041
00042 QVPolyline::QVPolyline(const QVPolyline &polyline): QList<QPoint>(polyline),
00043 closed(polyline.closed), direction(polyline.direction)
00044 {
00045 qDebug() << "QVPolyline(const QVPolyline &)";
00046 qDebug() << "QVPolyline(const QVPolyline &) <~ return";
00047 };
00048
00049 QVPolyline::QVPolyline(const QVPolylineF &polyline): QList<QPoint>(),
00050 closed(polyline.closed), direction(polyline.direction)
00051 {
00052 foreach(QPointF pointf, polyline)
00053 {
00054 append( QPoint(pointf.toPoint()) );
00055 }
00056 qDebug() << "QVPolylineF(const QVPolylineF &)";
00057 qDebug() << "QVPolylineF(const QVPolylineF &) <~ return";
00058 };
00059
00060 QVPolyline QVPolyline::ellipse(uInt n, float x, float y, float maxRadio, float minRadio, float ang)
00061 {
00062 QVPolyline ellipse;
00063 float w = 2*PI/(n-1);
00064 float maxArg = (maxRadio+minRadio)/2;
00065 float minArg = (maxRadio-minRadio)/2;
00066
00067 for (uInt t = 0; t < n; t++)
00068 ellipse.append(QPoint ( (uInt) (x + maxArg*cos(ang+w*t) + minArg*cos(ang-w*t)),
00069 (uInt) (y + maxArg*sin(ang+w*t) + minArg*sin(ang-w*t))
00070 ));
00071 return ellipse;
00072 }
00073
00074 QVPolyline QVPolyline::rectangle(int x1, int y1, int x2, int y2)
00075 {
00076 QVPolyline rectangle;
00077 rectangle.append(QPoint( x1, y1 ));
00078 rectangle.append(QPoint( x1, y2 ));
00079 rectangle.append(QPoint( x2, y2 ));
00080 rectangle.append(QPoint( x2, y1 ));
00081 rectangle.append(QPoint( x1, y1 ));
00082 return rectangle;
00083 }
00084
00085 QVPolyline QVPolyline::line(int x1, int y1, int x2, int y2)
00086 {
00087 QVPolyline line;
00088
00089 line.append(QPoint( x1, y1 ));
00090
00091 if (x1 == x2 && y1 == y2)
00092 return line;
00093
00094 int i,dx,dy,sdx,sdy,dxabs,dyabs,x,y,px,py;
00095
00096 dx=x2-x1;
00097 dy=y2-y1;
00098 dxabs=abs(dx);
00099 dyabs=abs(dy);
00100 sdx=SIGN(dx);
00101 sdy=SIGN(dy);
00102 x=dyabs>>1;
00103 y=dxabs>>1;
00104 px=x1;
00105 py=y1;
00106
00107 if (dxabs>=dyabs)
00108 for(i=0;i<dxabs;i++)
00109 {
00110 y+=dyabs;
00111 if (y>=dxabs)
00112 {
00113 y-=dxabs;
00114 py+=sdy;
00115 }
00116 px+=sdx;
00117 line.append(QPoint( px, py ));
00118 }
00119 else
00120 for(i=0;i<dyabs;i++)
00121 {
00122 x+=dxabs;
00123 if (x>=dyabs)
00124 {
00125 x-=dyabs;
00126 px+=sdx;
00127 }
00128 py+=sdy;
00129 line.append(QPoint( px, py ));
00130 }
00131
00132 return line;
00133 }
00134
00135 QVPolyline::operator QVPolylineF() const
00136 {
00137 QVPolylineF polyline;
00138 foreach(QPoint point, *this)
00139 {
00140 polyline.append(QPointF(point));
00141 }
00142 return polyline;
00143 }
00144
00145