Revision 38786

View differences:

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