From 0c35ad10a5f2a8b3e774b86fd48eeebe0165549c Mon Sep 17 00:00:00 2001 From: Daniel Shiffman Date: Mon, 18 Mar 2013 21:56:23 -0400 Subject: [PATCH] some comments for the new morph example --- java/examples/Topics/Motion/Morph/Morph.pde | 48 +++++++++++++++++---- 1 file changed, 40 insertions(+), 8 deletions(-) diff --git a/java/examples/Topics/Motion/Morph/Morph.pde b/java/examples/Topics/Motion/Morph/Morph.pde index 1c6a65f81..e34fbad1b 100644 --- a/java/examples/Topics/Motion/Morph/Morph.pde +++ b/java/examples/Topics/Motion/Morph/Morph.pde @@ -5,32 +5,47 @@ * vertices from one to another */ +// Two ArrayLists to store the vertices for two shapes +// This example assumes that each shape will have the same +// number of vertices, i.e. the size of each ArrayList will be the same ArrayList circle = new ArrayList(); ArrayList square = new ArrayList(); +// An ArrayList for a third set of vertices, the ones we will be drawing +// in the window ArrayList morph = new ArrayList(); +// This boolean variable will control if we are morphing to a circle or square boolean state = false; void setup() { size(640, 360); + // Create a circle using vectors pointing from center for (int angle = 0; angle < 360; angle += 9) { + // Note we are not starting from 0 in order to match the + // path of a circle. PVector v = PVector.fromAngle(radians(angle-135)); v.mult(100); circle.add(v); + // Let's fill out morph ArrayList with blank PVectors while we are at it morph.add(new PVector()); } + // A square is a bunch of vertices along straight lines + // Top of square for (int x = -50; x < 50; x += 10) { square.add(new PVector(x, -50)); } + // Right side for (int y = -50; y < 50; y += 10) { square.add(new PVector(50, y)); } + // Bottom for (int x = 50; x > -50; x -= 10) { square.add(new PVector(x, 50)); } + // Left side for (int y = 50; y > -50; y -= 10) { square.add(new PVector(-50, y)); } @@ -39,19 +54,36 @@ void setup() { void draw() { background(51); + // We will keep how far the vertices are from their target + float totalDistance = 0; + + // Look at each vertex for (int i = 0; i < circle.size(); i++) { PVector v1; - if (state) v1 = circle.get(i); - else v1 = square.get(i); - PVector v2 = morph.get(i); - v2.lerp(v1, 0.1); - float d = PVector.dist(v1, v2); - if (d < 0.01) { - state = !state; + // Are we lerping to the circle or square? + if (state) { + v1 = circle.get(i); } + else { + v1 = square.get(i); + } + // Get the vertex we will draw + PVector v2 = morph.get(i); + // Lerp to the target + v2.lerp(v1, 0.1); + // Check how far we are from target + totalDistance += PVector.dist(v1, v2); } - + + // If all the vertices are close, switch shape + if (totalDistance < 0.1) { + state = !state; + } + + // Draw relative to center translate(width/2, height/2); + strokeWeight(4); + // Draw a polygon that makes up all the vertices beginShape(); noFill(); stroke(255);