# Composite Objects

Composite Objects

An object can include several other objects. Creating such composite objects is a good way to use the principles of modularity and build higher levels of abstraction within a program.

```
EggRing er1, er2;

void setup() {
size(640, 360);
er1 = new EggRing(width*0.45, height*0.5, 0.1, 120);
er2 = new EggRing(width*0.65, height*0.8, 0.05, 180);
}

void draw() {
background(0);
er1.transmit();
er2.transmit();
}

class Egg {
float x, y; // X-coordinate, y-coordinate
float tilt; // Left and right angle offset
float angle; // Used to define the tilt
float scalar; // Height of the egg

// Constructor
Egg(float xpos, float ypos, float t, float s) {
x = xpos;
y = ypos;
tilt = t;
scalar = s / 100.0;
}

void wobble() {
tilt = cos(angle) / 8;
angle += 0.1;
}

void display() {
noStroke();
fill(255);
pushMatrix();
translate(x, y);
rotate(tilt);
scale(scalar);
beginShape();
vertex(0, -100);
bezierVertex(25, -100, 40, -65, 40, -40);
bezierVertex(40, -15, 25, 0, 0, 0);
bezierVertex(-25, 0, -40, -15, -40, -40);
bezierVertex(-40, -65, -25, -100, 0, -100);
endShape();
popMatrix();
}
}

class Ring {

float x, y; // X-coordinate, y-coordinate
float diameter; // Diameter of the ring
boolean on = false; // Turns the display on and off

void start(float xpos, float ypos) {
x = xpos;
y = ypos;
on = true;
diameter = 1;
}

void grow() {
if (on == true) {
diameter += 0.5;
if (diameter > width*2) {
diameter = 0.0;
}
}
}

void display() {
if (on == true) {
noFill();
strokeWeight(4);
stroke(155, 153);
ellipse(x, y, diameter, diameter);
}
}
}

class EggRing {
Egg ovoid;
Ring circle = new Ring();

EggRing(float x, float y, float t, float sp) {
ovoid = new Egg(x, y, t, sp);
circle.start(x, y - sp/2);
}

void transmit() {
ovoid.wobble();
ovoid.display();
circle.grow();
circle.display();
if (circle.on == false) {
circle.on = true;
}
}
}
```

## Functions Used

ellipse()

Draws an ellipse (oval) to the screen

popMatrix()

Pops the current transformation matrix off the matrix stack

rotate()

Rotates the amount specified by the angle parameter

fill()

Sets the color used to fill shapes

size()

Defines the dimension of the display window width and height in units of pixels

cos()

Calculates the cosine of an angle

stroke()

Sets the color used to draw lines and borders around shapes

vertex()

All shapes are constructed by connecting a series of vertices

beginShape()

Using the beginShape() and endShape() functions allow creating more complex forms

setup()

The setup() function is run once, when the program starts

strokeWeight()

Sets the width of the stroke used for lines, points, and the border around shapes

translate()

Specifies an amount to displace objects within the display window

draw()

Called directly after setup(), the draw() function continuously executes the lines of code contained inside its block until the program is stopped or noLoop() is called

noFill()

Disables filling geometry

bezierVertex()

Specifies vertex coordinates for Bezier curves

endShape()

The endShape() function is the companion to beginShape() and may only be called after beginShape()

noStroke()

Disables drawing the stroke (outline)

background()

The background() function sets the color used for the background of the Processing window