00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00024
00025 #include <qvdta/qvpolyline.h>
00026
00027 #define CONST_PI ((double)3.14159)
00028 #define SIGN(X) (((X)>=0)?1:-1)
00029
00031
00032 QVPolyline::QVPolyline(): QList<QPoint>(), loop(false), direction(false), dir(0)
00033 {
00034 qDebug() << "QVPolyline()";
00035 qDebug() << "QVPolyline() <~ return";
00036 };
00037
00038 QVPolyline::QVPolyline(const QVPolyline &polyline): QList<QPoint>(polyline), loop(polyline.loop), direction(polyline.direction), dir(polyline.dir)
00039 {
00040 qDebug() << "QVPolyline(const QVPolyline &)";
00041 qDebug() << "QVPolyline(const QVPolyline &) <~ return";
00042 };
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052 QPoint linesIntersection(QPoint a, QPoint b, QPoint c, QPoint d)
00053
00054 {
00055 double x1 = a.rx(), x2 = b.rx(), x3 = c.rx(), x4 = d.rx();
00056 double y1 = a.ry(), y2 = b.ry(), y3 = c.ry(), y4 = d.ry();
00057
00058 double denominador = (y4 - y3)*(x2 - x1) - (x4 - x3)*(y2 - y1);
00059 if (denominador == 0)
00060 return QPoint( (int)(b.rx() + c.rx())/2, (int)(b.ry() + c.ry())/2 );
00061
00062 double ua = (x4 - x3)*(y1 - y3) - (y4 - y3)*(x1 - x3),
00063 ub = (x2 - x1)*(y1 - y3) - (y2 - y1)*(x1 - x3);
00064
00065 QPoint p = QPoint(
00066 (int) (x1 + ua*(x2 - x1) / denominador),
00067 (int) (y1 + ub*(y2 - y1) / denominador)
00068 );
00069 return p;
00070 }
00071
00073
00074 void drawPoints(const QList<QPoint> &hotPoints, QVImage<uChar,3> &dest)
00075 {
00076 QListIterator<QPoint> iterator(hotPoints);
00077 uChar pixel[3] = { 255,0,0 };
00078
00079 while(iterator.hasNext())
00080 {
00081 QPoint p = iterator.next();
00082 QVPolyline rectangle = QVPolyline::rectangle(p.x()-2, p.y()-2, p.x()+2, p.y()+2);
00083 draw(dest, rectangle, pixel,true,true);
00084 }
00085 }
00086
00087 void drawPoints(const QList<QPoint> &hotPoints, QVImage<uChar> &dest)
00088 {
00089 QListIterator<QPoint> iterator(hotPoints);
00090 while(iterator.hasNext())
00091 {
00092 QPoint p = iterator.next();
00093 QVPolyline rectangle = QVPolyline::rectangle(p.x()-2, p.y()-2, p.x()+2, p.y()+2);
00094 draw(dest, rectangle, 255,true,true);
00095 }
00096 }
00097
00098
00099 void draw(QVImage<uChar> &image, const QVPolyline &polyline, uChar constant, bool linked, bool safe)
00100 {
00101 Q_ASSERT_X(polyline.size() > 0, "drawPolyline()", "polyline size equals zero");
00102
00103 QListIterator<QPoint> iterator(polyline);
00104 QRect roi = image.getROI();
00105
00106 QPoint previous;
00107
00108 if (linked)
00109 previous = iterator.next();
00110
00111 QVIMAGE_INIT_WRITE(uChar,image);
00112 while (iterator.hasNext())
00113 {
00114 QPoint actual = iterator.next();
00115 int x = actual.x(), y = actual.y();
00116 if (!linked && !safe)
00117 QVIMAGE_PIXEL(image, x, y,0) = constant;
00118 else if (linked)
00119 {
00120 QVPolyline line = QVPolyline::line(x, y, previous.rx(), previous.ry());
00121 draw(image, line, constant, false, safe);
00122 previous = actual;
00123 }
00124 else if (roi.contains(x, y))
00125 QVIMAGE_PIXEL(image, x, y,0) = constant;
00126 }
00127 }
00128
00129 void draw(QVImage<uChar,3> &image, const QVPolyline &polyline, uChar constant[3], bool linked, bool safe)
00130 {
00131 Q_ASSERT_X(polyline.size() > 0, "drawPolyline()", "polyline size equals zero");
00132
00133
00134 QListIterator<QPoint> iterator(polyline);
00135 QRect roi = image.getROI();
00136
00137 QPoint previous;
00138
00139 if (linked)
00140 previous = iterator.next();
00141
00142 QVIMAGE_INIT_WRITE(uChar,image);
00143 while (iterator.hasNext())
00144 {
00145 QPoint actual = iterator.next();
00146 int x = actual.x(), y = actual.y();
00147 if (!linked && !safe)
00148 {
00149 QVIMAGE_PIXEL(image, x, y,0) = constant[0];
00150 QVIMAGE_PIXEL(image, x, y,1) = constant[1];
00151 QVIMAGE_PIXEL(image, x, y,2) = constant[2];
00152
00153
00154
00155 }
00156 else if (linked)
00157 {
00158 QVPolyline line = QVPolyline::line(actual.rx(), actual.ry(), previous.rx(), previous.ry());
00159 draw(image, line, constant, false, safe);
00160 previous = actual;
00161 }
00162 else if (roi.contains(actual.rx(), actual.ry()))
00163 {
00164 QVIMAGE_PIXEL(image, x, y,0) = constant[0];
00165 QVIMAGE_PIXEL(image, x, y,1) = constant[1];
00166 QVIMAGE_PIXEL(image, x, y,2) = constant[2];
00167
00168
00169
00170 }
00171 }
00172 }
00173
00174
00175 void draw(QVImage<uChar> &img, const QList< QVPolyline > &polylineList, uChar constant, bool linked, bool safe)
00176 {
00177 QListIterator<QVPolyline> iterator(polylineList);
00178 while (iterator.hasNext())
00179 draw(img, iterator.next(), constant, linked, safe);
00180 }
00181
00182 void draw(QVImage<uChar,3> &img,const QList< QVPolyline > &polylineList, uChar constant[3],bool linked,bool safe)
00183 {
00184 QListIterator<QVPolyline> iterator(polylineList);
00185 while (iterator.hasNext())
00186 draw(img, iterator.next(), constant, linked, safe);
00187 }
00188
00189
00190 QVPolyline QVPolyline::ellipse(uInt n, float x, float y, float maxRadio, float minRadio, float ang)
00191 {
00192 QVPolyline ellipse;
00193 float w = 2*CONST_PI/(n-1);
00194 float maxArg = (maxRadio+minRadio)/2;
00195 float minArg = (maxRadio-minRadio)/2;
00196
00197 for (uInt t = 0; t < n; t++)
00198 ellipse.append(QPoint ( (uInt) (x + maxArg*cos(ang+w*t) + minArg*cos(ang-w*t)),
00199 (uInt) (y + maxArg*sin(ang+w*t) + minArg*sin(ang-w*t))
00200 ));
00201 return ellipse;
00202 }
00203
00204 QVPolyline QVPolyline::rectangle(int x1, int y1, int x2, int y2)
00205 {
00206 QVPolyline rectangle;
00207 rectangle.append(QPoint( x1, y1 ));
00208 rectangle.append(QPoint( x1, y2 ));
00209 rectangle.append(QPoint( x2, y2 ));
00210 rectangle.append(QPoint( x2, y1 ));
00211 rectangle.append(QPoint( x1, y1 ));
00212 return rectangle;
00213 }
00214
00215 QVPolyline QVPolyline::line(int x1, int y1, int x2, int y2)
00216 {
00217 QVPolyline line;
00218
00219 line.append(QPoint( x1, y1 ));
00220
00221 if (x1 == x2 && y1 == y2)
00222 return line;
00223
00224 int i,dx,dy,sdx,sdy,dxabs,dyabs,x,y,px,py;
00225
00226 dx=x2-x1;
00227 dy=y2-y1;
00228 dxabs=abs(dx);
00229 dyabs=abs(dy);
00230 sdx=SIGN(dx);
00231 sdy=SIGN(dy);
00232 x=dyabs>>1;
00233 y=dxabs>>1;
00234 px=x1;
00235 py=y1;
00236
00237 if (dxabs>=dyabs)
00238 for(i=0;i<dxabs;i++)
00239 {
00240 y+=dyabs;
00241 if (y>=dxabs)
00242 {
00243 y-=dxabs;
00244 py+=sdy;
00245 }
00246 px+=sdx;
00247 line.append(QPoint( px, py ));
00248 }
00249 else
00250 for(i=0;i<dyabs;i++)
00251 {
00252 x+=dxabs;
00253 if (x>=dyabs)
00254 {
00255 x-=dyabs;
00256 px+=sdx;
00257 }
00258 py+=sdy;
00259 line.append(QPoint( px, py ));
00260 }
00261
00262 return line;
00263 }
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409
00411 #define dist2(A,B) (((A).rx() -(B).rx())*((A).rx() -(B).rx()) + ((A).ry() -(B).ry())*((A).ry() -(B).ry()))
00412 #define dot(A,B) ( (A).rx()*(B).rx() + (A).ry()*(B).ry() )
00413
00414
00415
00416
00417
00418
00419
00420
00421
00422
00423
00424
00425
00426
00427
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445
00446
00447
00448
00449
00450
00451
00452
00453
00454
00455
00456
00457
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471
00472
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487
00488
00489
00490
00491
00492
00493
00494
00495
00496
00497
00498
00499
00500
00501
00502
00503
00504
00505
00506
00507
00508
00509
00510
00511
00512
00513
00514
00515
00516
00517
00518
00519
00520
00521
00522
00523
00524
00525
00526