Chapter 6 - Interacting Objects: Newton’s Lab Bruce Chittenden

Embed Size (px)

Citation preview

  • Slide 1
  • Chapter 6 - Interacting Objects: Newtons Lab Bruce Chittenden
  • Slide 2
  • 6.1 The Starting Point: Newtons Lab
  • Slide 3
  • Exercise 6.1 Right Click on space
  • Slide 4
  • Exercise 6.2 Sun and Planet
  • Slide 5
  • Exercise 6.2 Sun and Two Planets
  • Slide 6
  • Exercise 6.2 Sun, Planet, and Moon
  • Slide 7
  • Exercise 6.3
  • Slide 8
  • Exercise 6.4
  • Slide 9
  • Exercise 6.5 Space Class import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) import java.awt.Color; /** * Space. The final frontier. * * @author Michael Kolling * @version 1.0 */ public class Space extends World {
  • Slide 10
  • Exercise 6.5 Space Constructor /** * Create space. */ public Space() { super(960, 620, 1); // Uncomment one of the following method calls // if you want the objects created automatically: //sunAndPlanet(); //sunAndTwoPlanets(); //sunPlanetMoon(); }
  • Slide 11
  • Exercise 6.5 SunAndPlanet () /** * Set up the universe with a sun and a planet. */ public void sunAndPlanet() { removeAllObjects(); addObject (new Body (50, 240.0, new Vector(270, 0.03), new Color(255, 216, 0)), 460, 270); addObject (new Body (20, 4.2, new Vector(90, 2.2), new Color(0, 124, 196)), 695, 260); }
  • Slide 12
  • Exercise 6.5 sunAndTwoPlanets () /** * Set up the universe with a sun and two planets. */ public void sunAndTwoPlanets() { removeAllObjects(); addObject (new Body (50, 240.0, new Vector(270, 0.0), new Color(255, 216, 0)), 460, 310); addObject (new Body (20, 4.2, new Vector(90, 2.2), new Color(0, 124, 196)), 695, 300); addObject (new Body (24, 4.6, new Vector(270, 1.8), new Color(248, 160, 86)), 180, 290); }
  • Slide 13
  • Exercise 6.5 sunPlanetMoon () /** * Set up the universe with a sun, a planet, and a moon. */ public void sunPlanetMoon() { removeAllObjects(); addObject (new Body (50, 240.0, new Vector(270, 0.0), new Color(255, 216, 0)), 460, 270); addObject (new Body (20, 4.2, new Vector(90, 2.2), new Color(0, 124, 196)), 720, 260); addObject (new Body (5, 0.8, new Vector(90, 3.25), new Color(240, 220, 96)), 748, 260); }
  • Slide 14
  • Exercise 6.5 removeAllObjects () /** * Remove all objects currently in the world. */ private void removeAllObjects() { removeObjects (getObjects(Actor.class)); }
  • Slide 15
  • 6.2 Helper Classes: SmoothMover and Vector Some Helper Classes Counter Explosion Mover Plotter Rotator Slider Vector Wander http://www.greenfoot.org/programming/classes.html
  • Slide 16
  • SmoothMover 12.3, 12.9, 13.5, 14.1, 14.7, 15.3, 15.9, 16.5, 17.1,... 12, 13, 14, 14, 15, 15, 16, 17, 17,... SmoothMover can, for example, have the x-coordinate 12.3. If we now move this actor along the x-coordinate in increments of 0.6, its successive locations will be and so on. We will see the actor on screen at rounded x-coordinates.
  • Slide 17
  • Abstract Classes public abstract class SmoothMover extends Actor { private Vector movement; private double exactX; private double exactY; public SmoothMover() { this(new Vector()); } /** * Create new thing initialised with given speed. */ public SmoothMover(Vector movement) { this.movement = movement; } Cannot Create Objects for This Class, No Constructor
  • Slide 18
  • Exercise 6.6 accelerate addForce getExactX getExactY getMovement getSpeed move setLocation
  • Slide 19
  • Exercise 6.7 /** * Set the location using exact (double) co-ordinates. */ public void setLocation(double x, double y) { exactX = x; exactY = y; super.setLocation((int) x, (int) y); } /** * Set the location of this actor. Redefinition of the standard Greenfoot * method to make sure the exact co-ordinates are updated in sync. */ public void setLocation(int x, int y) { exactX = x; exactY = y; super.setLocation(x, y); } Can have the same name, as long as their parameters are different. This means that the methods (or constructors) have different signatures.
  • Slide 20
  • Overloading It is perfectly legal to have two methods that have the same name, as long as their parameter lists are different. This is called Overloading (The name of the method is Overloaded - it refers to more than one method.)
  • Slide 21
  • Vectors dy dx Polar Representation = length and direction Cartesian Representation = dx and dy
  • Slide 22
  • Exercise 6.8
  • Slide 23
  • Slide 24
  • Exercise 6.9 Which methods can be called thru the objects menu? Which methods cannot?
  • Slide 25
  • Exercise 6.9 public abstract class SmoothMover extends Actor { private Vector movement; private double exactX; private double exactY; public SmoothMover() { this(new Vector()); } /** * Create new thing initialised with given speed. */ public SmoothMover(Vector movement) { this.movement = movement; } smoothMover is not Callable since it is declared as an Abstract Class
  • Slide 26
  • Exercise 6.10 /** * Construct a Body with default size, mass, movement and color. */ public Body() { this (20, 300, new Vector(0, 1.0), defaultColor); } /** * Construct a Body with a specified size, mass, movement and color. */ public Body(int size, double mass, Vector movement, Color color) { this.mass = mass; addForce(movement); GreenfootImage image = new GreenfootImage (size, size); image.setColor (color); image.fillOval (0, 0, size-1, size-1); setImage (image); } Body Class has Two Constructors This is Another Example of Overloading
  • Slide 27
  • 6.3 The Existing Body Class A constructor without any parameters is also called a Default Constructor The Body class has two constructors. One constructor has no parameters and the other constructor has four parameters. The default constructor makes it easy for us to create bodies interactively without having to specify all the details.
  • Slide 28
  • Code 6.1 public class Body extends SmoothMover { /** * Construct a Body with default size, mass, movement and color. */ public Body() { this (20, 300, new Vector(0, 1.0), defaultColor); } /** * Construct a Body with a specified size, mass, movement and color. */ public Body(int size, double mass, Vector movement, Color color) { this.mass = mass; addForce(movement); GreenfootImage image = new GreenfootImage (size, size); image.setColor (color); image.fillOval (0, 0, size-1, size-1); setImage (image); }
  • Slide 29
  • this this (20, 300, new Vector (90, 1.0), defaultColor ); this.mass = mass; This line looks almost like a method call, except it uses the keyword this instead of a method name. Using this the constructor executes the other constructor, the one with parameters. When we write this.mass, we specify that we mean the mass field of the current object.
  • Slide 30
  • Exercise 6.11 /** * Construct a Body with default size, mass, movement and color. */ public Body() { this (20, 300, new Vector(0, 1.0), defaultColor); } /** * Construct a Body with a specified size, mass, movement and color. */ public Body(int size, double mass, Vector movement, Color color) { this.mass = mass; addForce(movement); GreenfootImage image = new GreenfootImage (size, size); image.setColor (color); image.fillOval (0, 0, size-1, size-1); setImage (image); } Remove the this
  • Slide 31
  • Exercise 6.11 Does is Compile? Does it Execute? What does the Code do? What is its effect?
  • Slide 32
  • Code 6.2 private static final double GRAVITY = 5.8; private static final Color defaultColor = new Color(255, 216, 0); The term final defines this field to be a constant. A constant has similarities to a field, in that we can use the name in our code to refer to its value, but the value can never change (it is constant). The effect of the static keyword is that this constant is shared between all actors of this class.
  • Slide 33
  • 6.4 First Extension: Creating Movement The first obvious experiment is to make bodies move. SmootherMover Class has a move () method and since Body is a SmoothMover, it too has access to this method.
  • Slide 34
  • Exercise 6.12 /** * Act. That is: apply the gravitation forces from * all other bodies around, and then move. */ public void act() { move(); } Add the move () Method to the act () Method of the Body Class.
  • Slide 35
  • Exercise 6.12 The Default Direction is 0 Degrees The Default Speed is 1.0
  • Slide 36
  • Exercise 6.13 Multiple Objects Move from Left to Right at a Constant Speed
  • Slide 37
  • Exercies 6.14 The Sun Does Not Appear to Move The Earth Moves Straight Down Rapidly
  • Slide 38
  • Exercise 6.14
  • Slide 39
  • Slide 40
  • Exercise 6.15 /** * Construct a Body with default size, mass, movement and color. */ public Body() { this (20, 300, new Vector(-180, 1.0), defaultColor); } Change the Direction in the Default Constructor from 0 to -180
  • Slide 41
  • Exercise 6.15 0 360 -270 90 -90 270 -180 180
  • Slide 42
  • 6.5 Using Java Library Classes import java.awt.Color; new Color (248, 160, 86) RGB java.awt Package Color Class
  • Slide 43
  • java.awt.Color
  • Slide 44
  • Exercise 6.16
  • Slide 45
  • Exercise 6.17
  • Slide 46
  • 6.6 Adding Gravitational Force apply forces from other bodies: get all other bodies in space; for each of those bodies: { apply gravity from that body to our own; } We can give an outline of the task in pseudo-code.
  • Slide 47
  • Code 6.3 /** * Act. That is: apply the gravitation forces from * all other bodies around, and then move. */ public void act() { move (); }
  • Slide 48
  • Code 6.4 /* * Act. For a body, that is: apply all the gravitation forces from * all other bodies around, and then move. */ public void act() { applyForces (); move (); } /* * Apply the forces of gravity from all other celestial bodies in this universe */ private void applyForces() { // work to do here }
  • Slide 49
  • Private Methods Methods can be public or private. When methods are intended to be called from outside the class (either interactively by a user or from another class), the they must be public. When methods are intended to be called only from other methods within the same class, then they should be declared private.
  • Slide 50
  • Exercise 6.18
  • Slide 51
  • getObjects ( java.lang.Class cls ) getObjectsAt ( int x, int y, java.lang.Class cls ) numberOfObjects ( ) removeObject ( Actor object) removeObjects ( java.util.Collection objects )
  • Slide 52
  • getObjects () java.util.List getObjects ( java.lang.Class cls ) Gives a list of all objects in the world of a particular class getObjects ( Body.class ) Gets a list of all the objects in the world of class Body getObjects ( null ) The keyword null is a special expression that means nothing, or no object
  • Slide 53
  • getWorld().getObjects getWorld().getObjects ( Body.class ) getObjects is a method of the World class, so it must be called on a World object. We will write our code in the Body class, so we must first obtain the World object to call this method on. World getWorld() There is a method in the Actor class that gives us access to the World class. It signature is World getWorld ().
  • Slide 54
  • 6.7 The List Type The List type is not a class, but an interface. Interfaces are a Java construct that provides an abstraction over different possible implementing classes. java.util.List
  • Slide 55
  • Exercise 6.19
  • Slide 56
  • add ( E o ) add ( int index, E element ) addAll ( Collection c ) addAll ( int index, Collection c ) remove ( int index ) remove ( Object o ) size ()
  • Slide 57
  • Exercise 6.20 Interface List
  • Slide 58
  • Interface is in the place of class and the notation is after the type name. This is the Generic Type. This means that the type List needs an additional type specified as a parameter. This second type specifies the type of the elements held within the list.
  • Slide 59
  • Interface List List A list of Strings List A list of Actors List bodies A list of bodies List bodies = getWorld().getobjects (Body.class): The variable bodies holds a list of all the bodies that exist in the World.
  • Slide 60
  • Code 6.5 import java.util.List; /* * Apply the forces of gravity from all other celestial bodies in this universe */ private void applyForces() { List bodies = getWorld().getObjects(Body.class); }
  • Slide 61
  • 6.8 The for-each Loop for ( Element Type variable : collection ) { statements; } Java has a specialized loop for stepping through every element of a collection. It is called a for-each loop.
  • Slide 62
  • The for-each Loop for ( Body body : bodies ) { body.move(); } for each body in bodies do: body = first element from bodies; execute loop statements; body = second element for bodies; execute loop statements; body = third element from bodies; execute loop statements;...
  • Slide 63
  • Code 6.6 /* * Apply the forces of gravity from all other celestial bodies in this universe */ private void applyForces() { List bodies = getWorld().getObjects(Body.class); for (Body body : bodies) { if (body != this) { applyGravity (body); } /* * Apply the gravity force of a given body to this one. */ private void applyGravity (Body other) { // work to do here }
  • Slide 64
  • 6.9 Applying Gravity Newton's Law of Universal Gravitation states that every massive particle in the universe attracts every other massive particle with a force which is directly proportional to the product of their masses and inversely proportional to the square of the distance between them.
  • Slide 65
  • Code 6.7 /* * Apply the gravity force of a given body to this one. */ private void applyGravity(Body other) { double dx = other.getExactX() - this.getExactX(); double dy = other.getExactY() - this.getExactY(); Vector force = new Vector (dx, dy); double distance = Math.sqrt (dx*dx + dy*dy); double strength = GRAVITY * this.mass * other.mass / (distance * distance); double acceleration = strength / this.mass; force.setLength (acceleration); addForce (force); }
  • Slide 66
  • Pythagorean Theorem a 2 + b 2 = c 2
  • Slide 67
  • Exercise 6.21
  • Slide 68
  • Math Class sqrt
  • Slide 69
  • Exercise 6.22 max ( int a, int b )
  • Slide 70
  • Exercise 6.22
  • Slide 71
  • Acceleration acceleration = force mass Once we have calculated the acceleration, we can set our force vector to the correct length and add this vector to the movement of our body.
  • Slide 72
  • Exercise 6.23 a 2 + b 2 = c 2 dx 2 + dy 2 = distance 2 (other.getExactX()-this.getExactX()) 2 + (other.getExactY()-this.getExactY()) 2 = distance 2 distance = Math.sqrt ( (other.getExactX()-this.getExactX()) 2 + (other.getExactY()-this.getExactY()) 2 )
  • Slide 73
  • Exercise 6.23 force = (mass1 * mass2 / distance 2 ) * G force = ( this.mass * other.mass / distance *distance ) * GRAVITY force = mass1 X mass2 distance G
  • Slide 74
  • Exercise 6.24
  • Slide 75
  • Slide 76
  • Slide 77
  • Exercise 6.25 If the Gravitational Constant is set Higher than 5.8, planets spiral into one another, and if it is set lower, planets fly off into deep space.
  • Slide 78
  • Exercise 6.26 sizemassvectormovementxyrgb
  • Slide 79
  • Exercise 6.26 addObject (new Body (100, 500.0, new Vector(270, 0.0), new Color(255, 216, 0)), 460, 270); addObject (new Body (20, 4.2, new Vector(90, 2.2), new Color(0, 124, 196)), 720, 260); addObject (new Body (5, 0.8, new Vector(90, 3.25), new Color(240, 220, 96)), 748, 260);
  • Slide 80
  • Exercise 6.27 All Systems That I Tested Were Very Unstable
  • Slide 81
  • 6.11 Gravity and Music The idea to add sound to a gravity project was inspired by Keplers Orrery (see https://keplers-orrery.dev.java.net/ ) https://keplers-orrery.dev.java.net/
  • Slide 82
  • Exercise 6.28
  • Slide 83
  • 6.12 Summary of Programming Techniques One of the most important topics in the chapter was the use of additional classes from the Standard Java Class Library, Color, Math, and List. Another new addition was the use of a new loop the for-each loop. This loop is used to do something to every element of a Java collection such as a List. If we need an index, or a loop independent of a collection, then we must use a for loop or a while loop instead.
  • Slide 84
  • Concept Summary