11-NestedLoops-part4.ppt: uploaded 1 April 2016 at 4:01 pm

Download Report

Transcript 11-NestedLoops-part4.ppt: uploaded 1 April 2016 at 4:01 pm

Nested Loops – part 4
Barb Ericson
Georgia Institute of Technology
Nov 2009
NestedLoops-part4
1
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
2
Left Rotation
• How can you copy
one picture onto
another so that the
first picture is rotated
to the left 90
degrees?
NestedLoops-part4
3
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?
0
1
2
0
1
2
3
1
4
5
6
NestedLoops-part4
0
1
0
3
6
1
2
5
2
1
4
4
Left Rotation
• Try out your algorithm
on another example
– Does it work?
• Can you translate it
into code?
0
1
2
3
0
5
6
7
8
1
1
2
3
4
0
1
0
1
2
NestedLoops-part4
3
5
Left Rotation
• To rotate an image
left 90 degrees still
copy all the pixels
– But they go to different
locations in the target
0
1
2
0
1
2
3
1
4
5
6
• Column values become
row values
• target x = source y
• target y = source width 1 – source x
NestedLoops-part4
0
1
0
3
6
1
2
5
2
1
4
6
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
7
Left Rotation Method
public 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
8
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
9
Testing Left Rotation
String file = FileChooser.getMediaPath(
“7inX95in.jpg”);
Picture p = new Picture(file);
p.show();
p.copyKatieLeftRotation();
p.repaint();
NestedLoops-part4
10
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
11
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
12
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 0
(640 / 2 = 320) and
4
height (480 / 2 = 240) 8
12
1
5
9
13
NestedLoops-part4
2
6
10
14
3
0
7
8
11
15
2
10
13
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
14
Scaling Down Method
public 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
15
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
16
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
17
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)
0
1
0
0
1
2
1
4
2
5
3
6
1
2
3
4
5
0
1 1 2 2 3 3
1
1 1 2 2 3 3
2
4 4 5 5 6 6
3
4 4 5 5 6 6
NestedLoops-part4
18
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
19
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
20
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
NestedLoops-part4
21