cs 112 introduction to programming graphics; animation yang (richard) yang computer science...

37
CS 112 Introduction to Programming Graphics; Animation Yang (Richard) Yang Computer Science Department Yale University 308A Watson, Phone: 432-6400 Email: [email protected]

Upload: blake-washington

Post on 05-Jan-2016

216 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: CS 112 Introduction to Programming Graphics; Animation Yang (Richard) Yang Computer Science Department Yale University 308A Watson, Phone: 432-6400 Email:

CS 112 Introduction to Programming

Graphics; Animation

Yang (Richard) YangComputer Science Department

Yale University308A Watson, Phone: 432-6400

Email: [email protected]

Page 2: CS 112 Introduction to Programming Graphics; Animation Yang (Richard) Yang Computer Science Department Yale University 308A Watson, Phone: 432-6400 Email:

Admin

Issues on PS3 NumberCoolness:

• printSpaces(n): prints n – 1 spaces, not n

• You can either change the method to print n or adapt your main

a walkthrough to be held by Fitz this evening from 8 to 9 pm

please suggest topics (e.g., nested loops, method parameters) that you want us to cover more

2

Page 3: CS 112 Introduction to Programming Graphics; Animation Yang (Richard) Yang Computer Science Department Yale University 308A Watson, Phone: 432-6400 Email:

Recap

Nested loopso If a loop is inside another loop,

we say the two form a nested loopo The #loop times of the inner loop

can depend on the outer loop variable

Method with parameterso Specify parameters to control the

behavior of a methodo Redundancy removal/abstraction

through generalization

Page 4: CS 112 Introduction to Programming Graphics; Animation Yang (Richard) Yang Computer Science Department Yale University 308A Watson, Phone: 432-6400 Email:

Example: Nested Loop

....1

...2.

..3..

.4...5....

int N = 5;for (int line = 1; line <= N; line++) {

for (int j = 1; j <= (-1 * line + N); j++) { System.out.print("."); }

System.out.print(line);

for (int j = 1; j <= (line - 1); j++) { System.out.print("."); }

System.out.println();

}

Page 5: CS 112 Introduction to Programming Graphics; Animation Yang (Richard) Yang Computer Science Department Yale University 308A Watson, Phone: 432-6400 Email:

Example: Rewrite

public static void dots(int n) {

for (int i = 1; i <= n; i++) { System.out.print("."); }

}

public static void main(String[] args) { int N = 5; for (int line = 1; line <= N; line++) {

dots( -1 * line + N );

System.out.print(line);

dots( line – 1 );

System.out.println(); } // end of outer for loop

}

Page 6: CS 112 Introduction to Programming Graphics; Animation Yang (Richard) Yang Computer Science Department Yale University 308A Watson, Phone: 432-6400 Email:

Out-Class Read: Another Way to Motivate Method

With Parameters

6

Page 7: CS 112 Introduction to Programming Graphics; Animation Yang (Richard) Yang Computer Science Department Yale University 308A Watson, Phone: 432-6400 Email:

Example: Reuse Matrix

..1

.2.3......1...2...3...4...5....

