Dot version of the sunburst
Log in to post a comment.
// Adjustable parameters
const dotsPerLine = 8; // min=3 max=15 step=1 Number of dots per radial line
const lineCount = 180; // min=60 max=360 step=10 Number of radiating lines
const innerRadius = 100; // min=30 max=150 step=5 Radius of the inner circle
const outerRadius = 300; // min=150 max=400 step=10 Maximum radius
const offsetAngle = 0.25; // min=0 max=1 step=0.05 Offset angle between rows
const dotSize = 2; // min=1 max=5 step=0.5 Size of dots
const zoomOut = 1; // min=0.2 max=2 step=0.1 Scale factor (smaller values zoom out)
// Create a turtle
const turtle = new Turtle();
Canvas.setpenopacity(1); // Set full opacity for solid black dots
// Position variables
const centerX = 0;
const centerY = 0;
const angleIncrement = 2 * Math.PI / lineCount;
// Function to calculate non-linear spacing between dots
function getDotRadius(dotIndex) {
// Use a quadratic function to make inner dots closer together
const t = dotIndex / dotsPerLine;
const scaleFactor = t * t;
// Apply zoom factor to the radius
return (innerRadius + scaleFactor * (outerRadius - innerRadius)) * zoomOut;
}
// State tracking
let currentLine = 0;
let currentDot = 0;
// Custom function to draw a dot that appears solid
function drawDot(size) {
// Since Turtletoy doesn't have native filled circles,
// we'll create the appearance of a solid dot using very small circles
// Save the current position
const x = turtle.xcor();
const y = turtle.ycor();
// Apply zoom factor to the dot size
const scaledSize = size * zoomOut;
// Draw several concentric circles with decreasing radius
// This creates a more filled appearance
const iterations = 3;
const steps = 18; // More steps for smoother appearance
turtle.pendown();
// Main dot
turtle.right(90); // Point right to start circle
turtle.circle(scaledSize/2, 360, steps); // Outer circle
// Draw smaller circles inside to make it appear more solid
for (let i = 1; i <= iterations; i++) {
const smallerRadius = (scaledSize/2) * (1 - i/iterations);
turtle.circle(smallerRadius, 360, steps);
}
turtle.left(90); // Restore original heading
// Return to the original position and ensure pen is up
turtle.penup();
turtle.goto(x, y);
}
function walk(i) {
// Check if drawing is complete
if (currentLine >= lineCount) {
return false;
}
// Calculate angle with offset for this dot row
const rowOffset = currentDot * offsetAngle * angleIncrement;
const angle = currentLine * angleIncrement + rowOffset;
// Calculate radius for this dot
const dotRadius = getDotRadius(currentDot);
// Move to position
turtle.penup();
const x = centerX + Math.cos(angle) * dotRadius;
const y = centerY + Math.sin(angle) * dotRadius;
turtle.goto(x, y);
// Draw the dot
drawDot(dotSize);
// Move to next dot
currentDot++;
// If we've completed all dots in this line, move to next line
if (currentDot >= dotsPerLine) {
currentDot = 0;
currentLine++;
}
// Continue drawing
return true;
}