Bruce Chittenden 61 The Starting Point Newtons Lab Exercise 61 Right Click on space Exercise 62 Sun and Planet Exercise 62 Sun and Two Planets Exercise 62 Sun Planet and Moon Exercise 63 ID: 689656
Download Presentation The PPT/PDF document "Chapter 6 - Interacting Objects: Newton..." is the property of its rightful owner. Permission is granted to download and print the materials on this web site for personal, non-commercial use only, and to display it on your personal computer provided you do not modify the materials and that you retain all copyright notices contained in the materials. By downloading content from our website, you accept the terms of this agreement.
Slide1
Chapter 6 - Interacting Objects: Newton’s Lab
Bruce ChittendenSlide2
6.1 The Starting Point: Newton’s LabSlide3
Exercise 6.1
Right Click on spaceSlide4
Exercise 6.2
Sun and PlanetSlide5
Exercise 6.2
Sun and Two PlanetsSlide6
Exercise 6.2
Sun, Planet, and MoonSlide7
Exercise 6.3Slide8
Exercise 6.4Slide9
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
{Slide10
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();
}Slide11
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);
}Slide12
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);
}Slide13
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);
}Slide14
Exercise 6.5 removeAllObjects ()
/**
* Remove all objects currently in the world.
*/
private void removeAllObjects()
{
removeObjects (getObjects(Actor.class)); }Slide15
6.2 Helper Classes:
SmoothMover and Vector
Some Helper Classes
Counter
Explosion
Mover
Plotter
Rotator
Slider
Vector
Wander
http://www.greenfoot.org/programming/classes.htmlSlide16
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.Slide17
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 Slide18
Exercise 6.6
accelerate
addForce
getExactX
getExactY
getMovement
getSpeed
move
setLocation
setLocationSlide19
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.Slide20
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.)Slide21
Vectors
dy
dx
Polar Representation = length and direction
Cartesian Representation = dx and dySlide22
Exercise 6.8Slide23
Exercise 6.8Slide24
Exercise 6.9
Which methods can be called thru the object’s menu?
Which methods cannot?Slide25
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 ClassSlide26
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 OverloadingSlide27
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.Slide28
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);
}Slide29
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.Slide30
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”Slide31
Exercise 6.11
Does is Compile?
Does it Execute?
What does the Code do?
What is its effect?Slide32
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.Slide33
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.Slide34
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.”Slide35
Exercise 6.12
The Default Direction is 0 Degrees
The Default Speed
is 1.0 Slide36
Exercise 6.13
Multiple Objects Move from Left to Right at a Constant SpeedSlide37
Exercies 6.14
The Sun Does Not Appear to Move
The Earth Moves Straight Down RapidlySlide38
Exercise 6.14Slide39
Exercise 6.14Slide40
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 -180Slide41
Exercise 6.15
0
360
-270
90
-90
270
-180
180Slide42
6.5 Using Java Library Classes
import
java.awt.Color;
new
Color (248, 160, 86)
R
G
B
java.awt Package
Color ClassSlide43
java.awt.ColorSlide44
Exercise 6.16Slide45
Exercise 6.17Slide46
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.Slide47
Code 6.3
/**
* Act. That is: apply the gravitation forces from
* all other bodies around, and then move.
*/
public void
act() { move ();}Slide48
Code 6.4
/*
* Act. For a body, that is: apply all the gravitation forces from
* all other bodies around, and then move.
*/
public vo
id act() { applyForces (); move ();
}
/*
* Apply the forces of gravity from all other celestial bodies in this universe
*/
private void
applyForces()
{
// work to do here
}Slide49
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
.Slide50
Exercise 6.18Slide51
Exercise 6.18
getObjects ( java.lang.Class cls )
getObjectsAt ( int x, int y, java.lang.Class cls )
numberOfObjects ( )
removeObject ( Actor object)
removeObjects ( java.util.Collection objects )Slide52
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 objectSlide53
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 ().Slide54
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.ListSlide55
Exercise 6.19Slide56
Exercise 6.19
add (
E
o )
add ( int index,
E
element )addAll ( Collection <? extends E> c )
addAll ( int index, Collection< ? extends
E
> c )
remove ( int index )
remove (
Object
o )
size ()Slide57
Exercise 6.20
Interface List<E>Slide58
Interface List<E>
Interface List<E>
Interface is in the place of class and the notation <E> 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.Slide59
Interface List<E>
List<String>
A list of Strings
List<Actor>
A list of Actors
List<Body> bodies
A list of bodies
List<Body> bodies = getWorld().getobjects (Body.class):
The variable bodies holds a list of all the bodies that exist in the World.Slide60
Code 6.5
import java.util.List;
/*
* Apply the forces of gravity from all other celestial bodies in this universe
*/
private void
applyForces() {
List<Body> bodies = getWorld().getObjects(Body.
class
);
}Slide61
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 .Slide62
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;
. . .Slide63
Code 6.6
/*
* Apply the forces of gravity from all other celestial bodies in this universe
*/
private void applyForces()
{
List<Body> 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
} Slide64
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.Slide65
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);
}Slide66
Pythagorean Theorem
a
2
+ b
2
= c
2Slide67
Exercise 6.21Slide68
Math Class sqrtSlide69
Exercise 6.22
max ( int a, int b )Slide70
Exercise 6.22Slide71
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.Slide72
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
)Slide73
Exercise 6.23
force = (mass1 * mass2 / distance
2
) * G
force = ( this.mass * other.mass / distance *distance ) * GRAVITY
force =
mass1 X mass2
distance
GSlide74
Exercise 6.24Slide75
Exercise 6.24Slide76
Exercise 6.24Slide77
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.Slide78
Exercise 6.26
size
mass
vector
movement
x
y
r
g
bSlide79
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);Slide80
Exercise 6.27
All Systems That I Tested Were Very UnstableSlide81
6.11 Gravity and Music
The idea to add sound to a gravity project was inspired by Kepler’s Orrery (see
https://keplers-orrery.dev.java.net/
)Slide82
Exercise 6.28Slide83
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.Slide84
Concept Summary