1 / 27

Nested Loops – part 2

Nested Loops – part 2. Barb Ericson Georgia Institute of Technology Nov 2009. Learning Goals. Understand at a conceptual and practical level How to mirror part of a picture How to calculate the number of times a nested loop will execute How to copy pixels from one picture to another

holt
Télécharger la présentation

Nested Loops – part 2

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 2 Barb Ericson Georgia Institute of Technology Nov 2009 NestedLoops-part2

  2. Learning Goals • Understand at a conceptual and practical level • How to mirror part of a picture • How to calculate the number of times a nested loop will execute • How to copy pixels from one picture to another • How to declare, initialize and change several variables in a for loop • How to copy part of a picture to another picture Georgia Institute of Technology

  3. Mirror part of a picture • Use the explorer to figure out the part to mirror NestedLoops-part2

  4. Mirror temple method /** * Method to mirror part of the temple picture around a * vertical line at a mirror point */ public void mirrorTemple() { int mirrorPoint = 276; Pixel leftPixel = null; Pixel rightPixel = null; // loop through the rows for (int y = 27; y < 97; y++) { // loop from 13 to just before the mirror point for (int x = 13; x < mirrorPoint; x++) NestedLoops-part2

  5. Mirror temple - continued { leftPixel = getPixel(x, y); rightPixel = getPixel(mirrorPoint + (mirrorPoint - x), y); right Pixel .setColor(leftPixel .getColor()); } } } NestedLoops-part2

  6. Testing the mirrorTemple method > String fileName = "C:/intro-prog-java/mediasources/temple.jpg"; > Picture picture = new Picture(fileName); > picture.explore(); > picture.mirrorTemple(); > picture.explore(); NestedLoops-part2

  7. How many pixels were changed? • We could put print statements in the code • to see the x and y values, but that would take a long time • We can also just keep a count • And print the value of the count after the loop ends • We can calculate the number of times a loop will run using end – start + 1 = number of times • numOuter = 96 – 27 + 1 = 70 • numInner = 275 – 13 + 1 = 263 • Total for a nested loop is numInner * numOuter • 70 * 263 = 18,410 NestedLoops-part2

  8. Copying Pixels to a New Picture • Need to track the source picture x and y • And the target picture x and y • We can use a blank picture • As the target picture • Several blank pictures are available • 640x480.jpg • 7inX95in.jpg Georgia Institute of Technology

  9. Copy Picture Algorithm • Copy a picture to the 7 by 9.5 inch blank picture • Create the target picture object • Invoke the method on the target picture • Create the source picture object • Loop through the source picture pixels • Get the source and target pixels • Set the color of the target pixel to the color of the source pixel Georgia Institute of Technology

  10. Copy Algorithm to Code • Loop through the source pixels // loop through the columns for (int sourceX = 0, targetX = 0; sourceX < sourcePicture.getWidth(); sourceX++, targetX++) { // loop through the rows for (int sourceY = 0, targetY = 0; sourceY < sourcePicture.getHeight(); sourceY++, targetY++) { Georgia Institute of Technology

  11. Copy Algorithm to Code – Cont • Get the source and target pixels sourcePixel = sourcePicture.getPixel(sourceX,sourceY); targetPixel = this.getPixel(targetX,targetY); • Set the color of the target pixel to the color of the source pixel targetPixel.setColor(sourcePixel.getColor()); Georgia Institute of Technology

  12. Copy Method public void copyKatie() { String sourceFile = FileChooser.getMediaPath("KatieFancy.jpg"); Picture sourcePicture = new Picture(sourceFile); Pixel sourcePixel = null; Pixel targetPixel = null; // loop through the columns for (int sourceX = 0, targetX = 0; sourceX < sourcePicture.getWidth(); sourceX++, targetX++) { Georgia Institute of Technology

  13. Copy Method - Continued // loop through the rows for (int sourceY = 0, targetY = 0; sourceY < sourcePicture.getHeight(); sourceY++, targetY++) { // set the target pixel color to the source pixel color sourcePixel = sourcePicture.getPixel(sourceX,sourceY); targetPixel = this.getPixel(targetX,targetY); targetPixel.setColor(sourcePixel.getColor()); } } } Georgia Institute of Technology

  14. Trying the copyKatie Method • Create a picture object using the 7inX95in.jpg file in the mediasources directory • Picture p1 = new Picture(FileChooser.getMediaPath(“7inX95in.jpg”)); • Show the picture • p1.show(); • Invoke the method on this picture object • p1.copyKatie(); • Repaint the picture • p1.repaint(); Georgia Institute of Technology

  15. Result of copyKatie Method Georgia Institute of Technology

  16. Copying Pixels to a New Picture • What if we want to copy the target to a different location in the source • Than 0,0 • Say startX and startY • What is an algorithm that will do this? 0 1 0 1 0 1 2 3 0 1 2 3 Georgia Institute of Technology

  17. Copy to Position Exercise • Write a method copyRobot to copy • robot.jpg • To location • 100, 100 in 7inx95in.jpg • Test with String file = FileChooser.getMediaPath(“7inx95in.jpg”); Picture p = new Picture(file); p.copyRobot(); p.show(); Georgia Institute of Technology

  18. Cropping • We can copy just part of a picture to a new picture • Just change the start and end source x and y values to the desired values • Use pictureObj.explore() to find the x and y values • What are the x and y values to get the face of the girl in KatieFancy.jpg?

  19. Copy Face Method public void copyKatiesFace() { String sourceFile = FileChooser.getMediaPath("KatieFancy.jpg"); Picture sourcePicture = new Picture(sourceFile); Pixel sourcePixel = null; Pixel targetPixel = null; // loop through the columns for (int sourceX = 70, targetX = 100; sourceX < 135; sourceX++, targetX++) { // loop through the rows for (int sourceY = 3, targetY = 100; sourceY < 80; sourceY++, targetY++) {

  20. Copy Face Method - Continued // set the target pixel color to the source pixel color sourcePixel = sourcePicture.getPixel(sourceX,sourceY); targetPixel = this.getPixel(targetX,targetY); targetPixel.setColor(sourcePixel.getColor()); } } }

  21. Testing Copy Katie’s Face • Create a picture object • Picture p1 = new Picture(FileChooser.getMediaPath( “7inX95in.jpg”)); • Show the picture • p1.show(); • Invoke the method • p1.copyKatiesFace(); • Repaint the picture • p1.repaint();

  22. Creating a Collage • You can create a collage by copying several pictures to a blank picture • You can use the general copy method on flower1.jpg and flower2.jpg

  23. /** * Method to copy flower pictures to create a * collage. * All the flower pictures will be lined up near the * top of the current picture */ public void copyFlowersTop() { // create the flower pictures Picture flower1Picture = new Picture(FileChooser.getMediaPath( "flower1.jpg")); Picture flower2Picture = new Picture(FileChooser.getMediaPath( "flower2.jpg")); // declare the source and target pixel variables Pixel sourcePixel = null; Pixel targetPixel = null; // copy the first flower picture to the top left // corner for (int sourceX = 0, targetX = 0; sourceX < flower1Picture.getWidth(); sourceX++, targetX++) { for (int sourceY = 0, targetY = 0; sourceY < flower1Picture.getHeight(); sourceY++, targetY++) { sourcePixel = flower1Picture.getPixel(sourceX,sourceY); targetPixel = this.getPixel(targetX,targetY); targetPixel.setColor(sourcePixel.getColor()); } } Create Collage Method

  24. // copy the flower2 picture starting with x = // 100 for (int sourceX = 0, targetX = 100; sourceX < flower2Picture.getWidth(); sourceX++, targetX++) { for (int sourceY = 0, targetY = 0; sourceY < flower2Picture.getHeight(); sourceY++, targetY++) { sourcePixel = flower2Picture.getPixel(sourceX, sourceY); targetPixel = this.getPixel(targetX,targetY); targetPixel.setColor(sourcePixel.getColor()); } } // copy the flower1 negated to x = 200 flower1Picture.negate(); for (int sourceX = 0, targetX = 200; sourceX < flower1Picture.getWidth(); sourceX++, targetX++) { for (int sourceY = 0, targetY = 0; sourceY < flower1Picture.getHeight(); sourceY++, targetY++) { sourcePixel = flower1Picture.getPixel(sourceX, sourceY); targetPixel = this.getPixel(targetX,targetY); targetPixel.setColor(sourcePixel.getColor()); } } Create Collage Method - cont

  25. // clear the blue in flower 2 picture and add at // x=300 flower2Picture.clearBlue(); for (int sourceX = 0, targetX = 300; sourceX < flower2Picture.getWidth(); sourceX++, targetX++) { for (int sourceY = 0, targetY = 0; sourceY < flower2Picture.getHeight(); sourceY++, targetY++) { sourcePixel = flower2Picture.getPixel(sourceX,sourceY); targetPixel = this.getPixel(targetX,targetY); targetPixel.setColor(sourcePixel.getColor()); } } // copy the negated flower 1 to x=400 for (int sourceX = 0, targetX = 400; sourceX < flower1Picture.getWidth(); sourceX++, targetX++) { for (int sourceY = 0, targetY = 0; sourceY < flower1Picture.getHeight(); sourceY++, targetY++) { sourcePixel = flower1Picture.getPixel(sourceX, sourceY); targetPixel = this.getPixel(targetX,targetY); targetPixel.setColor(sourcePixel.getColor()); } } } Create Collage Method - cont

  26. Challenge • Create your own collage • Copy at least two different pictures to the collage • Do at least 3 different picture manipulations to the pictures • Reduce red • Negate • Clear blue • Mirror the collage

  27. Summary • To mirror part of a picture • Set the starting and ending values in the nested loop • To copy pixels from one picture to another • Keep track of the sourceX, sourceY and targetX and targetY • You can declare, initialize, and change more than one variable in a for loop for (int sourceX = 0, targetX = 0; sourceX < sourcePicture.getWidth(); sourceX++, targetX++) • You can copy just part of a picture to another picture Georgia Institute of Technology

More Related