Revision 38786
branches/v2_0_0_prep/libraries/libFMap_geometries/src-test/org/gvsig/fmap/geom/primitive/ArcTest.java | ||
---|---|---|
27 | 27 |
|
28 | 28 |
package org.gvsig.fmap.geom.primitive; |
29 | 29 |
|
30 |
import java.awt.geom.Rectangle2D; |
|
31 |
|
|
30 | 32 |
import junit.framework.Assert; |
31 | 33 |
|
32 | 34 |
import org.gvsig.fmap.geom.GeometryLocator; |
... | ... | |
83 | 85 |
assertEquals(1.0, arc.getInitPoint().getY(), 0); |
84 | 86 |
assertEquals(0, arc.getEndPoint().getX(), 0); |
85 | 87 |
assertEquals(1, arc.getEndPoint().getY(), 0); |
88 |
|
|
89 |
// ================================= |
|
90 |
|
|
91 |
double deg_rad = Math.PI / 180.0; |
|
92 |
Point cp = (Point)manager.create(TYPES.POINT, SUBTYPES.GEOM2D); |
|
93 |
cp.setX(10); |
|
94 |
cp.setY(2); |
|
95 |
|
|
96 |
arc.setPointsStartExt(cp, 5, 45*deg_rad, 135*deg_rad); |
|
97 |
assertEquals(10, arc.getEndPoint().getX(), 0.000001); |
|
98 |
assertEquals(-3, arc.getEndPoint().getY(), 0.000001); |
|
99 |
|
|
100 |
Rectangle2D rect = new Rectangle2D.Double(0, 0, 9, 9); |
|
101 |
|
|
102 |
arc.setPointsStartEnd(cp, 5, 45*deg_rad, -90*deg_rad); |
|
103 |
assertFalse(arc.intersects(rect)); |
|
104 |
|
|
105 |
arc.setPointsStartEnd(cp, 5, 45*deg_rad, 5d*Math.PI/2d); |
|
106 |
assertTrue(arc.intersects(rect)); |
|
107 |
|
|
86 | 108 |
} |
109 |
|
|
110 |
|
|
111 |
|
|
87 | 112 |
} |
88 | 113 |
|
89 | 114 |
|
branches/v2_0_0_prep/libraries/libFMap_geometries/src/org/gvsig/fmap/geom/primitive/Arc.java | ||
---|---|---|
74 | 74 |
* angleExt < 0 means "advancing counterclockwise". |
75 | 75 |
*/ |
76 | 76 |
void setPoints (Point center, double radius, double startAngle, double angleExt); |
77 |
|
|
78 |
/** |
|
79 |
* Sets the values to define an arc. |
|
80 |
* @param center The center of the arc. |
|
81 |
* @param radius The radius. |
|
82 |
* @param startAngle The start angle of the arc (in radians) |
|
83 |
* @param angleExt The angular extent of the arc (in radians). |
|
84 |
* |
|
85 |
* The sign convention is: |
|
86 |
* |
|
87 |
* startAngle = 0 is "3 o'clock"; |
|
88 |
* startAngle = (PI / 3) is "1 o'clock"; |
|
89 |
* angleExt > 0 means "advancing clockwise"; |
|
90 |
* angleExt < 0 means "advancing counterclockwise". |
|
91 |
*/ |
|
92 |
void setPointsStartExt (Point center, double radius, double startAngle, double angleExt); |
|
93 |
|
|
94 |
/** |
|
95 |
* Sets the values to define an arc. The arc will go from |
|
96 |
* startAngle to endAngle clockwise. Angles will be |
|
97 |
* normalized to ]-PI, PI] (-PI excluded) before creating |
|
98 |
* the arc. |
|
99 |
* |
|
100 |
* @param center The center of the arc. |
|
101 |
* @param radius The radius. |
|
102 |
* @param startAngle The start angle of the arc (in radians) |
|
103 |
* @param endAngle The end angle of the arc (in radians). |
|
104 |
* |
|
105 |
*/ |
|
106 |
void setPointsStartEnd (Point center, double radius, double startAngle, double endAngle ); |
|
77 | 107 |
|
78 |
|
|
79 | 108 |
/** |
80 | 109 |
* Return the first point that has been used to create the arc. |
81 | 110 |
* @return |
branches/v2_0_0_prep/libraries/libFMap_geometries/src/org/gvsig/fmap/geom/primitive/impl/Arc2D.java | ||
---|---|---|
515 | 515 |
Point2D _center = new java.awt.geom.Point2D.Double(center.getCoordinateAt(0), center.getCoordinateAt(1)); |
516 | 516 |
setPoints(_center, radius, initAngle, angleExt); |
517 | 517 |
} |
518 |
|
|
519 |
/* (non-Javadoc) |
|
520 |
* @see org.gvsig.fmap.geom.primitive.Arc#setPointsStartExt(org.gvsig.fmap.geom.primitive.Point, double, double, double) |
|
521 |
*/ |
|
522 |
public void setPointsStartExt(Point center, double radius, |
|
523 |
double startAngle, double angleExt) { |
|
524 |
|
|
525 |
setPoints(center, radius, startAngle, angleExt); |
|
526 |
} |
|
518 | 527 |
|
519 |
/* (non-Javadoc) |
|
528 |
/* (non-Javadoc) |
|
529 |
* @see org.gvsig.fmap.geom.primitive.Arc#setPointsStartEnd(org.gvsig.fmap.geom.primitive.Point, double, double, double) |
|
530 |
*/ |
|
531 |
public void setPointsStartEnd(Point center, double radius, |
|
532 |
double startAngle, double endAngle) { |
|
533 |
|
|
534 |
if (startAngle == endAngle) { |
|
535 |
setPointsStartExt(center, radius, startAngle, 0); |
|
536 |
} else { |
|
537 |
|
|
538 |
/* |
|
539 |
* Normalize then force clockwise: |
|
540 |
*/ |
|
541 |
double norm_start = normalizeAngle(startAngle); |
|
542 |
double norm_end = normalizeAngle(endAngle); |
|
543 |
double ang_ext = 0; |
|
544 |
|
|
545 |
// clockwise |
|
546 |
// ang_ext must be positive |
|
547 |
if (norm_start >= norm_end) { |
|
548 |
ang_ext = norm_start - norm_end; |
|
549 |
} else { |
|
550 |
ang_ext = 2 * Math.PI - (norm_end - norm_start); |
|
551 |
} |
|
552 |
|
|
553 |
// finally call other method with ang_ext |
|
554 |
setPointsStartExt(center, radius, startAngle, ang_ext); |
|
555 |
} |
|
556 |
} |
|
557 |
|
|
558 |
/** |
|
559 |
* Leaves the angle between PI and -PI |
|
560 |
* @param angle (radians) |
|
561 |
* @return |
|
562 |
*/ |
|
563 |
private double normalizeAngle(double angle) { |
|
564 |
|
|
565 |
if (angle > -Math.PI && angle <= Math.PI) { |
|
566 |
return angle; |
|
567 |
} |
|
568 |
|
|
569 |
if (angle == Double.NEGATIVE_INFINITY |
|
570 |
|| angle == Double.POSITIVE_INFINITY) { |
|
571 |
return 0; |
|
572 |
} |
|
573 |
|
|
574 |
double abs_ang = Math.abs(angle); |
|
575 |
double remove = Math.floor(abs_ang / (2 * Math.PI)); |
|
576 |
remove = remove * 2 * Math.PI; |
|
577 |
double resp = 0; |
|
578 |
|
|
579 |
if (angle > 0) { |
|
580 |
resp = angle - remove; |
|
581 |
if (resp > Math.PI) { |
|
582 |
// final adjustment |
|
583 |
resp = resp - 2 * Math.PI; |
|
584 |
} |
|
585 |
} else { |
|
586 |
resp = angle + remove; |
|
587 |
if (resp <= -Math.PI) { |
|
588 |
// final adjustment |
|
589 |
resp = resp + 2 * Math.PI; |
|
590 |
} |
|
591 |
} |
|
592 |
|
|
593 |
return resp; |
|
594 |
} |
|
595 |
|
|
596 |
/* (non-Javadoc) |
|
520 | 597 |
* @see org.gvsig.fmap.geom.primitive.Arc#setPoints(java.awt.geom.Point2D, double, double, double) |
521 | 598 |
*/ |
522 | 599 |
private void setPoints(Point2D center, double radius, double initAngle, |
... | ... | |
570 | 647 |
} |
571 | 648 |
} |
572 | 649 |
|
650 |
|
|
651 |
|
|
573 | 652 |
|
574 | 653 |
} |
Also available in: Unified diff