Inheritance diagram for CanvasPolyline::
Public Methods | |
CanvasPolyline () | |
CanvasPolyline (double[] xpoints, double[]ypoints, int npoints) | |
CanvasPolyline (double[] xpoints, double[] ypoints, int npoints, Color color) | |
CanvasPolyline (double[] xpoints, double[] ypoints, int npoints, Color color, boolean closed) | |
CanvasPolyline (double[] xpoints, double[] ypoints, int npoints, int mode, Color color, boolean stroke, float linew, float trans, boolean closed, double ccs_scale) | |
void | draw (Graphics g) |
Draw CanvasObject on 'g', using internal CCS values. More... | |
Object | clone () |
Return an identical copy of this CanvasObject. More... | |
boolean | isInside (double x, double y) |
boolean | isNear (double x, double y) |
void | setDimension (double w, double h) |
Resize CanvasObject to width 'w' and height 'h'. More... | |
void | doPixelFit (double zoomFactor) |
Round internal ICS values to nearest natural number. More... | |
void | doMove (double w, double h) |
Move CanvasObject 'w' positions in x-direction, and 'h' posi- tions in y-direction. More... | |
void | addPoint (double x, double y) |
boolean | removePoint (int index) |
boolean | removeLastPoint () |
boolean | isClosed () |
void | setClosed (boolean b) |
double[] | getXPoints () |
double[] | getYPoints () |
int | getNrPoints () |
void | pointsToMediator () |
void | makeBSpline (int degree) |
Vector | getVisualChangeMethods () |
Builds up a list of functions that are to fill a menu for changing the visualization aspects of an object. More... | |
CanvasPolyline (int[] xpoints, int[] ypoints, int npoints, int mode, Color color, boolean closed, double ccs_scale) | |
boolean | isInsideCcs (int x, int y) |
To be removed. More... | |
boolean | isNearCcs (int x, int y) |
To be removed. More... | |
void | setDimension (int w, int h) |
void | doMove (int w, int h) |
int | changePoint (int index, int x, int y) |
void | addPoint (int x, int y) |
void | removeRedundantPoints () |
int[] | getCcsXPoints () |
int[] | getCcsYPoints () |
Protected Methods | |
void | initPoly (double[] xpoints, double[] ypoints, int npoints, boolean closed) |
void | transformICStoCCS () |
Perform a full ICS to CCS coordinate transformation. More... | |
void | transformCCStoICS () |
Perform a full CCS to ICS coordinate transformation. More... | |
void | setBox () |
Protected Attributes | |
double[] | ics_xPoints |
double[] | ics_yPoints |
Polygon | ccs_poly |
boolean | closed = false |
|
00033 { 00034 super(0, 0, 0, 0); 00035 } |
|
|
|
|
|
|
|
|
|
|
|
Draw CanvasObject on 'g', using internal CCS values.
Reimplemented from CanvasObject. Reimplemented in CanvasColoredPolyline.
00077 { 00078 setupDrawMode(g); 00079 if (!getTransformOK()) { 00080 transformICStoCCS(); 00081 } 00082 if (closed) { 00083 g.drawPolygon(ccs_poly); 00084 } else { 00085 g.drawPolyline(ccs_poly.xpoints, 00086 ccs_poly.ypoints, ccs_poly.npoints); 00087 } 00088 } |
|
Return an identical copy of this CanvasObject.
Reimplemented from CanvasObject. Reimplemented in CanvasColoredPolyline.
00092 { 00093 Color color = drawColor; 00094 if (hasNoColor) { 00095 color = NO_COLOR; 00096 } 00097 return (new CanvasPolyline(ics_xPoints, ics_yPoints, 00098 ccs_poly.npoints, getDrawMode(), color, strokeSet, 00099 lineWidth, transparency, closed, getZoomFactor())); 00100 } |
|
00104 { 00105 if (closed) { 00106 double[] ics_vals = { x, y }; 00107 int[] ccs_vals = Converter.ICStoCCS(ics_vals, getZoomFactor()); 00108 00109 if (!getTransformOK()) { 00110 transformICStoCCS(); 00111 } 00112 00113 return (ccs_poly.contains(ccs_vals[0], ccs_vals[1])); 00114 } 00115 return false; 00116 } |
|
00120 { 00121 // adapted from 'Graphics Gems II' - James Arvo, 00122 // chap. 1.3, 'Distance from a point to a line', pages 10-13. 00123 00124 00125 // check if inside enlarged bounding box (== box + SPHERE) 00126 00127 if (!((x >= getX1() - SPHERE) && (x < getX1() + getWidth() + SPHERE) && 00128 (y >= getY1() - SPHERE) && (y < getY1() + getHeight() + SPHERE))) { 00129 return false; 00130 } 00131 00132 00133 // we are inside the box, now check each line of the polygon 00134 00135 double min_x, min_y, max_x, max_y; 00136 double area, abs1, abs2, distance; 00137 00138 for (int i=0, j=1; i<ics_xPoints.length; i++, j++) { 00139 00140 if (j == ics_xPoints.length) { 00141 if (!closed) { 00142 break; 00143 } 00144 j = 0; 00145 } 00146 00147 min_x = Math.min(ics_xPoints[i], ics_xPoints[j]); 00148 min_y = Math.min(ics_yPoints[i], ics_yPoints[j]); 00149 max_x = Math.max(ics_xPoints[i], ics_xPoints[j]); 00150 max_y = Math.max(ics_yPoints[i], ics_yPoints[j]); 00151 00152 00153 // check if inside enlarged bounding box of line 00154 00155 if ((x >= min_x - SPHERE) && (x < max_x + SPHERE) && 00156 (y >= min_y - SPHERE) && (y < max_y + SPHERE)) { 00157 00158 00159 // calculate the area of the triangle formed by the two 00160 // CanvasPolyline points and the 'check' point 00161 00162 area = (y - ics_yPoints[i])* 00163 (ics_xPoints[j] - ics_xPoints[i]) - 00164 (x - ics_xPoints[i])* 00165 (ics_yPoints[j] - ics_yPoints[i]); 00166 00167 00168 // calculate approximation of distance perpendicular to 00169 // CanvasLine 00170 00171 00172 abs1 = Math.abs(ics_xPoints[j] - ics_xPoints[i]); 00173 abs2 = Math.abs(ics_yPoints[j] - ics_yPoints[i]); 00174 00175 distance = (int)(Math.abs(area) / 00176 (abs1 + abs2 - 0.5 * Math.min(abs1, abs2))); 00177 00178 00179 // this approximation can also be used as an 00180 // approximation for the 'true' distance 00181 00182 if (distance <= SPHERE) { 00183 return true; 00184 } 00185 } 00186 } 00187 return false; 00188 } |
|
Resize CanvasObject to width 'w' and height 'h'. Parameters are assumed Image Coordinate System values. Reimplemented from ScribbleObject.
00192 { 00193 double w_scale = (double)(Math.abs(w))/(double)getWidth(); 00194 double h_scale = (double)(Math.abs(h))/(double)getHeight(); 00195 00196 for (int i=0; i < ics_xPoints.length; i++) { 00197 ics_xPoints[i] = getX1() + (ics_xPoints[i]-getX1())*w_scale; 00198 ics_yPoints[i] = getY1() + (ics_yPoints[i]-getY1())*h_scale; 00199 } 00200 if (w < 0.) { 00201 for (int i=0; i < ics_xPoints.length; i++) { 00202 ics_xPoints[i] += w; 00203 } 00204 } 00205 if (h < 0.) { 00206 for (int i=0; i < ics_xPoints.length; i++) { 00207 ics_yPoints[i] += h; 00208 } 00209 } 00210 setZoomFactor(getZoomFactor()); 00211 } |
|
Round internal ICS values to nearest natural number. Although the ICS values are changed, they are not converted to 'integer' internally. Reimplemented from ScribbleObject.
00215 { 00216 super.doPixelFit(zoomFactor); 00217 00218 // Round ICS values of polyline... 00219 00220 for (int i=0; i < ics_xPoints.length; i++) { 00221 ics_xPoints[i] = Math.round(ics_xPoints[i]); 00222 ics_yPoints[i] = Math.round(ics_yPoints[i]); 00223 } 00224 setTransformOK(false); 00225 } |
|
Move CanvasObject 'w' positions in x-direction, and 'h' posi- tions in y-direction. Parameters are assumed Image Coordinate System values. Reimplemented from ScribbleObject.
00229 { 00230 super.doMove(w, h); 00231 00232 for (int i=0; i < ics_xPoints.length; i++) { 00233 ics_xPoints[i] += w; 00234 ics_yPoints[i] += h; 00235 } 00236 setTransformOK(false); 00237 } |
|
Reimplemented from ScribbleFigure.
00241 { 00242 int length = ics_xPoints.length; 00243 00244 double[] ics_xs = new double[length + 1]; 00245 double[] ics_ys = new double[length + 1]; 00246 00247 for (int i=0; i < length; i++) { 00248 ics_xs[i] = ics_xPoints[i]; 00249 ics_ys[i] = ics_yPoints[i]; 00250 } 00251 ics_xs[length] = x; 00252 ics_ys[length] = y; 00253 00254 ics_xPoints = new double[length + 1]; 00255 ics_yPoints = new double[length + 1]; 00256 00257 for (int i=0; i < length + 1; i++) { 00258 ics_xPoints[i] = ics_xs[i]; 00259 ics_yPoints[i] = ics_ys[i]; 00260 } 00261 setTransformOK(false); 00262 } |
|
Reimplemented from ScribbleFigure. Reimplemented in CanvasColoredPolyline.
00266 { 00267 if (ics_xPoints.length <= 2 || 00268 index < 0 || index >= ics_xPoints.length) { 00269 return false; 00270 } 00271 00272 int npoints = ics_xPoints.length - 1; 00273 double[] ics_xs = new double[npoints]; 00274 double[] ics_ys = new double[npoints]; 00275 00276 for (int i=0; i<npoints; i++) { 00277 if (i < index) { 00278 ics_xs[i] = ics_xPoints[i]; 00279 ics_ys[i] = ics_yPoints[i]; 00280 } else if (i >= index) { 00281 ics_xs[i] = ics_xPoints[i+1]; 00282 ics_ys[i] = ics_yPoints[i+1]; 00283 } 00284 } 00285 00286 ics_xPoints = new double[npoints]; 00287 ics_yPoints = new double[npoints]; 00288 00289 for (int i=0; i<npoints; i++) { 00290 ics_xPoints[i] = ics_xs[i]; 00291 ics_yPoints[i] = ics_ys[i]; 00292 } 00293 setTransformOK(false); 00294 return true; 00295 } |
|
Reimplemented from ScribbleFigure.
00299 { 00300 if (ics_xPoints.length <= 0) { 00301 return false; 00302 } 00303 return removePoint(ics_xPoints.length - 1); 00304 } |
|
00308 { 00309 return (closed); 00310 } |
|
00314 { 00315 this.closed = b; 00316 } |
|
00320 { 00321 return ics_xPoints; 00322 } |
|
00326 { 00327 return ics_yPoints; 00328 } |
|
00332 { 00333 return ics_xPoints.length; 00334 } |
|
00338 { 00339 // String dummy = _mediator.makeVectorOfPoint2d(getXPoints(), 00340 // getYPoints(), getNrPoints()); 00341 } |
|
00345 { 00346 // String dummy = _mediator.makeBSplineCurve(isClosed(), degree, 00347 // getXPoints(), getYPoints(), getNrPoints()); 00348 00349 } |
|
Builds up a list of functions that are to fill a menu for changing the visualization aspects of an object. Classes derived from this one typically add their class-specific methods to their parents' methods by first calling the parent to fill the vector and then add their own. The result is a Vector of CallableMethods. Reimplemented from ScribbleFigure.
00356 { 00357 Vector v = super.getVisualChangeMethods(); 00358 v.add(new CallableMethod("makeBSpline", "int", "degree", "int")); 00359 return v; 00360 } |
|
To be removed.
Reimplemented from CanvasObject.
00391 { 00392 if (closed) { 00393 return (ccs_poly.contains(x, y)); 00394 } 00395 return false; 00396 } |
|
To be removed.
Reimplemented from CanvasObject.
00400 { 00401 if (!getTransformOK()) { 00402 transformICStoCCS(); 00403 } 00404 00405 // adapted from 'Graphics Gems II' - James Arvo, 00406 // chap. 1.3, 'Distance from a point to a line', pages 10-13. 00407 00408 00409 // check if inside enlarged bounding box (== box + SPHERE) 00410 00411 if (!((x >= getX1Ccs() - SPHERE) && (x < getX1Ccs() + getWidthCcs() + SPHERE) && 00412 (y >= getY1Ccs() - SPHERE) && (y < getY1Ccs() + getHeightCcs() + SPHERE))) { 00413 return false; 00414 } 00415 00416 00417 // we are inside the box, now check each line of the polygon 00418 00419 int min_x, min_y, max_x, max_y; 00420 int area, abs1, abs2, distance; 00421 00422 for (int i=0, j=1; i<ccs_poly.npoints; i++, j++) { 00423 00424 if (j == ccs_poly.npoints) { 00425 if (!closed) { 00426 break; 00427 } 00428 j = 0; 00429 } 00430 00431 min_x = Math.min(ccs_poly.xpoints[i], ccs_poly.xpoints[j]); 00432 min_y = Math.min(ccs_poly.ypoints[i], ccs_poly.ypoints[j]); 00433 max_x = Math.max(ccs_poly.xpoints[i], ccs_poly.xpoints[j]); 00434 max_y = Math.max(ccs_poly.ypoints[i], ccs_poly.ypoints[j]); 00435 00436 00437 // check if inside enlarged bounding box of line 00438 00439 if ((x >= min_x - SPHERE) && (x < max_x + SPHERE) && 00440 (y >= min_y - SPHERE) && (y < max_y + SPHERE)) { 00441 00442 00443 // calculate the area of the triangle formed by the two 00444 // CanvasPolyline points and the 'check' point 00445 00446 area = (y - ccs_poly.ypoints[i])* 00447 (ccs_poly.xpoints[j] - ccs_poly.xpoints[i]) - 00448 (x - ccs_poly.xpoints[i])* 00449 (ccs_poly.ypoints[j] - ccs_poly.ypoints[i]); 00450 00451 00452 // calculate approximation of distance perpendicular to 00453 // CanvasLine 00454 00455 00456 abs1 = Math.abs(ccs_poly.xpoints[j] - ccs_poly.xpoints[i]); 00457 abs2 = Math.abs(ccs_poly.ypoints[j] - ccs_poly.ypoints[i]); 00458 00459 distance = (int)(Math.abs(area) / 00460 (abs1 + abs2 - 0.5 * Math.min(abs1, abs2))); 00461 00462 00463 // this approximation can also be used as an 00464 // approximation for the 'true' distance 00465 00466 if (distance <= SPHERE) { 00467 return true; 00468 } 00469 } 00470 } 00471 return false; 00472 } |
|
Reimplemented from ScribbleObject.
00476 { 00477 if (!getTransformOK()) { 00478 transformICStoCCS(); 00479 } 00480 00481 double w_scale = (double)(Math.abs(w))/(double)getWidthCcs(); 00482 double h_scale = (double)(Math.abs(h))/(double)getHeightCcs(); 00483 00484 for (int i=0; i < ccs_poly.npoints; i++) { 00485 ics_xPoints[i] = getX1() + (ics_xPoints[i]-getX1())*w_scale; 00486 ics_yPoints[i] = getY1() + (ics_yPoints[i]-getY1())*h_scale; 00487 } 00488 00489 int[] ccs_vals = { w + getX1Ccs(), h + getY1Ccs() }; 00490 double[] ics_vals = Converter.CCStoICS(ccs_vals, getZoomFactor()); 00491 00492 double tmp_w = ics_vals[0] - getX1(); 00493 double tmp_h = ics_vals[1] - getY1(); 00494 00495 if (w < 0) { 00496 for (int i=0; i < ccs_poly.npoints; i++) { 00497 ics_xPoints[i] += tmp_w; 00498 } 00499 } 00500 if (h < 0) { 00501 for (int i=0; i < ccs_poly.npoints; i++) { 00502 ics_yPoints[i] += tmp_h; 00503 } 00504 } 00505 setZoomFactor(getZoomFactor()); 00506 } |
|
Reimplemented from ScribbleObject.
|
|
Reimplemented from ScribbleFigure.
00524 { 00525 if (!getTransformOK()) { 00526 transformICStoCCS(); 00527 } 00528 00529 if (index >= ccs_poly.npoints) { 00530 return -1; 00531 } 00532 00533 ccs_poly.xpoints[index] = x; 00534 ccs_poly.ypoints[index] = y; 00535 ccs_poly = new Polygon(ccs_poly.xpoints, 00536 ccs_poly.ypoints, ccs_poly.npoints); 00537 00538 transformCCStoICS(); 00539 return index; 00540 } |
|
Reimplemented from ScribbleFigure.
00544 { 00545 if (!getTransformOK()) { 00546 transformICStoCCS(); 00547 } 00548 00549 ccs_poly.addPoint(x, y); 00550 00551 ics_xPoints = new double[ccs_poly.npoints]; 00552 ics_yPoints = new double[ccs_poly.npoints]; 00553 00554 transformCCStoICS(); 00555 } |
|
00559 { 00560 if (!getTransformOK()) { 00561 transformICStoCCS(); 00562 } 00563 00564 if (ccs_poly.npoints <= 2) { 00565 return; 00566 } 00567 00568 double[] tmp_icsXs = new double[ccs_poly.npoints]; 00569 double[] tmp_icsYs = new double[ccs_poly.npoints]; 00570 Polygon tmp_poly = new Polygon(ccs_poly.xpoints, 00571 ccs_poly.ypoints, ccs_poly.npoints); 00572 00573 ccs_poly = new Polygon(); 00574 int index = 0; 00575 00576 for (int i=0, j=1; i<tmp_poly.npoints; i++, j++) { 00577 00578 if (j == tmp_poly.npoints) { 00579 j = 0; 00580 } 00581 if (!(tmp_poly.xpoints[i] == tmp_poly.xpoints[j] && 00582 tmp_poly.ypoints[i] == tmp_poly.ypoints[j])) { 00583 ccs_poly.addPoint(tmp_poly.xpoints[i], 00584 tmp_poly.ypoints[i]); 00585 tmp_icsXs[ccs_poly.npoints - 1] = ics_xPoints[i]; 00586 tmp_icsYs[ccs_poly.npoints - 1] = ics_yPoints[i]; 00587 } 00588 } 00589 00590 ics_xPoints = new double[ccs_poly.npoints]; 00591 ics_yPoints = new double[ccs_poly.npoints]; 00592 00593 transformCCStoICS(); 00594 } |
|
00598 { 00599 if (!getTransformOK()) { 00600 transformICStoCCS(); 00601 } 00602 00603 return ccs_poly.xpoints; 00604 } |
|
00608 { 00609 if (!getTransformOK()) { 00610 transformICStoCCS(); 00611 } 00612 00613 return ccs_poly.ypoints; 00614 } |
|
00629 { 00630 setComplex(true); 00631 this.closed = closed; 00632 00633 ics_xPoints = new double[npoints]; 00634 ics_yPoints = new double[npoints]; 00635 00636 for (int i=0; i < npoints; i++) { 00637 ics_xPoints[i] = xpoints[i]; 00638 ics_yPoints[i] = ypoints[i]; 00639 } 00640 00641 setStartX(xpoints[0]); 00642 setStartY(ypoints[0]); 00643 00644 transformICStoCCS(); 00645 00646 // _mediator = new HxMediatorPeer(); 00647 } |
|
Perform a full ICS to CCS coordinate transformation.
Reimplemented from CanvasObject. Reimplemented in CanvasColoredPolyline.
00651 { 00652 if (ics_xPoints != null) { 00653 int[] ccs_xs = Converter.ICStoCCS(ics_xPoints, getZoomFactor()); 00654 int[] ccs_ys = Converter.ICStoCCS(ics_yPoints, getZoomFactor()); 00655 00656 ccs_poly = new Polygon(ccs_xs, ccs_ys, ccs_xs.length); 00657 setBox(); 00658 super.transformICStoCCS(); 00659 } 00660 } |
|
Perform a full CCS to ICS coordinate transformation. This function is used only for scribbled objects. Reimplemented from CanvasObject. Reimplemented in CanvasColoredPolyline.
00664 { 00665 double[] xs = Converter.CCStoICS(ccs_poly.xpoints, getZoomFactor()); 00666 double[] ys = Converter.CCStoICS(ccs_poly.ypoints, getZoomFactor()); 00667 00668 for (int i=0; i < ccs_poly.npoints; i++) { 00669 ics_xPoints[i] = xs[i]; 00670 ics_yPoints[i] = ys[i]; 00671 } 00672 setBox(); 00673 super.transformCCStoICS(); 00674 } |
|
00678 { 00679 double ics_maxX = 0.; 00680 double ics_maxY = 0.; 00681 00682 setX1(Double.MAX_VALUE); 00683 setY1(Double.MAX_VALUE); 00684 00685 for (int i=0; i < ics_xPoints.length; i++) { 00686 if (ics_xPoints[i] < getX1()) { 00687 setX1(ics_xPoints[i]); 00688 } 00689 if (ics_yPoints[i] < getY1()) { 00690 setY1(ics_yPoints[i]); 00691 } 00692 if (ics_xPoints[i] > ics_maxX) { 00693 ics_maxX = ics_xPoints[i]; 00694 } 00695 if (ics_yPoints[i] > ics_maxY) { 00696 ics_maxY = ics_yPoints[i]; 00697 } 00698 } 00699 00700 setWidth(ics_maxX - getX1()); 00701 setHeight(ics_maxY - getY1()); 00702 00703 setTransformOK(false); 00704 } |
|
|
|
|
|
|
|
|