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
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.