Prime Spiral a fork: Prime disk

Numberspiral.com primes to 100000
Every prime number is plotted with both angle and radius to the root of itself

Log in to post a comment.

// Forked from "Prime disk 📀" by Jurgen
// https://turtletoy.net/turtle/dd465e4aa0

// You can find the Turtle API reference here: https://turtletoy.net/syntax
Canvas.setpenopacity(-0.5);

// Global code will be evaluated once.
const turtle = new Turtle();
const scale = 10; // min=0.01  max=1 step=0.01

// The walk function will be called until it returns false.
function walk(i) {
    if(isPrime(i)) [[
        .3 * i**.5 * Math.cos(i**.5 * scale * Math.PI),
        .3 * i**.5 * Math.sin(i**.5 * scale * Math.PI),
    ]].forEach(pt => [.2, .4].forEach(r => drawPoint(turtle, pt, r)));
    return i < 100000;
}

const isPrime = num => {
    for(let i = 2, s = Math.sqrt(num); i <= s; i++) if(num % i === 0) return false;
    return num > 1;
}

function add2(a, b) { return [a[0]+b[0], a[1]+b[1]]; }

////////////////////////////////////////////////////////////////
// Start of some path utility code - Created by Jurgen Westerhof 2023
////////////////////////////////////////////////////////////////
function circlePoints(radius, extend = 2 * Math.PI, clockWiseStart = 0, steps = null, includeLast = false) { return [steps == null? (radius*extend+1)|0: steps].map(steps => Array.from({length: steps}).map((v, i, a) => [radius *  Math.cos(clockWiseStart + extend*i/(a.length-(includeLast?1:0))), radius *  Math.sin(clockWiseStart + extend*i/(a.length-(includeLast?1:0)))])).pop(); }
function pts2Edges(pts) { return pts.map((v, i, a) => [v, a[(i+1)%a.length]]); }
function drawPath(turtle, pts) { return pts.forEach((pt, i) => turtle[i == 0? 'jump':'goto'](pt)); }
function drawTour(turtle, pts) { return drawPath(turtle, pts.concat([pts[0]])); }
function drawPoint(turtle, pt, r = .5) { return drawTour(turtle, circlePoints(r).map(p => add2(p, pt))); }