Mastering Methods: Nested Loops Part 3
220 likes | 322 Views
Learn to write efficient methods and blend images perfectly in this tutorial on Nested Loops Part 3. Develop skills to create collages, copy algorithms, and blend pictures effectively.
Mastering Methods: Nested Loops Part 3
E N D
Presentation Transcript
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