Revision 38786 branches/v2_0_0_prep/libraries/libFMap_geometries/src/org/gvsig/fmap/geom/primitive/impl/Arc2D.java
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