11-NestedLoops-part3.ppt: uploaded 1 April 2016 at 4:01 pm
Download
Report
Transcript 11-NestedLoops-part3.ppt: uploaded 1 April 2016 at 4:01 pm
Nested Loops – part 3
Barb Ericson
Georgia Institute of Technology
Nov 2009
NestedLoops-part3
1
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
2
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
3
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
4
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
5
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
6
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
7
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
8
Creating a Collage
• We can use the
general copy method
to make it easier to
create an image
collage.
NestedLoops-part3
9
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
10
Collage Method - continued
// copy the flower2 picture starting with x = 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
11
Challenge
• Rewrite your collage method to use the
general copy method
NestedLoops-part3
12
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
13
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
14
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
15
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
16
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
17
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
18
Trying out blendPictures()
> String fileName =
FileChooser.getMediaPath("640x480.jpg");
> Picture picture = new Picture(fileName);
> picture.blendPictures();
> picture.show();
NestedLoops-part3
19
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
20
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
21
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
22