Created
November 19, 2025 01:47
-
-
Save Luna-Klatzer/a0d6134f9ce0781978e3b824c52cbffa to your computer and use it in GitHub Desktop.
A spiral representation of primes using circles in p5.js as an assignment for a university course.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| const dim_width = 200; | |
| const dim_height = 200; | |
| const scale_factor = 4; | |
| const real_width = dim_width * scale_factor; | |
| const real_height = dim_height * scale_factor; | |
| const center = { x: real_width / 2, y: real_height / 2 }; | |
| const bg_color = "#C71242"; | |
| const src_color = "##DAA520"; | |
| const to_color = "#483D8B"; | |
| function setup() { | |
| createCanvas(real_width, real_height); | |
| } | |
| function draw() { | |
| background(bg_color); | |
| const primeGen = genPrime(); | |
| let offSetX = 0; | |
| let offSetY = 0; | |
| let prevOffSetX = 0; | |
| let prevOffSetY = 0; | |
| for (let i = 0; i < 40; i++) { | |
| const fillColor = lerpColor(color(src_color), color(to_color), i / 40); | |
| const primeNumber = primeGen.next().value; | |
| stroke(fillColor); | |
| fill(fillColor); | |
| if (i !== 0) { | |
| offSetX = primeNumber + i * primeNumber * Math.cos(i * 30); | |
| offSetY = primeNumber + i * primeNumber * Math.sin(i * 30); | |
| } | |
| const x = center.x + offSetX / 10; | |
| const y = center.y + offSetY / 10; | |
| drawPrimeCircle(x, y, primeNumber); | |
| const controlPointAX = x + offSetX / 25; | |
| const controlPointAY = y + offSetY / 25; | |
| const controlPointBX = x + prevOffSetX / 25; | |
| const controlPointBY = y + prevOffSetY / 25; | |
| const prevX = center.x + prevOffSetX / 25; | |
| const prevY = center.y + prevOffSetY / 25; | |
| curve(prevX, prevY, controlPointAX, controlPointAY, controlPointBX, controlPointBY, x, y); | |
| prevOffSetX = offSetX; | |
| prevOffSetY = offSetY; | |
| } | |
| } | |
| function* genPrime() { | |
| let curr = 2; | |
| while (true) { | |
| let isPrime = true; | |
| const limit = Math.sqrt(curr); | |
| for (let i = 2; i <= limit; i++) { | |
| if (curr % i === 0) isPrime = false; | |
| } | |
| if (isPrime) { | |
| yield curr; | |
| } | |
| curr++; | |
| } | |
| } | |
| function drawPrimeCircle(x, y, primeNumber) { | |
| const r = Math.sqrt(primeNumber / Math.PI); | |
| const d = 2 * r; | |
| circle(x, y, d * scale_factor); | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment