From ad80077fc7693c4e9bddfbc87d80d674b3c504ea Mon Sep 17 00:00:00 2001 From: Daniel Kauss Serna Date: Tue, 10 Mar 2026 23:49:10 +0100 Subject: [PATCH] axolotl base, angle constraints --- sketch.js | 46 +++++++++++++++++++++++++++++++++++----------- 1 file changed, 35 insertions(+), 11 deletions(-) diff --git a/sketch.js b/sketch.js index 23fbaaa..6fefa8a 100644 --- a/sketch.js +++ b/sketch.js @@ -7,23 +7,41 @@ class Segment { this.forward = new vec(0, 0); } - get_rel(angle, d) { - let dir = vec.rotate(this.forward, angle); - dir.setMag(d); + get_rel(angleOffset, dist) { + let dir = vec.rotate(this.forward, angleOffset); + dir.setMag(dist); return vec.add(this.pos, dir) } - follow(x, y) { - let target = new vec(x, y); - let dir = vec.sub(this.pos, target); - this.forward = vec.sub(target, this.pos); - dir.setMag(this.size); + follow(targetX, targetY, parentForward = null) { + let target = new vec(targetX, targetY); + + let targetForward = vec.sub(target, this.pos); + let targetAngle = targetForward.heading(); + + if (parentForward) { + let parentAngle = parentForward.heading(); + let diff = targetAngle - parentAngle; + + while (diff < -PI) diff += TWO_PI; + while (diff > PI) diff -= TWO_PI; + + let maxAngle = PI / 10; + diff = constrain(diff, -maxAngle, maxAngle); + + targetAngle = parentAngle + diff; + } + + this.forward = p5.Vector.fromAngle(targetAngle); + + let segmentLength = 20; + let dir = p5.Vector.mult(this.forward, -segmentLength); this.pos = vec.add(target, dir); } } var n = 0; -var sizes = [10, 15, 20, 25, 30, 24, 27, 21, 15, 17, ] +var sizes = [60, 55, 50, 40, 45, 47, 50, 45, 42, 39, 35, 30, 25, 22, 17, 13, ] var segments = []; function setup() { createCanvas(800, 800); @@ -42,11 +60,11 @@ background(150); segments[0].follow(mouseX, mouseY); for (let i = 1; i < n; i++) { let prev_seg = segments[i - 1]; - segments[i].follow(prev_seg.pos.x, prev_seg.pos.y); + segments[i].follow(prev_seg.pos.x, prev_seg.pos.y, prev_seg.forward); } // dibujar - fill(100, 200, 150); + fill(249, 182, 249); stroke(0); strokeWeight(2); @@ -77,4 +95,10 @@ background(150); endShape(CLOSE); + + let eye1 = head.get_rel(HALF_PI / 2, 45); + let eye2 = head.get_rel(-HALF_PI / 2, 45); + fill(0); + circle(eye1.x, eye1.y, 12); + circle(eye2.x, eye2.y, 12); }