220 likes | 312 Views
Nested Loops – part 3. Barb Ericson Georgia Institute of Technology Nov 2009. Learning Goals. Understand at a conceptual and practical level What makes a good method? How to write more general methods? By adding parameters to the method How to rewrite methods? To reduce copied code
E N D
Nested Loops – part 3 Barb Ericson Georgia Institute of Technology Nov 2009 NestedLoops-part3
Learning Goals • Understand at a conceptual and practical level • What makes a good method? • How to write more general methods? • By adding parameters to the method • How to rewrite methods? • To reduce copied code • How to blend two pictures together • Like blending two sounds NestedLoops-part3
What makes a Good Method? • A method should do one and only one thing • Accomplish some task • The name should tell you what it does • A method can call other methods to do some of the work • Procedural decomposition • We shouldn’t copy code between methods • We should make general methods that are reusable • A method should be in the class that has the data the method is working on NestedLoops-part3
Where the last two methods general? • We specified the file to copy from in the method • Meaning we would need to change the method • or make another method • to copy a different picture NestedLoops-part3
General Copy Algorithm • Create a method that copies pixels from a passed source picture • Giving a start x and y and end x and y for the source picture • If the start x and y and end x and y cover the entire picture then the whole picture will be copied • If the start x and y and end x and y are part of the picture then cropping will occur • To the current picture object with a target start x and target start y • If the start x and y are 0 then it copies to the upper left corner NestedLoops-part3
General Copy Algorithm • Loop through the x values between xStart and xEnd • Loop through the y values between yStart and yEnd • Get the pixel from the source picture for the current x and y values • Get the pixel from the target picture for the targetStartX + x and targetStartY + y values • Set the color in the target pixel to the color in the source pixel NestedLoops-part3
General Copy Method public void copy(Picture sourcePicture, int startX, int startY, int endX, int endY, int targetStartX, int targetStartY) { Pixel sourcePixel = null; Pixel targetPixel = null; // loop through the x values for (int x = startX, tx = targetStartX; x < endX; x++, tx++) { // loop through the y values for (int y = startY, ty = targetStartY; y < endY; y++, ty++) { NestedLoops-part3
General Copy Method - Continued // copy the source color to the target color sourcePixel = sourcePicture.getPixel(x,y); targetPixel = this.getPixel(tx,ty); targetPixel.setColor(sourcePixel.getColor()); } } } NestedLoops-part3
Creating a Collage • We can use the general copy method to make it easier to create an image collage. NestedLoops-part3
Collage Method /** * Method to copy two flowers in a pattern to the * top of the current picture */ public void copyFlowersBetter() { // create the flower pictures Picture flower1Picture = new Picture(FileChooser.getMediaPath("flower1.jpg")); Picture flower2Picture = new Picture(FileChooser.getMediaPath("flower2.jpg")); // copy the first flower picture this.copyPicture(flower1Picture,0); NestedLoops-part3
Collage Method - continued // copy the flower2 picture starting withx = 100 this.copyPicture(flower2Picture,100); // copy the flower1 negated to x = 200 in the canvas flower1Picture.negate() ; this.copyPicture(flower1Picture,200); /* clear the blue in flower 2 picture and * add at x=300 in the canvas */ flower2Picture.clearBlue(); this.copyPicture(flower2Picture,300); // copy the negated flower 1 to x=400 this.copyPicture(flower1Picture,400); } NestedLoops-part3
Challenge • Rewrite your collage method to use the general copy method NestedLoops-part3
Blend Pictures • If we want to blend two pictures we need to take 50% of the red from one picture and add it to 50% of the red from the other picture • And do the same for blue and green NestedLoops-part3
Blend Pictures Algorithm • Create the two pictures to blend • Copy the pixels from the first part of picture1 • First 150 columns from picture1 • X loops from 0 and stops when equal to 150 • Y loops from 0 and stops when equal to the picture1 height • Copy the rest of the columns from picture1 blended with the pixels from picture2 • Set the color to a new color that is a combination of half of the red from each pictures, half of the green from each picture and half of the blue from each picture • X loops from 150 to the width of picture1 • Y loops from 0 to the height of picture1 • Copy the rest of the pixels from picture2 NestedLoops-part3
Blend Pictures Method public void blendPictures() { // create the sister pictures Picture katiePicture = new Picture(FileChooser.getMediaPath("KatieFancy.jpg")); Picture jennyPicture = new Picture(FileChooser.getMediaPath("JenParty.jpg")); // declare the source and target pixel variables Pixel katiePixel = null; Pixel jennyPixel = null; Pixel targetPixel = null; /* declare the target x and source x since we will need * the values after the for loop */ int sourceX = 0; int targetX = 0; NestedLoops-part3
blendPictures() continued // copy the first 150 pixels of katie to the canvas for (; sourceX < 150; sourceX++, targetX++) { for (int sourceY=0, targetY=0; sourceY < katiePicture.getHeight(); sourceY++, targetY++) { katiePixel = katiePicture.getPixel (sourceX,sourceY) ; targetPixel = this.getPixel(targetX,targetY); targetPixel.setColor(katiePixel.getColor()); } } NestedLoops-part3
blendPictures() continued /* copy 50% of katie and 50% of jenny till * the end of katie’s width */ for (; sourceX < katiePicture.getWidth(); sourceX++, targetX++) { for (int sourceY=0,targetY=0; sourceY < katiePicture.getHeight(); sourceY++, targetY++) { katiePixel = katiePicture.getPixel(sourceX,sourceY); jennyPixel = jennyPicture.getPixel(sourceX - 150,sourceY); targetPixel = this.getPixel(targetX,targetY); targetPixel.setColor( new Color((int) (katiePixel.getRed() * 0.5 + jennyPixel.getRed() * 0.5), (int) (katiePixel.getGreen() * 0.5 + jennyPixel.getGreen() * 0.5), (int) (katiePixel.getBlue() * 0.5 + jennyPixel.getBlue() * 0.5))); } } NestedLoops-part3
blendPictures() continued // copy the rest of Jenny sourceX = sourceX - 150; for (; sourceX < jennyPicture.getWidth(); sourceX++, targetX++) { for (int sourceY = 0, targetY = 0; sourceY < jennyPicture.getHeight(); sourceY++, targetY++) { jennyPixel = jennyPicture.getPixel(sourceX,sourceY); targetPixel = this.getPixel(targetX,targetY); targetPixel.setColor(jennyPixel.getColor()); } } } NestedLoops-part3
Trying out blendPictures() > String fileName = FileChooser.getMediaPath("640x480.jpg"); > Picture picture = new Picture(fileName); > picture.blendPictures(); > picture.show(); NestedLoops-part3
For Loop Syntax • The general for loop syntax is: for (init area ; continuation test; change area) { • Each part of this loop is optional • But the semicolons are required • You can only have 2 semicolons • We didn't put anything in the init area since we wanted to keep using the values of sourceX and targetX NestedLoops-part3
Challenge • Write a method to blend two pictures together • And only use 25% of one picture's color added to 75% of the other picture's color • Also blend the entire pictures together • Best to use two pictures of the same size NestedLoops-part3
Summary • To copy part of one picture to another • Change the start and end conditions in the for loop • A good method should do one and only one thing • Use parameters to make methods more reusable • Don’t copy code from one method to another • Create a general method instead • And call the general method from other methods • You can blend pictures together NestedLoops-part3