Upload
gwenda-goodwin
View
216
Download
0
Embed Size (px)
Citation preview
NestedLoops-part4 1
Nested Loops – part 4
Barb Ericson
Georgia Institute of Technology
Nov 2009
NestedLoops-part4 2
Learning Goals
• Understand at a conceptual and practical level– How to copy one picture to another so that the
first picture is rotated 90 degrees left or right– How to simplify a problem – How to come up with an algorithm to solve a
problem– How to test the algorithm– How can you make a picture smaller or larger
NestedLoops-part4 3
Left Rotation
• How can you copy one picture onto another so that the first picture is rotated to the left 90 degrees?
NestedLoops-part4 4
Left Rotation
• First simplify the problem by thinking about how to copy when each pixel has just a number at it
• Can you come up with an algorithm for this?
1 2 3
4 5 6
3 6
2 5
1 4
0 1 2
0
1
0
0
1
1
2
NestedLoops-part4 5
Left Rotation
• Try out your algorithm on another example– Does it work?
• Can you translate it into code?
5 6 7 8
1 2 3 4
0 1 2
0
1
0
0
1
1
2
3
3
NestedLoops-part4 6
Left Rotation
• To rotate an image left 90 degrees still copy all the pixels– But they go to different
locations in the target• Column values become
row values• target x = source y• target y = source width
-1 – source x
1 2 3
4 5 6
3 6
2 5
1 4
0 1 2
0
1
0
0
1
1
2
NestedLoops-part4 7
Left Rotation Algorithm
• Create the target picture object • Invoke the method on the target picture
– Create the source picture object– Loop through the source x
• Loop through the source y – Get the source pixel at the x and y values– Get the target pixel with the x equal the source y value
and the y equal the source picture width – 1 minus the source x
– Copy the color from the source pixel to the target pixel
NestedLoops-part4 8
Left Rotation Methodpublic void copyKatieLeftRotation() { String sourceFile = FileChooser.getMediaPath("KatieFancy.jpg"); Picture sourcePicture = new Picture(sourceFile); Pixel sourcePixel = null; Pixel targetPixel = null; int targetX, targetY = 0; // loop through the columns for (int sourceX = 0; sourceX < sourcePicture.getWidth(); sourceX++) {
NestedLoops-part4 9
Copy Katie Left Rotation // loop through the rows for (int sourceY = 0; sourceY < sourcePicture.getHeight(); sourceY++) { // set the target pixel color to the source pixel color sourcePixel = sourcePicture.getPixel(sourceX,sourceY); targetX = sourceY; targetY = sourcePicture.getWidth() – 1 – sourceX; targetPixel = this.getPixel(targetX,targetY); targetPixel.setColor(sourcePixel.getColor()); } } }
NestedLoops-part4 10
Testing Left Rotation
String file = FileChooser.getMediaPath(
“7inX95in.jpg”);
Picture p = new Picture(file);
p.show();
p.copyKatieLeftRotation();
p.repaint();
NestedLoops-part4 11
Challenge
• Create a general left rotation method that – Works on any picture
• Call the method on the picture to be rotated left
– Returns a new picture that is just the right size to hold the rotated picture
• Make the new picture's width the same as the old picture's height and the new picture's height the same as the old picture's width
NestedLoops-part4 12
Scaling
• You can make a picture smaller– Faster to download on the web
• Increment the source x and y by a number larger than 1
– Don’t use all the source pixels in the target picture
• You can make a picture larger– Show more detail
• Copy the same source x and y to more than one target x and y
– Use source pixels more than once in target
NestedLoops-part4 13
Scaling Down a Picture
• passionFlower.jpg is 640pixels wide and 480 pixels high
• If we copy every other pixel we will have a new picture with width (640 / 2 = 320) and height (480 / 2 = 240)
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15
0 2
8 10
NestedLoops-part4 14
Scaling Down Algorithm
• Create the target picture• Invoke the method on the target picture
– Create the source picture– Loop with source x starting at 0 and target x
starting at 0 as long as < source width• Increment the source x by 2 each time through the
loop, increment the target x by 1• Loop with source y starting at 0 and target y
starting at 0 as long as < source height– Increment the source y by 2 each time through the loop,
increment the target y by 1» Copy the color from the source to target pixel
NestedLoops-part4 15
Scaling Down Methodpublic void copyFlowerSmaller() { Picture flowerPicture = new Picture( FileChooser.getMediaPath(“passionFlower.jpg")); Pixel sourcePixel = null; Pixel targetPixel = null;
// loop through the columns for (int sourceX = 0, targetX=0; sourceX < flowerPicture.getWidth(); sourceX+=2, targetX++) {
NestedLoops-part4 16
Scaling Down Method - Continued // loop through the rows for (int sourceY=0, targetY=0; sourceY < flowerPicture.getHeight(); sourceY+=2, targetY++) { sourcePixel = flowerPicture.getPixel(sourceX,sourceY); targetPixel = this.getPixel(targetX,targetY); targetPixel.setColor(sourcePixel.getColor()); } } }
NestedLoops-part4 17
Trying Copy Flower Smaller
• Create a new picture half the size of the original picture (+ 1 if odd size)– Picture p1 = new Picture(320,240);
• Copy the flower to the new picture – p1.copyFlowerSmaller();
• Show the result– p1.show();
NestedLoops-part4 18
Thinking Through Scaling Up
• Copy each pixel in the source multiple times to the target– Source (0,0) Target (0,0)– Source (0,0) Target(1,0)– Source (1,0) Target(2,0)– Source (1,0) Target(3,0)– Source (2,0) Target(4,0)– Source (2,0) Target(5,0)– Source (0,0) Target(0,1)– Source (0,0) Target(1,1)
1 1 2 2 3 3
1 1 2 2 3 3
4 4 5 5 6 6
4 4 5 5 6 6
1 2 3
4 5 6
0
0
1
1 2
0
0
1
1
2
2
3
3
4 5
NestedLoops-part4 19
Scaling Up Algorithm
• Create the target picture• Invoke the method on the target picture
– Create the source picture– Loop with source x starting at 0 and target x
starting at 0 as long as < source width• Increment the source x by 0.5 each time through
the loop, increment the target x by 1• Loop with source y starting at 0 and target y
starting at 0 as long as < source height– Increment the source y by 0.5 each time through the
loop, increment the target y by 1» Copy the color from the source to target pixel
NestedLoops-part4 20
Scaling Up Exercise
• Write a method copyFlowerBigger to scale up the picture flower1.jpg when you copy it to 640x480.jpg
• Save the result to a file using– pictureObj.write(“file”);
NestedLoops-part4 21
Summary
• To copy one picture to another with the first picture rotated – You need to change the targetX and targetY
• You should simplify a problem– And try to solve it by hand– Then come up with an algorithm for solving it– And then try it on another example
• To scale a picture down use every other pixel– To scale a picture up use every pixel more than once