Revision 38786 branches/v2_0_0_prep/libraries/libFMap_geometries/src/org/gvsig/fmap/geom/primitive/impl/Arc2D.java

View differences:

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