133 lines
4.5 KiB
Java
133 lines
4.5 KiB
Java
|
import java.awt.*;
|
||
|
import java.awt.geom.*;
|
||
|
|
||
|
/**
|
||
|
* Diese Klasse veranschaulicht Vereinigung, Durchschnitt, Differenz und
|
||
|
* symmetrische Differenz von Shapes.
|
||
|
* Die Operationen werden auf einen und ein Rechteck angewendet.
|
||
|
*
|
||
|
* @author Frank Klawonn
|
||
|
* Letzte Aenderung 07.01.2005
|
||
|
*/
|
||
|
public class AreaExampleColour extends Frame
|
||
|
{
|
||
|
//Konstruktor
|
||
|
AreaExampleColour()
|
||
|
{
|
||
|
//Ermoeglicht das Schliessen des Fensters
|
||
|
addWindowListener(new MyFinishWindow());
|
||
|
}
|
||
|
|
||
|
|
||
|
public void paint(Graphics g)
|
||
|
{
|
||
|
Graphics2D g2d = (Graphics2D) g;
|
||
|
//Verwendung von Antialiasing, um die Raender weniger ausgefranst
|
||
|
//erscheinen zu lassen
|
||
|
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
|
||
|
//Radius des Kreises
|
||
|
int radius = 50;
|
||
|
//Positionierung des ersten Kreises
|
||
|
int startx = 100;
|
||
|
int starty = 100;
|
||
|
//Groesse des Rechtecks
|
||
|
int width = 70;
|
||
|
int height = 100;
|
||
|
//Positionierung des ersten Rechtecks relativ zum Kreis
|
||
|
int rectshiftx = -10;
|
||
|
int rectshifty = 10;
|
||
|
//Verschiebung des Rechtecks und des Kreises nach rechts,
|
||
|
//wenn eine der vier Kombinationsoperationen ausgefuehrt wird.
|
||
|
int xshift = 140;
|
||
|
//Vereinigungen: add
|
||
|
//Erzeuge Kreis und Rechteck.
|
||
|
Ellipse2D.Double circle1 = circleDouble(startx,starty,radius);
|
||
|
Rectangle2D.Double rect1 = new Rectangle2D.Double(startx+rectshiftx,
|
||
|
starty+rectshifty,
|
||
|
width,
|
||
|
height);
|
||
|
//Wandle Kreis und Rechteck in Area-Objekte um.
|
||
|
Area c1 = new Area(circle1);
|
||
|
Area r1 = new Area(rect1);
|
||
|
//Berechnung der Vereinigung
|
||
|
c1.add(r1);
|
||
|
//Zeichnen der Vereinigung
|
||
|
g2d.setPaint(Color.green);
|
||
|
g2d.fill(c1);
|
||
|
//Durchschnitt: intersect
|
||
|
//Erzeuge Kreis und Rechteck (nach rechts verschoben)
|
||
|
Ellipse2D.Double circle2 = circleDouble(startx+xshift,starty,radius);
|
||
|
Rectangle2D.Double rect2 = new Rectangle2D.Double(startx+rectshiftx+xshift,
|
||
|
starty+rectshifty,
|
||
|
width,
|
||
|
height);
|
||
|
//Wandle Kreis und Rechteck in Area-Objekte um.
|
||
|
Area c2 = new Area(circle2);
|
||
|
Area r2 = new Area(rect2);
|
||
|
//Berechnung des Durchschnitts
|
||
|
c2.intersect(r2);
|
||
|
//Zeichnen des Durchschnitts
|
||
|
g2d.setPaint(Color.red);
|
||
|
g2d.fill(c2);
|
||
|
//Differenz: subtract
|
||
|
//Erzeuge Kreis und Rechteck (nach rechts verschoben)
|
||
|
Ellipse2D.Double circle3 = circleDouble(startx+2*xshift,starty,radius);
|
||
|
Rectangle2D.Double rect3 = new Rectangle2D.Double(startx+rectshiftx+2*xshift,
|
||
|
starty+rectshifty,
|
||
|
width,
|
||
|
height);
|
||
|
//Wandle Kreis und Rechteck in Area-Objekte um.
|
||
|
Area c3 = new Area(circle3);
|
||
|
Area r3 = new Area(rect3);
|
||
|
//Berechnung der Differenz
|
||
|
c3.subtract(r3);
|
||
|
//Zeichnen der Differenz
|
||
|
g2d.setPaint(Color.blue);
|
||
|
g2d.fill(c3);
|
||
|
//symmetrische Differenz: XOR
|
||
|
//Erzeuge Kreis und Rechteck (nach rechts verschoben)
|
||
|
Ellipse2D.Double circle4 = circleDouble(startx+3*xshift,starty,radius);
|
||
|
Rectangle2D.Double rect4 = new Rectangle2D.Double(startx+rectshiftx+3*xshift,
|
||
|
starty+rectshifty,
|
||
|
width,
|
||
|
height);
|
||
|
//Wandle Kreis und Rechteck in Area-Objekte um.
|
||
|
Area c4 = new Area(circle4);
|
||
|
Area r4 = new Area(rect4);
|
||
|
//Berechnung der symmetrischen Differenz
|
||
|
c4.exclusiveOr(r4);
|
||
|
//Zeichnen der Differenz
|
||
|
g2d.setPaint(Color.yellow);
|
||
|
g2d.fill(c4);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Erzeugt einen Kreis mit Radius radius und Mittelpunkt (x,y).
|
||
|
*
|
||
|
* @param x x-Koordinate des Kreismittelpunktes
|
||
|
* @param y y-Koordinate des Kreismittelpunktes
|
||
|
* @param radius Der Radius des Kreises
|
||
|
*
|
||
|
* @return Kreis mit Radius radius und Mittelpunkt (x,y)
|
||
|
*/
|
||
|
public Ellipse2D.Double circleDouble(double x, double y, double radius)
|
||
|
{
|
||
|
return(new Ellipse2D.Double(x-radius,y-radius,2*radius,2*radius));
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
public static void main(String[] argv)
|
||
|
{
|
||
|
AreaExampleColour f = new AreaExampleColour();
|
||
|
f.setTitle("Kombination von Flaechen");
|
||
|
f.setSize(600,250);
|
||
|
f.setVisible(true);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|