The listing is below and I'll post a commentary later.
The purpose of the program is to demonstrate the main language features covered in the early part of the book. To do this I have animated a ball moving across the screen 'underneath' a fixed light source which causes a highlight on the ball. The position of the highlight on the ball changes as the ball's position changes in relation to the position of the light source.
//variables to define ball
//full size of ball
float ballRadius = 50;
//radius of highlit area
float hLRadius = ballRadius;
//centre of ball will move across scren during animation
float ballCentreX = 0 - ballRadius;
float ballCentreY = 200;
//to control horizontal and vertical movement of the ball
int hMove = 2;
int vMove = 2;
//to draw the highlight relative to the centre of the ball
float hLCentreX;
float hLCentreY;
float hLXAdj;
float hLYAdj;
float hLSize = ballRadius / 3;
//to control the position of the highlight relative to
//the ball's position on the screen and the light source
float hLPosX;
float hLPosY;
//to colour the ball
float r = 60;
float b = r;
float g = r;
//variables defining the position of the light source
float lightSrcX = 200;
float lightSrcY = 200;
float lightSrcHt;
void setup()
{
size(400,400);
background(40, 10, 10);
noStroke();
frameRate(25);
lightSrcHt = width / 2;
}
void draw()
{
//clear drawing area
background(40, 10, 10);
//move ball across screen by changing X-coordinate
//of centre
ballCentreX += hMove;
ballCentreY += vMove;
//detect collision with top or bottom of screen an 'bounce' if required
if ((ballCentreY + ballRadius == height) || (ballCentreY == ballRadius))
vMove *= -1;
//start again if ball moves of the side of the screen
if(ballCentreX >= width + ballRadius)
ballCentreX = 0 - ballRadius;
//position the highlight
hLCentreX = ballCentreX;
hLCentreY = ballCentreY;
hLRadius = ballRadius;
//re-set colours
r = 60;
g = 0;
b = 0;
/**
* This section uses trigonometry to calculate the position of the highlight
* relative to the positions of the ball and the light source.
*/
//these variables are used to do make the calulation a little clearer
//first calculate the x-position of the highlight
float p = lightSrcX - ballCentreX;
float k = lightSrcHt;
float rad = ballRadius;
float a; //angle the light is shining on the ball
float m; // this is the figure we're looking for
// perform calculation
a = atan(k/p);
m = (int)(rad * cos(a));
//the value calculated for m is set as the position of the highlight
if(ballCentreX < hlposx =" ballCentreX" hlposx =" ballCentreX" hlxadj =" (hLPosX" p =" lightSrcY" a =" atan(k/p);" m =" (int)(rad" hlposy =" ballCentreY" hlposy =" ballCentreY" hlyadj =" (hLPosY"> 0)
{
fill(r, g, b);
ellipse(hLCentreX, hLCentreY, hLRadius * 2, hLRadius * 2);
r += 255/ballRadius;
if(hLRadius <= hLSize)
{
g += 255/hLSize;
b += 255/hLSize;
} hLRadius -= 1;
hLCentreX += hLXAdj;
hLCentreY += hLYAdj;
}
}