Lösungen 1. Aufgabe Gegeben ist ein Path-Objekt mit folgender Beschreibung des Hauses vom Nikolaus: 1. Implementiere die paint()-methode im Rahmen eines Applets. Führe das Applet aus und zeige über das Applet-Fenster) an, was vom Haus des Nikolaus aufgrund der angegenen Punkte (mit den Abmessungen des Hauses vom Nikolaus) zu sehen ist. 2. Verschiebe das Haus des Nikolaus um (100,100). // Transformation at.settotranslation(100.0f,100.0f); g2d.transform(at); 3
3. Zusätzlich zur Translation soll das Haus noch 45 Grad im Uhrzeigersinn gedreht werden // Transformation // Setzen der affinen Transformation at.settotranslation(100.0f,100.0f); // Erweitern der affinen Transformation at.rotate(math.pi/4); g2d.transform(at); 4. Die Geometrie zum Haus des Nikolaus soll um den Skalenfaktor 1.5 vergrößert werden. // Transformation // Setzen der affinen Transformation at.settotranslation(100.0f,100.0f); // Erweitern der affinen Transformation at.rotate(math.pi/4); // Skalieren at.scale(1.5f,1.5f); g2d.transform(at); // Zeichnen 5. Welcher unerwünschte Nebeneffekt ist dabei aufgetreten? Das Fenster zeigt: Die Skalierung in Java2D beeinflusst auch die Stroke- und Paint-Eigenschaften, d.h. bei einer Vergrößerung wird auch die Liniendicke größer. 4
2. Aufgabe Implementiere eine Applikation 2, die mit Hilfe von Java2D die folgenden geometrischen Formen erzeugt. Die dritte Figur von links zeigt eine Füllung über TexturePaint. import java.awt.event.*; import java.awt.image.*; public class PR43705 extends Frame public PR43705() super("zeichnen geometrischer Formen"); setsize(425,160); setbackground(color.lightgray); setvisible(true); g2d.setpaint(new GradientPaint(5,30, Color.blue, 35,100, Color.yellow, true)); g2d.fill(new Ellipse2D.Double(5,30,65,100)); g2d.setpaint(color.red); g2d.setstroke(new BasicStroke(10.0f)); g2d.draw(new Rectangle2D.Double(80,30,65,100)); BufferedImage buffimage = new BufferedImage(10,10,BufferedImage.TYPE_INT_RGB); Graphics2D gg = buffimage.creategraphics(); gg.setcolor(color.yellow); gg.fillrect(0,0,10,10); gg.setcolor( Color.black ); // draw in black gg.drawrect(1,1,6,6); // draw a rectangle gg.setcolor(color.blue ); // draw in blue gg.fillrect(1,1,3,3); // draw a filled rectangle gg.setcolor(color.red ); // draw in red gg.fillrect(4,4,3,3); // draw a filled rectangle // paint buffimage onto the Frame g2d.setpaint( new TexturePaint( buffimage, new Rectangle(10,10))); 2 pr43700 5
g2d.fill( new RoundRectangle2D.Double( 155, 30, 75, 100, 50, 50 )); // draw 2D pie-shaped arc in white g2d.setpaint( Color.white ); g2d.setstroke( new BasicStroke( 6.0f ) ); g2d.draw( new Arc2D.Double( 240, 30, 75, 100, 0, 270, Arc2D.PIE)); // draw 2D lines in green and yellow g2d.setpaint( Color.green ); g2d.draw( new Line2D.Double( 395, 30, 320, 150 ) ); float dashes[] = 10 ; g2d.setpaint( Color.yellow ); g2d.setstroke( new BasicStroke(4,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND, 10, dashes, 0 ) ); g2d.draw( new Line2D.Double( 320, 30, 395, 150 ) ); public static void main(string args[]) PR43705 app = new PR43705(); app.addwindowlistener(new WindowAdapter() public void windowclosing(windowevent e) System.exit(0); ); 6
3. Aufgabe Implementiere eine Applikation 3, die mit Java2D den folgenden Sternenkranz erzeugt. // Demonstrating a general path import java.awt.event.*; public class PR43706 extends Frame public PR43706() super( "Zeichnen Sternenkranz" ); setbackground( Color.yellow ); setsize( 400, 400 ); setvisible(true); public void paint( Graphics g ) int xpoints[] = 55, 67, 109, 73, 83, 55, 27, 37, 1, 43 ; int ypoints[] = 0, 36, 36, 54, 96, 72, 96, 54, 36, 36 ; Graphics2D g2d = ( Graphics2D ) g; // create a star from a series of points GeneralPath star = new GeneralPath(); // set the initial coordinate of the General Path star.moveto( xpoints[ 0 ], ypoints[ 0 ] ); // create the star--this does not draw the star for ( int k = 1; k < xpoints.length; k++ ) star.lineto( xpoints[ k ], ypoints[ k ] ); // close the shape star.closepath(); 3 pr43700 7
// translate the origin to (200, 200) g2d.translate( 200, 200 ); // rotate around origin and draw stars in random colors for ( int j = 1; j <= 20; j++ ) g2d.rotate( Math.PI / 10.0 ); g2d.setcolor( new Color( ( int ) ( Math.random() * 256 ), ( int ) ( Math.random() * 256 ), ( int ) ( Math.random() * 256 ) ) ); g2d.fill( star ); // draw a filled star public static void main( String args[] ) PR43706 app = new PR43706(); app.addwindowlistener( new WindowAdapter() public void windowclosing( WindowEvent e ) System.exit( 0 ); ); 4. Aufgabe: Animation mit Java2D 1. Zeichne mit Hilfe eines Applets 4 an den Koordinatenursprung ein rotes Rechteck (200 Pixel breit, 100 Pixel hoch), das nach rechts unten aus dem Fenster verschwindet. import java.applet.*; public class PR43700 extends Applet Rectangle2D.Float rechteck = new Rectangle2D.Float( 0.0f,0.0f,200.0f,100.0f); Stroke stroke = new BasicStroke(5.0f); g2d.setstroke(stroke); for (int i = 0;i < 100; i++) at.translate(10.0f,10.0f); g2d.settransform(at); g2d.setpaint(color.black); g2d.draw(rechteck); g2d.setpaint(color.red); g2d.fill(rechteck); try Thread.sleep(2000); catch(exception e) g2d.setpaint(color.white); g2d.draw(rechteck); g2d.fill(rechteck); 4 pr43700 8
2. Verbessere auftretendes Flimmern bei der Animation durch "Double Buffering". import java.applet.*; public class PR43701 extends java.applet.applet private Image memimage = null; public void createbuffer() Dimension d = getsize(); if ((memimage == null) (memimage.getwidth(null)!= d.width) (memimage.getheight(null)!= d.height)) memimage = createimage(d.width,d.height); Rectangle2D.Float rechteck = new Rectangle2D.Float( 0.0f,0.0f,200.0f,100.0f); Stroke stroke = new BasicStroke(5.0f); createbuffer(); Graphics2D g2m = (Graphics2D) memimage.getgraphics(); for (int i = 0;i < 100; i++) g2m.setcolor(getbackground()); // g2m.setstroke(stroke); g2m.fillrect(0,0,getsize().width,getsize().height); at.translate(2.0f,2.0f); g2m.settransform(at); g2m.setpaint(color.black); g2m.draw(rechteck); g2m.setpaint(color.red); g2m.fill(rechteck); g2d.drawimage(memimage,0,0,null); try Thread.sleep(2000); catch(exception e) 9