Sunburst effect.
Log in to post a comment.
// Adjustable parameters
const lineCount = 180; // min=60 max=360 step=10 Number of radiating lines
const rows = 8; // min=4 max=15 step=1 Number of concentric rows
const innerRadius = 100; // min=30 max=150 step=5 Radius of the inner circle
const outerRadius = 300; // min=150 max=400 step=10 Length of the radiating lines
const offsetAngle = 0.25; // min=0 max=1 step=0.05 Offset angle between rows (proportion of spacing)
const lineOpacity = 0.4; // min=0.1 max=1 step=0.1 Line opacity
const zoom = 1.0; // min=0.2 max=2.0 step=0.1 Scale the entire pattern
// Create a turtle
const turtle = new Turtle();
Canvas.setpenopacity(lineOpacity);
// Position variables
const centerX = 0;
const centerY = 0;
const angleIncrement = 2 * Math.PI / lineCount;
// Calculate non-linear spacing between rows (closer at center, wider at edges)
function getRowRadius(rowIndex) {
// Use a quadratic function to make inner rows closer together
const t = rowIndex / rows;
const scaleFactor = t * t;
return innerRadius + scaleFactor * (outerRadius - innerRadius);
}
// Line state tracking
let currentLine = 0;
let currentRow = 0;
function walk(i) {
// Check if drawing is complete
if (currentRow >= rows) {
return false;
}
// Calculate current radius for this row (non-linear spacing)
const rowRadius = getRowRadius(currentRow);
// Calculate next row's radius to determine line length
const nextRowRadius = currentRow < rows - 1 ? getRowRadius(currentRow + 1) : outerRadius;
// Calculate line length (proportional to space between rows)
const rowSpace = nextRowRadius - rowRadius;
const lineLength = rowSpace * 0.7 * (1 + currentRow / (rows * 1.5));
// Calculate angle with offset for this row
// Each row is slightly offset from the previous one
const rowOffset = currentRow * offsetAngle * angleIncrement;
const angle = currentLine * angleIncrement + rowOffset;
// Move to starting position
turtle.penup();
// Apply zoom to coordinates
const scaledStartX = centerX + Math.cos(angle) * rowRadius * zoom;
const scaledStartY = centerY + Math.sin(angle) * rowRadius * zoom;
turtle.goto(scaledStartX, scaledStartY);
// Draw line outward
turtle.pendown();
const scaledEndX = centerX + Math.cos(angle) * (rowRadius + lineLength) * zoom;
const scaledEndY = centerY + Math.sin(angle) * (rowRadius + lineLength) * zoom;
turtle.goto(scaledEndX, scaledEndY);
// Move to next line
currentLine++;
// If we've completed all lines in this row, move to next row
if (currentLine >= lineCount) {
currentLine = 0;
currentRow++;
}
// Continue drawing
return true;
}