1 / 22

Nested Loops – part 3

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

sidone
Download Presentation

Nested Loops – part 3

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Nested Loops – part 3 Barb Ericson Georgia Institute of Technology Nov 2009 NestedLoops-part3

  2. 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

  3. 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

  4. 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

  5. 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

  6. 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

  7. 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

  8. 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

  9. Creating a Collage • We can use the general copy method to make it easier to create an image collage. NestedLoops-part3

  10. 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

  11. 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

  12. Challenge • Rewrite your collage method to use the general copy method NestedLoops-part3

  13. 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

  14. 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

  15. 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

  16. 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

  17. 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

  18. 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

  19. Trying out blendPictures() > String fileName = FileChooser.getMediaPath("640x480.jpg"); > Picture picture = new Picture(fileName); > picture.blendPictures(); > picture.show(); NestedLoops-part3

  20. 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

  21. 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

  22. 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

More Related