/** * Entropretty competition Sakura Cherryblossom. * cherryblossom fades, but revision compo entry stays forever * Thanks to all tonleben crew members - borg / air2k / uLtrA / dossi / tschieses * Created by Fabi - funghi/tonleben */ // Zentriere die Bluete in der Mitte ctx.translate(50, 50); ctx.textAlign = "center"; ctx.textBaseline = "middle"; // --- Blueten-Parameter (Stern) --- const petalCount = 5; //Strahlenzahl const petalSize = 40; //Größe // -- Anzahl der Sterne → Bits 0 + 1 -- const starCountVariants = [2, 3, 4, 5]; const numStars = starCountVariants[bits(seed, 0, 2)]; // Rotationswinkel für Sterne const baseRotations = [10, 25]; const rotationOffsets = { 3: [7, 17.5, 28], 4: [0, 10, 30, 40], 5: [0, 10, 20, 30, 40] }; const rotations = rotationOffsets[numStars] || baseRotations; // -- Steilheit der Sternstrahlen → Bits 2 + 3 !!! const radiusInnerFactor = [0.50, 0.65, 0.75]; const radiusInner = petalSize * radiusInnerFactor[bits(seed, 2, 4)]; // --- Sternform erstellen --- function createStar(numPoints, radiusOuter, rotationAngle) { const points = []; const angleStep = (Math.PI * 2) / (numPoints * 2); for (let i = 0; i < numPoints * 2; i++) { const angle = i * angleStep + ((rotationAngle + 180) * Math.PI / 180); const radius = i % 2 === 0 ? radiusOuter : radiusInner; const x = Math.cos(angle) * radius; const y = Math.sin(angle) * radius; points.push({ x, y }); } return points; } // --- Zeichnen der Bluetenblaetter --- rotations.forEach(rotationOffset => { const starPoints = createStar(petalCount, petalSize, rotationOffset); ctx.beginPath(); starPoints.forEach((point, index) => { if (index === 0) { ctx.moveTo(point.x, point.y); } else { ctx.lineTo(point.x, point.y); } }); ctx.closePath(); ctx.fillStyle = "pink"; ctx.fill(); }); // --- Bluetenstempel zeichnen - Bits 4 --- const stempelGroesseVarianten = [0, 4]; const stempelIndex = bits(seed, 4, 5); const stempelGroesse = stempelGroesseVarianten[stempelIndex]; ctx.beginPath(); ctx.arc(0, 0, stempelGroesse, 0, Math.PI * 2); ctx.fillStyle = "white"; ctx.fill(); const duenn = 1.5; const dick = 3; const kurzeLaenge = 12; const langeLaenge = 16; // --- Berechnung der Strahlenlaenge - Bits 6–13 const strahlLaengen = [ (bits(seed, 6, 7) % 2 === 1) ? langeLaenge : kurzeLaenge, (bits(seed, 7, 8) % 2 === 1) ? langeLaenge : kurzeLaenge, (bits(seed, 8, 9) % 2 === 1) ? langeLaenge : kurzeLaenge, (bits(seed, 9, 10) % 2 === 1) ? langeLaenge : kurzeLaenge, (bits(seed, 10, 11) % 2 === 1) ? langeLaenge : kurzeLaenge, (bits(seed, 11, 12) % 2 === 1) ? langeLaenge : kurzeLaenge, (bits(seed, 12, 13) % 2 === 1) ? langeLaenge : kurzeLaenge, (bits(seed, 13, 14) % 2 === 1) ? langeLaenge : kurzeLaenge ]; // --- Berechnung der Strahldicke - Bits 24–31 const strahlenDicken = [ (bits(seed, 24, 25) % 2 === 1) ? dick : duenn, (bits(seed, 25, 26) % 2 === 1) ? dick : duenn, (bits(seed, 26, 27) % 2 === 1) ? dick : duenn, (bits(seed, 27, 28) % 2 === 1) ? dick : duenn,, (bits(seed, 28, 29) % 2 === 1) ? dick : duenn, (bits(seed, 29, 30) % 2 === 1) ? dick : duenn, (bits(seed, 30, 31) % 2 === 1) ? dick : duenn, (bits(seed, 31, 32) % 2 === 1) ? dick : duenn, ]; // --- Winkel der Strahlen const winkel = [0, 45, 90, 135, 180, 225, 270, 315]; // --- Strahlen zeichnen mit individuellen Dicken for (let i = 0; i < 8; i++) { ctx.beginPath(); ctx.moveTo(0, 0); ctx.lineTo(Math.cos(winkel[i] * Math.PI / 180) * strahlLaengen[i], Math.sin(winkel[i] * Math.PI / 180) * strahlLaengen[i]); ctx.strokeStyle = "white"; ctx.lineWidth = strahlenDicken[i]; ctx.stroke(); } const kleinePunktGroesse = 2.5; const grossePunktGroesse = 4; const pinkPunktGroesse = 2; // Farbvarianten für die Punkte - Bits 14 - 28 const farbVarianten = [ { sichtbar: false, color: "pink", innerColor: null }, // Unsichtbar (Pink) { sichtbar: true, color: "white", innerColor: null }, // Klein (Weiß) { sichtbar: true, color: "white", innerColor: "pink" }, // Weißer Kreis mit pinkem Punkt { sichtbar: true, color: "white", innerColor: null } // Groß (Weiß) ]; let punktZustaende = [ bits(seed, 14, 16) % 4, bits(seed, 16, 18) % 4, bits(seed, 18, 20) % 4, bits(seed, 20, 22) % 4, bits(seed, 22, 24) % 4, bits(seed, 24, 26) % 4, bits(seed, 4, 6) % 4, bits(seed, 2, 4) % 4 ]; for (let i = 0; i < 8; i++) { let x = Math.cos(winkel[i] * Math.PI / 180) * strahlLaengen[i]; let y = Math.sin(winkel[i] * Math.PI / 180) * strahlLaengen[i]; const punktInfo = farbVarianten[punktZustaende[i]]; if (punktInfo.sichtbar) { ctx.beginPath(); let punktGroesse = punktZustaende[i] === 3 ? grossePunktGroesse // Grosser weisser Kreis : punktZustaende[i] === 2 ? grossePunktGroesse // Weisser Kreis mit pinkem Punkt : kleinePunktGroesse; // Alle anderen bleiben klein ctx.arc(x, y, punktGroesse, 0, Math.PI * 2); ctx.fillStyle = punktInfo.color; ctx.fill(); // Falls es ein weisser Kreis mit pinkem Punkt sein soll if (punktInfo.innerColor) { ctx.beginPath(); ctx.arc(x, y, pinkPunktGroesse, 0, Math.PI * 2); ctx.fillStyle = punktInfo.innerColor; ctx.fill(); } } } // Bit 12 Position des zusaetzlichen Mittelpunktes const centerpunktGroessePink = 3.5; const centerpunktGroesseWeiss = 5; const sichtbar2 = bits(seed, 12, 13) % 2 === 1; if (sichtbar2) { ctx.beginPath(); ctx.arc(0, 0, centerpunktGroesseWeiss, 0, Math.PI * 2); ctx.fillStyle = "white"; ctx.fill(); ctx.beginPath(); ctx.arc(0, 0, centerpunktGroessePink, 0, Math.PI * 2); ctx.fillStyle = "pink"; ctx.fill(); }