a real ring
This commit is contained in:
@@ -1,5 +1,8 @@
|
||||
import peasy.PeasyCam;
|
||||
|
||||
static int RING_SIZE = 500;
|
||||
static int RING_WIDTH = 120;
|
||||
|
||||
class Leaf {
|
||||
PVector pos;
|
||||
boolean reached = false;
|
||||
@@ -69,7 +72,7 @@ class Tree {
|
||||
Tree() {
|
||||
makeTorus();
|
||||
|
||||
Branch root = new Branch(new PVector(300, 0), new PVector(0, -1));
|
||||
Branch root = new Branch(new PVector(RING_SIZE, 0), new PVector(0, -1));
|
||||
branches.add(root);
|
||||
Branch current = new Branch(root);
|
||||
|
||||
@@ -81,17 +84,20 @@ class Tree {
|
||||
}
|
||||
|
||||
void makeTorus() {
|
||||
for (int i = 0; i < 200; i++) {
|
||||
for (int i = 0; i < 350; i++) {
|
||||
for (int p = 0; p < 90; p++) {
|
||||
PVector pos = PVector.random3D();
|
||||
pos.mult(90);
|
||||
pos.add(sin(i)*300, cos(i)*300);
|
||||
pos.x = 0;
|
||||
pos.y = 0;
|
||||
pos.mult(RING_WIDTH);
|
||||
pos.add(sin(i)*RING_SIZE, cos(i)*RING_SIZE);
|
||||
leaves.add(new Leaf(pos));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
boolean closeEnough(Branch b) {
|
||||
int i = 0;
|
||||
for (Leaf l : leaves) {
|
||||
float d = PVector.dist(b.pos, l.pos);
|
||||
if (d < max_dist) return true;
|
||||
@@ -101,7 +107,8 @@ class Tree {
|
||||
|
||||
void show() {
|
||||
//for (Leaf l : leaves) l.show();
|
||||
for (int i = 0; i < branches.size(); i++) {
|
||||
int size = branches.size();
|
||||
for (int i = 0; i < size; i++) {
|
||||
Branch b = branches.get(i);
|
||||
if (b.parent != null) {
|
||||
strokeWeight(2);
|
||||
@@ -158,42 +165,12 @@ class Tree {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void fuse() {
|
||||
ArrayList<Branch> nonparents = new ArrayList<Branch>();
|
||||
for (Branch b : branches) {
|
||||
boolean isnonparent = true;
|
||||
for (Branch ib : branches) {
|
||||
if (ib.parent != null && ib.parent.equals(b)) { isnonparent = false; break; }
|
||||
}
|
||||
if (isnonparent) nonparents.add(b);
|
||||
}
|
||||
for (Branch b : nonparents) {
|
||||
Branch closest = null;
|
||||
float record = -1;
|
||||
for (Branch ib : nonparents) {
|
||||
if (ib.equals(b)) continue;
|
||||
PVector dir = PVector.sub(ib.pos, b.pos);
|
||||
float d = dir.mag();
|
||||
if (closest == null || d < record) {
|
||||
closest = ib;
|
||||
record = d;
|
||||
}
|
||||
}
|
||||
if (closest != null) {
|
||||
Branch n = new Branch(b);
|
||||
n.pos = closest.pos.copy();
|
||||
branches.add(n);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Tree tree;
|
||||
|
||||
float min_dist = 5;
|
||||
float max_dist = 20;
|
||||
boolean fused = false;
|
||||
|
||||
PeasyCam cam;
|
||||
|
||||
@@ -203,10 +180,24 @@ void setup() {
|
||||
tree = new Tree();
|
||||
}
|
||||
|
||||
void drawCircles() {
|
||||
noFill();
|
||||
strokeWeight(4);
|
||||
pushMatrix();
|
||||
translate(0, 0, RING_WIDTH);
|
||||
ellipse(0, 0, RING_SIZE*2, RING_SIZE*2);
|
||||
popMatrix();
|
||||
|
||||
pushMatrix();
|
||||
translate(0, 0, -RING_WIDTH);
|
||||
ellipse(0, 0, RING_SIZE*2, RING_SIZE*2);
|
||||
popMatrix();
|
||||
}
|
||||
|
||||
void draw() {
|
||||
background(255);
|
||||
stroke(0);
|
||||
tree.show();
|
||||
if (tree.leaves.size() > 10) tree.grow();
|
||||
else if (!fused) { tree.fuse(); fused = true; }
|
||||
tree.grow();
|
||||
drawCircles();
|
||||
}
|
Reference in New Issue
Block a user