class Blade { Particle rootNode; int nodeCount = int(random(4, 4)); Particle[] fixedNodes; Particle[] springNodes; Spring[] connections; float baseX, baseY; float nodeDistance = random(20, 60); float rootSize = 12; Blade() { baseX = random(-rootSize/2, width + rootSize/2); baseY = height; rootNode = ps.makeParticle(5, baseX, baseY, 0); rootNode.makeFixed(); fixedNodes = new Particle[nodeCount]; springNodes = new Particle[nodeCount]; connections = new Spring[nodeCount]; float u = 4.0; float v = 0.1; for (int i = 0; i < nodeCount; i++) { fixedNodes[i] = ps.makeParticle(2, baseX + random(-u, u), baseY - (nodeDistance * (i + 1)) + random(-u, u), 0); fixedNodes[i].makeFixed(); springNodes[i] = ps.makeParticle(nodeCount - i + 2, fixedNodes[i].position().x(), fixedNodes[i].position().y(), 0); connections[i] = ps.makeSpring(fixedNodes[i], springNodes[i], 0.4 + random(-v, v), 0.1 + random(-v/4, v/4), 0.0); } float w = sqrt(sqr(rootNode.position().x() - springNodes[0].position().x()) + sqr(rootNode.position().y() - springNodes[0].position().y())); ps.makeSpring(rootNode, springNodes[0], 1, 0.1, w); for (int i = 1; i < nodeCount; i++) { w = sqrt(sqr(springNodes[i-1].position().x() - springNodes[i].position().x()) + sqr(springNodes[i-1].position().y() - springNodes[i].position().y())); ps.makeSpring(springNodes[i-1], springNodes[i], 0.1, 0.1, w); } } void update() { fill(1, 90, 1); //stroke(1, 90, 1); //strokeWeight(8); noStroke(); float n; beginShape(); // Root node -- left n = rootSize; curveVertex(rootNode.position().x() - n, rootNode.position().y()); curveVertex(rootNode.position().x() - n, rootNode.position().y()); // Nodes -- left for (int i = 0; i < nodeCount; i++) { n = ((nodeCount - i) * rootSize) / nodeCount; curveVertex(springNodes[i].position().x() - n, springNodes[i].position().y()); } // Nodes -- right for (int i = nodeCount - 1; i >= 0; i--) { n = ((nodeCount - i) * rootSize) / nodeCount; curveVertex(springNodes[i].position().x() + n, springNodes[i].position().y()); } // Root node -- right n = rootSize; curveVertex(rootNode.position().x() + n, rootNode.position().y()); // Root node -- finish curveVertex(rootNode.position().x() - n, rootNode.position().y()); endShape(); fill(51, 153, 0); //stroke(51, 153, 0, 40); noStroke(); beginShape(); // Root node -- left n = rootSize; curveVertex(rootNode.position().x() - n, rootNode.position().y()); curveVertex(rootNode.position().x() - n, rootNode.position().y()); // Nodes -- left for (int i = 0; i < nodeCount; i++) { n = ((nodeCount - i) * rootSize) / nodeCount; curveVertex(springNodes[i].position().x() - n, springNodes[i].position().y()); } // Nodes -- middle for (int i = nodeCount - 1; i >= 0; i--) { n = ((nodeCount - i) * rootSize) / nodeCount; curveVertex(springNodes[i].position().x(), springNodes[i].position().y()); } // Root node -- right n = rootSize; curveVertex(rootNode.position().x() + n, rootNode.position().y()); // Root node -- finish curveVertex(rootNode.position().x() - n, rootNode.position().y()); endShape(); } void wind(float w) { for (int i = 0; i < nodeCount; i++) { springNodes[i].moveBy((i + 1) * random(0, w * 4), random(0, w), 0); } } }