int N = 5;for (int line = 1; line <= N; line++) { // initial dots for (int j = 1; j <= (-1 * line + N); j++) { System.out.print("."); }

// the number System.out.print(line);

// the second set of dots for (int j = 1; j <= (line - 1); j++) { System.out.print("."); } System.out.println();}

Print two copies of inverse diagonal matrix

Page 8: CS 112 Introduction to Programming Graphics; Animation Yang (Richard) Yang Computer Science Department Yale University 308A Watson, Phone: 432-6400 Email:

Solution 1

8

public class DrawMatrix1 { public static void main(String[] args) { drawMatrix3(); drawMatrix5(); }

public static void drawMatrix3() { int N = 3; for (int line = 1; line <= N; line++) { for (int j = 1; j <= (-1 * line + N); j++) { // initial dots System.out.print("."); } System.out.print(line); // the number for (int j = 1; j <= (line - 1); j++) { // the second set of dots System.out.print("."); } System.out.println(); } } // end of drawMatrix3 public static void drawMatrix5() { int N = 5; for (int line = 1; line <= N; line++) { for (int j = 1; j <= (-1 * line + N); j++) { // initial dots System.out.print("."); } System.out.print(line); // the number for (int j = 1; j <= (line - 1); j++) { // the second set of dots System.out.print("."); } System.out.println(); } } // end of drawMatrix5}

This code is redundant.

Page 9: CS 112 Introduction to Programming Graphics; Animation Yang (Richard) Yang Computer Science Department Yale University 308A Watson, Phone: 432-6400 Email:

Remove Redundancy

9

public class DrawMatrix2 {

}

public static void drawMatrix() { for (int line = 1; line <= N; line++) { for (int j = 1; j <= (-1 * line + N); j++) { // initial dots System.out.print("."); } System.out.print(line); // the number

for (int j = 1; j <= (line - 1); j++) { // the second set of dots System.out.print("."); } System.out.println(); } // end of for line} // end of drawMatrix

public static void main(String[] args) {

drawMatrix(); // should print 3

drawMatrix(); // should print 5} // end of main

int N = 3;

N = 5;

ERROR:N is out of scope

Page 10: CS 112 Introduction to Programming Graphics; Animation Yang (Richard) Yang Computer Science Department Yale University 308A Watson, Phone: 432-6400 Email:

Solution 2

10

public class DrawMatrix2 {

}

public static void drawMatrix() { for (int line = 1; line <= N; line++) { for (int j = 1; j <= (-1 * line + N); j++) { // initial dots System.out.print("."); } System.out.print(line); // the number

for (int j = 1; j <= (line - 1); j++) { // the second set of dots System.out.print("."); } System.out.println(); } // end of for line} // end of drawMatrix

public static void main(String[] args) {

drawMatrix(); // should print 3

drawMatrix(); // should print 5} // end of main

static int N; // introduce a class scope variable

N = 3;

N = 5;

Page 11: CS 112 Introduction to Programming Graphics; Animation Yang (Richard) Yang Computer Science Department Yale University 308A Watson, Phone: 432-6400 Email:

Problem of Class Variable Indirection

11

public class DrawMatrix2 {

}

public static void drawMatrix() { for (int line = 1; line <= N; line++) { for (int j = 1; j <= (-1 * line + N); j++) { // initial dots System.out.print("."); } System.out.print(line); // the number

for (int j = 1; j <= (line - 1); j++) { // the second set of dots System.out.print("."); } System.out.println(); } // end of for line} // end of drawMatrix

public static void main(String[] args) {

drawMatrix();

drawMatrix();} // end of main

static int N; // introduce a class scope variable

N = 3;

N = 5;

Not self clear;Implicit, depends on context;

Page 12: CS 112 Introduction to Programming Graphics; Animation Yang (Richard) Yang Computer Science Department Yale University 308A Watson, Phone: 432-6400 Email:

Solution 3: Parameterization Specify a parameter to control the behavior of a method Methods with parameters solve an entire

class of similar problems

Redundancy removal/abstraction through generalization The more general a building block, the easier to reuse it

We will learn more techniques on generalization/abstraction

12

Page 13: CS 112 Introduction to Programming Graphics; Animation Yang (Richard) Yang Computer Science Department Yale University 308A Watson, Phone: 432-6400 Email:

Method Design Heuristics

1. The main method should read as a concise summary of the overall set of tasks performed by the program.

2. Each method should have a clear set of responsibilities.

3. No method should do too large a share of the overall task.

4. Use method with parameters to remove redundancy with generalization, but do not over generalize

5. Data should be declared/used at the lowest level possible (localized data).

Page 14: CS 112 Introduction to Programming Graphics; Animation Yang (Richard) Yang Computer Science Department Yale University 308A Watson, Phone: 432-6400 Email:

Example: Draw Boxes

Consider the task of printing the following box figures using “*” and “ “:

****** ******

*********** ***********

****** ** ****** What method(s) and parameter(s)?

Page 15: CS 112 Introduction to Programming Graphics; Animation Yang (Richard) Yang Computer Science Department Yale University 308A Watson, Phone: 432-6400 Email:

Box Figures Param. Chaining

****** ******

*********** ***********

****** ** ******

public static void main(String[] args) {drawBox(5, 3);

drawBox(10, 3);

drawBox(5, 4);

} // end of main

public static void drawBox(int width, int height) { // step 1. print width of "*" repeat("*", width); System.out.println();

// step 2. loop a total of height - 2 times // for each row: // print * // print width -2 " " for (int i = 1; i <= height - 2; i++) { System.out.print("*"); repeat(" ", width - 2); System.out.println("*"); }

// step 3. print width of "*" repeat("*", width); System.out.println();} // end of drawBox

public static void repeat(String s, int times) { for (int i = 1; i <= times; i ++) { System.out.print( s ); }} // end of repeat

Page 16: CS 112 Introduction to Programming Graphics; Animation Yang (Richard) Yang Computer Science Department Yale University 308A Watson, Phone: 432-6400 Email:

Method Correctness Analysis/Testing Q: How do you analyze/test the correctness of a method?

Basic idea A method is correct if for each input (parameters), the output is what you expect for the input

An issue: Some input may not make sense. Two approaches

• Detect such bad input and report• Assume that the input is in the valid range: called precondition of the method

Page 17: CS 112 Introduction to Programming Graphics; Animation Yang (Richard) Yang Computer Science Department Yale University 308A Watson, Phone: 432-6400 Email:

Method Correctness Analysis/Testing

****** ******

*********** ***********

****** ** ******

public static void drawBox(int width, int height) { // step 1. print width of "*" repeat("*", width); System.out.println();

// step 2. loop a total of height - 2 times // for each row: // print * // print width -2 " " for (int i = 1; i <= height - 2; i++) { System.out.print("*"); repeat(" ", width - 2); System.out.println("*"); }

// step 3. print width of "*" repeat("*", width); System.out.println();} // end of drawBox

public static void repeat(String s, int times) { for (int i = 1; i <= times; i ++) { System.out.print( s ); }} // end of repeat

Page 18: CS 112 Introduction to Programming Graphics; Animation Yang (Richard) Yang Computer Science Department Yale University 308A Watson, Phone: 432-6400 Email:

Recap: Graphics using StdDraw To access a static method or class variable defined in another class, use <class-name>.<method-name>(…), for example, StdDraw.setCanvasSize(100, 100); Color.BLACK;

Method designers may design different methods for the same function

18

StdDraw: rectangle(double x, double y, double halfWidth, double halfHeight);

DrawingPanel (Java): rect (int x0, int y0, int width, int height);

Page 19: CS 112 Introduction to Programming Graphics; Animation Yang (Richard) Yang Computer Science Department Yale University 308A Watson, Phone: 432-6400 Email:

Example: Parameterized Drawing

Write method drawCar:

100

50

15r=10

30

20

(x0, y0)

Center:(x0 + 100 /2,

y0 + 50/2)

Size: 50, 25

Center:(x0 + 15 + 10,

y0)

Radius: 10

Center:(x0 + 100-15-10,

y0)

Radius: 10

Center:(x0 + 100-30/2,

y0+50/2)

Size: 15, 10

Page 20: CS 112 Introduction to Programming Graphics; Animation Yang (Richard) Yang Computer Science Department Yale University 308A Watson, Phone: 432-6400 Email:

drawCar

20

public static void drawCar(int x0, int y0) {StdDraw.setPenColor(Color.BLACK);StdDraw.filledRectangle(x0 + 100/2, y0 + 50/2,

100/2, 50/2);

// draw wheelsStdDraw.setPenColor(Color.RED);StdDraw.filledCircle(x0 + 15 + 10, y0, 10);StdDraw.filledCircle(x0 + 100 - 15 - 10, y0, 10);

// draw windowStdDraw.setPenColor(Color.CYAN);StdDraw.filledRectangle(x0 + 100 - 30 / 2, y0 + 25,

15, 10);}

Criticism of the method?

See Car.java for the final version.

Page 21: CS 112 Introduction to Programming Graphics; Animation Yang (Richard) Yang Computer Science Department Yale University 308A Watson, Phone: 432-6400 Email:

Example: Drawing using Loops You may use loop (nested loop) to producemore “complex” patterns:

public static void main(String[] args) { init(); // set x, y scale to 512 int x0 = 56, y0 = 56; int size = 50; for (int i = 0; i < 8; i++) { for (int j = 0; j < 8; j++) { StdDraw.square(x0 + i * size + size / 2, y0 + j * size + size / 2, size/2); } } // end of main

What is the display?

Page 22: CS 112 Introduction to Programming Graphics; Animation Yang (Richard) Yang Computer Science Department Yale University 308A Watson, Phone: 432-6400 Email:

Example: Drawing using Loops

Page 23: CS 112 Introduction to Programming Graphics; Animation Yang (Richard) Yang Computer Science Department Yale University 308A Watson, Phone: 432-6400 Email:

Example: Book Cover

White 500x600 drawing panel

Three components at (20, 415), (165, 330), (220, 85) with sizes 150, 120, and 240

Each component• Yale blue background

• white “CS112" text left @ 1/2 horizontal, 4/5 vertical

• 10 brown (red=192, green=128, blue=64) “bricks”

– 1 pixel between two adjacent bricks

BookCover.java

Page 24: CS 112 Introduction to Programming Graphics; Animation Yang (Richard) Yang Computer Science Department Yale University 308A Watson, Phone: 432-6400 Email:

Summary of Progress So Far Primitive data types, expressions and variables

for loops Methods with parameters

24

Page 25: CS 112 Introduction to Programming Graphics; Animation Yang (Richard) Yang Computer Science Department Yale University 308A Watson, Phone: 432-6400 Email:

Motivating Example: Car Launch Two cars launching from different heights, which lands further? Car 1: initial height: 600m, horizontal speed: 30 m/sec, vertical speed: 20 m/sec

Car 2: initial height: 500m, horizontal speed: 40 m/sec, vertical speed: 30 m/sec

Write a program to display their trajectories in 10 sec

Page 26: CS 112 Introduction to Programming Graphics; Animation Yang (Richard) Yang Computer Science Department Yale University 308A Watson, Phone: 432-6400 Email:

Background: Physics

In physics, for each dimension (x or y), given initial velocity v0 in m/s, acceleration a in m/s2, and elapsed time t in s the speed of the moving body at time t:

• V = v0 + a t

The displacement of the moving body at time t:• Displacement = v0 t + ½ a t 2

The position of the moving body at time t:• Pos = Initial position + displacement

Page 27: CS 112 Introduction to Programming Graphics; Animation Yang (Richard) Yang Computer Science Department Yale University 308A Watson, Phone: 432-6400 Email:

Position

P0 + v0 t + ½ a t2

Horizontal (x): vx0 * t

Vertical (y): g ≅ 9.81 m/s2, downward y0 + vy0 t - ½ g t 2

Page 28: CS 112 Introduction to Programming Graphics; Animation Yang (Richard) Yang Computer Science Department Yale University 308A Watson, Phone: 432-6400 Email:

Example

See CarLaunchv1.java

Page 29: CS 112 Introduction to Programming Graphics; Animation Yang (Richard) Yang Computer Science Department Yale University 308A Watson, Phone: 432-6400 Email:

Backup Slides

Page 30: CS 112 Introduction to Programming Graphics; Animation Yang (Richard) Yang Computer Science Department Yale University 308A Watson, Phone: 432-6400 Email:

Exercise: Generalization

Consider the task of printing the following lines/boxes:

************* //13

******* // 7

*********************************** // 35

*********** ***********

****** ** ******

Page 31: CS 112 Introduction to Programming Graphics; Animation Yang (Richard) Yang Computer Science Department Yale University 308A Watson, Phone: 432-6400 Email:

Design I

Provide a new method drawLine() by calling repeat()

public static void drawLine(int width) {

repeat(“*”, width);

} // end of drawLine

*************************

*********** ***********

Page 32: CS 112 Introduction to Programming Graphics; Animation Yang (Richard) Yang Computer Science Department Yale University 308A Watson, Phone: 432-6400 Email:

Design II

Consider a line as a special box with height draw first line of stars if (height >= 2) // a real box

• draw rest

*************************

*********** ***********

public static void drawBox(int width, int height)

Page 33: CS 112 Introduction to Programming Graphics; Animation Yang (Richard) Yang Computer Science Department Yale University 308A Watson, Phone: 432-6400 Email:

The if statement

Executes a block of statements only if a test is true

if (test) { statement; ... statement;}

Example:if (gpa >= 2.0) { System.out.println("Application accepted.");}

Page 34: CS 112 Introduction to Programming Graphics; Animation Yang (Richard) Yang Computer Science Department Yale University 308A Watson, Phone: 432-6400 Email:

34

The if-else Statement

An else clause can be added to an if statement to make it an if-else statement:

if ( test ) { statement1;}else { statement2;}

If the condition is true, statement1 is executed; if the condition is false, statement2 is executed

One or the other will be executed, but not both

Page 35: CS 112 Introduction to Programming Graphics; Animation Yang (Richard) Yang Computer Science Department Yale University 308A Watson, Phone: 432-6400 Email:

The if/else Statement

Example:

if (gpa >= 2.0) { System.out.println("Welcome to Mars University!");} else { System.out.println("Application denied.");}

Page 36: CS 112 Introduction to Programming Graphics; Animation Yang (Richard) Yang Computer Science Department Yale University 308A Watson, Phone: 432-6400 Email:

Design II

Consider a line as a special box

*************************

*********** ***********

// super elastic drawBox public static void drawBox(int width, int height) { // step 1. print width of "*" repeat("*", width); System.out.println();

for (int i = 1; i <= height - 2; i++) { System.out.print("*"); repeat(" ", width - 2); System.out.println("*"); }

if (height >= 2) { // a real box repeat("*", width); System.out.println(); } // end of if} // end of drawBox

public static void main(String[] args) { drawBox(13, -1);

drawBox(10, 3);

} // end of main

Page 37: CS 112 Introduction to Programming Graphics; Animation Yang (Richard) Yang Computer Science Department Yale University 308A Watson, Phone: 432-6400 Email:

Comparison

public static void drawLine(int width) {

repeat(“*”, width);

} // end of drawLine

*************************

*********** ***********

// super elastic drawBox public static void drawBox(int width, int height) { // step 1. print width of "*" repeat("*", width); System.out.println();

for (int i = 1; i <= height - 2; i++) { System.out.print("*"); repeat(" ", width - 2); System.out.println("*"); } if (height >= 2) { // a real box repeat("*", width); System.out.println(); } // end of if} // end of drawBox

public static void drawBox(int width, int height) { repeat("*", width); System.out.println();

for (int i = 1; i <= height - 2; i++) { System.out.print("*"); repeat(" ", width - 2); System.out.println("*"); }

} // end of drawBox