This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
PShape box; | |
int vertexCount; | |
float xRotation; | |
float yRotation; | |
float zRotation; | |
ArrayList<PVector> coords = new ArrayList(); | |
boolean mouseRotate = true; | |
boolean showNearest = false; | |
boolean showIndexLabels = false; | |
boolean showNodes = true; | |
void setup() { | |
size(500, 500, P3D); | |
makeBox(); | |
} | |
void draw() { | |
background(255); | |
pushMatrix(); | |
translate(width/2, height/2, 0); | |
if(mouseRotate){ | |
xRotation = (mouseY/360.0)*-(TWO_PI) + PI; | |
yRotation = (mouseX/420.0)*(TWO_PI) - PI; | |
zRotation = PI/36; | |
} | |
rotateX(xRotation); | |
rotateY(yRotation); | |
rotateZ(zRotation); | |
scale(150); | |
//3D shape: | |
//sphere.setStroke(color(0, 40)); | |
//shape(shape); | |
coords.clear(); | |
//For each vertex find where they'd be rendered on a 2D screen | |
for (int i = 0; i < vertexCount; i++) { | |
PVector vertex = box.getVertex(i); | |
float x = screenX(vertex.x, vertex.y, vertex.z); | |
float y = screenY(vertex.x, vertex.y, vertex.z); | |
coords.add(new PVector(x, y)); | |
} | |
popMatrix(); | |
draw2DBox(); | |
} | |
void draw2DBox() { | |
float prevX = -1; | |
float prevY = -1; | |
float textPad = 0; | |
stroke(0, 0, 0, 60); | |
for (int v = 0; v < vertexCount-2; v = v+4) { | |
float x = coords.get(v).x; | |
float y = coords.get(v).y; | |
if(showNodes){ | |
fill(0); | |
ellipse(x, y, 5, 5); | |
//We're stepping by 4 so have to get the next 3 here: | |
ellipse(coords.get(v+1).x, coords.get(v+1).y, 5, 5); | |
ellipse(coords.get(v+2).x, coords.get(v+2).y, 5, 5); | |
ellipse(coords.get(v+3).x, coords.get(v+3).y, 5, 5); | |
noFill(); | |
} | |
if(showIndexLabels){ | |
if(prevX == x && prevY == y){ | |
textPad = textPad + textWidth("" + (v-1)) + 3; | |
}else{ | |
textPad = 0; | |
} | |
text("" + v, x + textPad, y); | |
prevX = x; | |
prevY = y; | |
} | |
//Draw the face: | |
line(coords.get(v).x, coords.get(v).y, coords.get(v+1).x, coords.get(v+1).y); | |
line(coords.get(v+1).x, coords.get(v+1).y, coords.get(v+2).x, coords.get(v+2).y); | |
line(coords.get(v+2).x, coords.get(v+2).y, coords.get(v+3).x, coords.get(v+3).y); | |
line(coords.get(v+3).x, coords.get(v+3).y, coords.get(v).x, coords.get(v).y); | |
} | |
if(showNearest){ | |
int nearestIndex = -1; | |
float nearestDistance = Integer.MAX_VALUE; | |
int c = coords.size(); | |
for (int i = 0; i < c; i++) { | |
float x = coords.get(i).x; | |
float y = coords.get(i).y; | |
float distance = dist(x, y, mouseX, mouseY); | |
if(distance < nearestDistance){ | |
nearestDistance = distance; | |
nearestIndex = i; | |
} | |
} | |
stroke(0, 255, 255); | |
fill(0,255,255); | |
ellipse(coords.get(nearestIndex).x, coords.get(nearestIndex).y, 15, 15); | |
noFill(); | |
} | |
} | |
void keyPressed() { | |
switch(key){ | |
case 'a': | |
mouseRotate = !mouseRotate; | |
break; | |
case's': | |
showNearest = !showNearest; | |
break; | |
case 'd': | |
showIndexLabels = !showIndexLabels; | |
break; | |
case 'f': | |
showNodes = !showNodes; | |
break; | |
} | |
} | |
void makeBox() { | |
stroke(0, 30); | |
box = createShape(BOX, 1.2); | |
vertexCount = box.getVertexCount(); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment