My first turtle!
Just a triangular grid with some segments removed.
Log in to post a comment.
class Point { constructor(x, y) { this.x = x; this.y = y; } inRectangle(minX, maxX, minY, maxY) { if (this.x < minX || this.x > maxX) { return false; } if (this.y < minY || this.y > maxY) { return false; } return true; } toArray() { return [this.x, this.y]; } } class LineSegment { constructor(p1, p2) { this.p1 = p1; this.p2 = p2; } intersectsRectangle(minX, maxX, minY, maxY) { return this.p1.inRectangle(minX, maxX, minY, maxY) || this.p2.inRectangle(minX, maxX, minY, maxY); } containedInRectangle(minX, maxX, minY, maxY) { return this.p1.inRectangle(minX, maxX, minY, maxY) && this.p2.inRectangle(minX, maxX, minY, maxY); } draw() { turtle.goto(this.p1.toArray()); turtle.pendown(); turtle.goto(this.p2.toArray()); turtle.penup(); } } class Vector2d { constructor(x, y) { this.x = x; this.y = y; } scale(n) { return new Vector2d(this.x * n, this.y * n); } add(other) { return new Vector2d(this.x + other.x, this.y + other.y); } subtract(other) { return new Vector2d(this.x - other.x, this.y - other.y); } } function randomIndex(list) { return Math.floor(list.length * Math.random()); } // Parameters Canvas.setpenopacity(1); const edgeLength = 3; const fractionToRemove = 0.8; const turtle = new Turtle(); turtle.penup(); const sqrt3 = Math.sqrt(3); const canvasSize = 100; const horizontalVector = new Vector2d(edgeLength, 0); const diagonalVector = new Vector2d(edgeLength / 2, edgeLength * sqrt3 / 2); let minIndex = Math.floor(-canvasSize * sqrt3 / edgeLength); let maxIndex = Math.ceil(canvasSize * sqrt3 / edgeLength) // Create all of the line segments let lineSegments = []; for (var i = minIndex; i < maxIndex; i++) { for (var j = minIndex; j < maxIndex; j++) { let start = horizontalVector.scale(i).add(diagonalVector.scale(j)); let end1 = start.add(horizontalVector); let end2 = start.add(diagonalVector); let end3 = start.add(diagonalVector).subtract(horizontalVector); let segments = [ new LineSegment(new Point(start.x, start.y), new Point(end1.x, end1.y)), new LineSegment(new Point(start.x, start.y), new Point(end2.x, end2.y)), new LineSegment(new Point(start.x, start.y), new Point(end3.x, end3.y)) ]; for (var k = 0; k < segments.length; k++) { let segment = segments[k]; if (segment.intersectsRectangle(-canvasSize, canvasSize, -canvasSize, canvasSize)) { lineSegments.push(segment); } } } } // Remove some of the line segments let numSegmentsToRemove = Math.floor(lineSegments.length * fractionToRemove); for (var i = 0; i < numSegmentsToRemove; i++) { lineSegments.splice(randomIndex(lineSegments), 1); } // Draw the remaining segments function walk(i) { for (var i = 0; i < lineSegments.length; i++) { lineSegments[i].draw(); } return false; }