160 likes | 242 Views
Drawing in Java – part 3. Barb Ericson Georgia Institute of Technology September 2006. Learning Goals. Understand at a conceptual and practical level What inheritance means How to do a general scale method using the java.awt.geom.AffineTransform class How to draw with a gradient paint
E N D
Drawing in Java – part 3 Barb Ericson Georgia Institute of Technology September 2006 Georgia Institute of Technology
Learning Goals • Understand at a conceptual and practical level • What inheritance means • How to do a general scale method using the java.awt.geom.AffineTransform class • How to draw with a gradient paint • Paint that changes from one color to another • What an interface is used for • How to clip a picture to a shape Georgia Institute of Technology
Inheritance • Class Graphics2D inherits from Graphics • It inherits fields and methods • Graphics has a drawImage method • Graphics2D inherits this method from Graphics • The API shows the parent class • And the inherited methods • Look in package java.awt and then at the class Graphics2D • http://java.sun.com/j2se/1.5.0/docs/api/index.html Georgia Institute of Technology
General Scaling • Scaling a picture is to make it larger or smaller • Scale up is larger • Scale down is smaller • We can use the class AffineTransform in the java.awt.geom package • Create an object of the class AffineTransform • Set up the scaling using the method scale • Use the AffineTransform object when you draw the image Georgia Institute of Technology
General Scale Method public Picture scale(double xFactor, double yFactor) { // set up the scale transform AffineTransform scaleTransform = new AffineTransform(); scaleTransform.scale(xFactor,yFactor); // create a new picture object that is the right size Picture result = new Picture((int) (getWidth() * xFactor), (int) (getHeight() * yFactor)); // get the graphics 2d object to draw on the result Graphics graphics = result.getGraphics(); Graphics2D g2 = (Graphics2D) graphics; // draw the current image onto the result image scaled g2.drawImage(this.getImage(),scaleTransform,null); return result; } Georgia Institute of Technology
Testing General Scale Method • Notice that the general scale method creates and returns a new picture of the appropriate size • So to see the result we need to save a reference to it in a variable String file = FileChooser.getMediaPath("mattDoor.jpg"); Picture p = new Picture(file); Picture p1 = p.scale(2.0,0.5); p1.show(); Georgia Institute of Technology
Drawing with a Gradient Paint Point 1, Color 1 • Instead of filling with one color you can fill with a paint that changes from one color to another • java.awt.GradientPaint • Create by specifying a point and the color at that point and then a second point and the color at that point. • There will be a change from one color to the other Point 2, Color 2 Georgia Institute of Technology
The drawSun Method public void drawSun(int x, int y, int width, int height) { // get the graphics2D object for this picture Graphics g = this.getGraphics(); Graphics2D g2 = (Graphics2D) g; // create the gradient for painting from yellow to red with // yellow at the top of the sun and red at the bottom float xMid = (float) (width / 0.5 + x); GradientPaint gPaint = new GradientPaint(xMid, y, Color.yellow, xMid, y + height, Color.red); // set the gradient and draw the ellipse g2.setPaint(gPaint); g2.fill(new Ellipse2D.Double(x,y,width,height)); } Georgia Institute of Technology
Testing drawSun • String file = FileChooser.getMediaPath(“beach.jpg”); • Picture p = new Picture(file); • p.drawSun(201,80,40,40); • p.show(); Georgia Institute of Technology
Paint is an Interface • Look up the API for Graphics2D • Find the setPaint method • Notice that it takes a Paint object as a parameter • How come we can pass this method a java.awt.Color object or a java.awt.GradientPaint object? • They both implement the Paint interface • Objects can be passed to a method that requires an object of an interface type • As long as the object is from a class that implements that interface • Or inherits from a class that implements the interface Georgia Institute of Technology
Why Use an Interface? • A USB interface lets you plug in different devices • Camera, disk drive, key drive, etc • The computer doesn’t care what the device is • Just that it uses the USB interface • Java interfaces are the same • They let you plug in different classes as long as they implement the interface • This means the implementing class must include all the methods defined in the interface Georgia Institute of Technology
Clipping to a Shape • You can specify a shape to clip the image to when you draw it • Ellipse2D.Double ellipse = new Ellipse2D.Double(0,0,width,height); • g2.setClip(ellipse); • And only the portion of the image that is inside that shape will be drawn • g2.drawImage(this.getImage(),0,0,width, height,null); Georgia Institute of Technology
public Picture clipToEllipse() { int width = this.getWidth(); int height = this.getHeight(); Picture result = new Picture(width,height); // get the graphics2D object Graphics g = result.getGraphics(); Graphics2D g2 = (Graphics2D) g; // create an ellipse for clipping Ellipse2D.Double ellipse = new Ellipse2D.Double(0,0,width,height); // use the ellipse for clipping g2.setClip(ellipse); // draw the image g2.drawImage(this.getImage(), 0,0,width, height,null); // return the result return result; } Clipping to an Ellipse Method Georgia Institute of Technology
Testing clipToEllipse • This method creates a new picture and returns it so in order to see if we will need to save a reference to it String file = FileChooser.getMediaPath(“beach.jpg”); Picture p = new Picture(file); Picture p2 = p.clipToEllipse(); p2.show(); Georgia Institute of Technology
Clipping Exercise • Write a method that will clip a picture to a triangle • You can use the java.awt.geom.GeneralPath class to create the path to clip to • You can create a new GeneralPath passing it a • Line2D.Double object • You can append more • Line2D.Double objects Georgia Institute of Technology
Summary • Inheritance means that the child class gets all the fields and methods of the parent class • See this in the API for Graphics2D • You can use a class to do general scaling and rotation • java.awt.geom.AffineTransform • You can draw with a gradient paint • That changes from one color to another • Objects of classes that implement an interface can be said to be of that type • And can be passed as parameters to methods that take that type • You can clip a picture to a geometric object • Or a path Georgia Institute of Technology