memoscan
← all memos

Memo 0x5db93b1e…8cf64b on Ethereum

[1 ,()=>{console.log("Artist 49. Shunsuke Takawo -- platform 1 ");let debugMode = false; let exportMode = false; const MAX_HEIGHT = 3840; const MAX_WIDTH = 2160; const EXPORT_HEIGHT = 3840 * 2; const EXPORT_WIDTH = 2160 * 2; let hash; let hashPairs = []; let decPairs = []; let canvasScale; let params, features; let g, gg; let shaderProgram; let graphics, centerPosition, centerAngle, cam; let palette; let saveBoolean = false; let vn = 0; let cameraAngle; let cameraDistancePercent; /* * setup p5.js */ setup = () => { params = setupParams(); setupCanvas(); noLoop(); if (debugMode) { let features = structuredClone(params); print("================================================"); print("features"); print(features); print("================================================"); return features; } } function setupCanvas() { const canvasSize = calculatePortraitAspectRatio(debugMode); canvasScale = canvasSize.scale; createCanvas(canvasSize.width, canvasSize.height, WEBGL); pixelDensity(1); colorMode(HSB, 360, 100, 100, 100); cam = createCamera(); noSmooth(); } function keyPressed() { if (key == "s" || key == "S") { debugMode = true; exportMode = true; setup(); redraw(); } } /* * draw p5.js */ draw = () => { orbitControl(); randomSeed(0); let d = max(width, height); g = createGraphics(d, d, P2D); g.colorMode(HSB, 360, 100, 100, 100); g.angleMode(DEGREES); // g.noStroke(); let cx = cos(cameraAngle) * cameraDistancePercent * 2500 / 2 * canvasScale; let cy = sin(cameraAngle) * cameraDistancePercent * 2500 / 2 * canvasScale; let v = R.random_dec(); let distance = params.Distance; let perspective; switch (distance) { case "Near": perspective = PI / 2.2; break; case "Middle": perspective = PI / 1.7; break; case "Far": perspective = PI / 1.4; break; } cam.setPosition(cx, cy, 0); cam.lookAt(cx, cy, -15000 * canvasScale); cam.perspective( perspective, width / height, 0.001, 15000 * canvasScale ); g.blendMode(BLEND); g.background(0); let gw = g.width * sqrt(2); let patternSizeMin; let patternSizeMax; switch (params.PatternSize) { case "Small": patternSizeMin = gw / 150; patternSizeMax = gw / 100; break; case "Medium": patternSizeMin = gw / 100; patternSizeMax = gw / 75; break; case "Large": patternSizeMin = gw / 75; patternSizeMax = gw / 50; break; case "XLarge": patternSizeMin = gw / 50; patternSizeMax = gw / 25; break; } let patternSize = R.random_dec() * (patternSizeMax - patternSizeMin) + patternSizeMin; for (let i = 0; i < (params.MultipleDraw ? 1 : 2); i++) { g.push(); g.translate(g.width / 2, g.height / 2); if (params.RotatePattern) { g.rotate(45); } g.translate(-gw / 2, -gw / 2); separateGrid(0, 0, gw, patternSize, g) g.pop(); } directionalLight(color(255), 1, 0, 0); directionalLight(color(255), -1, 0, 0); directionalLight(color(255), 0, 0, -1); ambientLight(color(50)); shearX(0); shearY(0); orbitControl(); push(); // scale(20); rotateX(PI / 2); // rotateY(0 + (PI / 3) * v + (vn * PI) / 3); rotateY(params.ObjectAngle); texture(g); noStroke(); let polygonCorners_num; switch (params.PolygonCorners) { case "Triangle": polygonCorners_num = 3; break; case "Square": polygonCorners_num = 4; break; case "Pentagon": polygonCorners_num = 5; break; case "Hexagon": polygonCorners_num = 6; break; case "Heptagon": polygonCorners_num = 7; break; case "Octagon": polygonCorners_num = 8; break; } cylinder(2500 / 2 * canvasScale, 5000 * canvasScale, polygonCorners_num + 1, 1, false, false); pop(); push(); translate(0, 0, -2501 * canvasScale); fill(0, 255); texture(g); rectMode(CENTER); square(0, 0, (2500 / sqrt(2)) * sqrt(3) * canvasScale); pop(); push(); translate(0, 0, 2501 * canvasScale); rotateZ(TWO_PI / 3 + (TWO_PI / 3) * v + (vn * TWO_PI) / 3); fill(0, 255); texture(g); rectMode(CENTER); pop(); if (exportMode) { save(hash + ".png"); } g.remove(); } function setupParams() { hash = tokenData.hash; if (debugMode) { // hash = "0x622fb6114b74ada47abf7a4721f697623f8c33c89adbe098367416c808cd8447"; print("================================================"); print("debugMode", debugMode); print("hash", hash); print("================================================"); } // noiseSeed(R.random_dec() * 1000000); for (let j = 0; j < 32; j++) { hashPairs.push(hash.slice(2 + j * 2, 4 + j * 2)); } decPairs = hashPairs.map((x) => { return parseInt(x, 16); }); let params = getParams(decPairs); if (!debugMode) { print(params); print("================================================"); print("Colors : ", params.Colors); print("PolygonCorners : ", params.PolygonCorners); print("PatternSize : ", params.PatternSize); print("Distance : ", params.Distance); print("MultipleDraw : ", params.MultipleDraw); print("RotatePattern : ", params.RotatePattern); print("ObjectAngle : ", params.ObjectAngle); print("================================================"); } return params; } function getParams(decPairs) { const colorOjbect = colorScheme[decPairs[1] % colorScheme.length]; palette = colorOjbect.colors; let polygonCornersNum = decPairs[2] % 6 + 3; let polygonCorners; let multipleDraw = decPairs[3] % 6 > 4; let distanceNum = decPairs[5] % 7; let distance; let objectAngle = decPairs[10] % 10 > 5 ? 0 : (decPairs[11] % 360); switch (distanceNum) { case 0: distance = "Near"; break; case 1: case 2: case 3: distance = "Middle"; break; case 4: case 5: case 6: distance = "Far"; break; } switch (polygonCornersNum) { case 3: polygonCorners = "Triangle"; break; case 4: polygonCorners = "Square"; break; case 5: polygonCorners = "Pentagon"; break; case 6: polygonCorners = "Hexagon"; break; case 7: polygonCorners = "Heptagon"; break; case 8: polygonCorners = "Octagon"; break; } cameraAngle = radians(decPairs[7] % 360); cameraDistancePercent = decPairs[8] % 8 * 0.1; if (polygonCorners == "Triangle") { cameraDistancePercent = map(cameraDistancePercent, 0, 1, 0.1, 0.6); } let patternSizeNum = decPairs[4] % 4; let patternSize; switch (patternSizeNum) { case 0: patternSize = "Small"; break; case 1: patternSize = "Medium"; break; case 2: patternSize = "Large"; break; case 3: patternSize = "XLarge"; break; } let rotatePatternNum = decPairs[6] % 10; let rotatePattern = rotatePatternNum < 5; return { Colors: colorOjbect.name, //String PolygonCorners: polygonCorners,//String PatternSize: patternSize,//String Distance: distance,//String MultipleDraw: multipleDraw,//Boolean RotatePattern: rotatePattern,//Boolean ObjectAngle: objectAngle, //Number }; } /** * color palette for drawing */ const colorScheme = [ { name: "Golden Thread Butterfly", colors: ["#f19b4e", "#7f6640", "#dc5845", "#e4d6c8", "#929e79", "#472c2a"], }, { name: "Navy Lion Peony", colors: ["#83834f", "#e0c786", "#30363d", "#db2f38", "#66989c", "#e9ded1"], }, { name: "Charcoal Wind", colors: ["#151015", "#511a28", "#8e563a", "#fcfbfa", "#bf9969", "#718282"], }, { name: "Wisteria Spring", colors: ["#e6bc8a", "#da4742", "#202125", "#909062", "#dba380", "#dcc6b9"], }, { name: "Fragrant Ground", colors: ["#73924d", "#eb9f48", "#b19564", "#aabcb2", "#f0e3d7", "#6b4b2b"], }, { name: "Lagenaria Siceraria", colors: ["#f0ebe1", "#d8ccb3", "#cd2a41", "#8bc08f", "#f69fac", "#c4714c"], }, { name: "Tang grass", colors: ["#f9f5ec", "#d8ae6a", "#d4824b", "#588c92", "#89bfb3", "#b55847"], }, { name: "Pearl and Dragon", colors: ["#dad7c3", "#c7895a", "#343530", "#899c63", "#60827d", "#d6b58a"], }, { name: "Red Dragon", colors: ["#e5e9e9", "#da2034", "#8db4bb", "#4f6a31", "#6ab26d", "#e4bc89"], }, { name: "Phoenix Peony", colors: ["#3c3e46", "#ddded7", "#c07552", "#5b6984", "#809c73", "#c3ae98"], }, { name: "Kara Ori", colors: ["#4d4638", "#f77843", "#fbc836", "#d8b85a", "#6c6e47", "#b0e3ee"], }, { name: "Yu-Zen Dyeing", colors: ["#f5da30", "#338ab6", "#8a8740", "#73563f", "#332321", "#e0dfdf"], }, { name: "Bird and Flower", colors: ["#abb163", "#e9e1cb", "#9b7c4a", "#74a7a0", "#e46641", "#5a5925"], }, { name: "Japanese Ink", colors: ["#000000", "#aaaaaa", "#7f7f7f", "#c9c9c9", "#ffffff", "#7f6640"], }, ]; function calculatePortraitAspectRatio(debugMode) { let scale; if (debugMode) { // debugModeがtrueの場合は、MAX_WIDTHとMAX_HEIGHTを使用してキャンバスサイズを設定 scale = 1; // debugModeではスケールは1とする return { width: MAX_WIDTH, height: MAX_HEIGHT, scale: scale }; } else { // アスペクト比9:16の基準値 const aspectRatioWidth = 9; const aspectRatioHeight = 16; // 画面の幅と高さを取得 let screenWidth = window.innerWidth; let screenHeight = window.innerHeight; // 縦長のアスペクト比に基づいて、画面サイズを調整 if (screenWidth / screenHeight > aspectRatioWidth / aspectRatioHeight) { // 幅が比率に対して大きすぎる場合、高さに基づいて幅を調整 screenWidth = screenHeight * (aspectRatioWidth / aspectRatioHeight); } else { // 高さが比率に対して大きすぎる場合、幅に基づいて高さを調整 screenHeight = screenWidth * (aspectRatioHeight / aspectRatioWidth); } // スケールを計算(現在の画面サイズに対するMAX_WIDTHとMAX_HEIGHTの比率) scale = Math.min(screenWidth / MAX_WIDTH, screenHeight / MAX_HEIGHT); // 計算された幅と高さ、およびスケールをオブジェクトとして返す return { width: screenWidth, height: screenHeight, scale: scale }; } } class Easing { static easeInSine(x) { return 1 - Math.cos((x * Math.PI) / 2); } static easeOutSine(x) { return Math.sin((x * Math.PI) / 2); } static easeInOutSine(x) { return -(Math.cos(Math.PI * x) - 1) / 2; } static easeInQuad(x) { return x * x; } static easeOutQuad(x) { return 1 - (1 - x) * (1 - x); } static easeInOutQuad(x) { return x < 0.5 ? 2 * x * x : 1 - Math.pow(-2 * x + 2, 2) / 2; } static easeInCubic(x) { return x * x * x; } static easeOutCubic(x) { return 1 - Math.pow(1 - x, 3); } static easeInOutCubic(x) { return x < 0.5 ? 4 * x * x * x : 1 - Math.pow(-2 * x + 2, 3) / 2; } static easeInQuart(x) { return x * x * x * x; } static easeOutQuart(x) { return 1 - Math.pow(1 - x, 4); } static easeInOutQuart(x) { return x < 0.5 ? 8 * x * x * x * x : 1 - Math.pow(-2 * x + 2, 4) / 2; } static easeInQuint(x) { return x * x * x * x * x; } static easeOutQuint(x) { return 1 - Math.pow(1 - x, 5); } static easeInOutQuint(x) { return x < 0.5 ? 16 * x * x * x * x * x : 1 - Math.pow(-2 * x + 2, 5) / 2; } static easeInExpo(x) { return x === 0 ? 0 : Math.pow(2, 10 * x - 10); } static easeOutExpo(x) { return x === 1 ? 1 : 1 - Math.pow(2, -10 * x); } static easeInOutExpo(x) { return x === 0 ? 0 : x === 1 ? 1 : x < 0.5 ? Math.pow(2, 20 * x - 10) / 2 : (2 - Math.pow(2, -20 * x + 10)) / 2; } static easeInCirc(x) { return 1 - Math.sqrt(1 - Math.pow(x, 2)); } static easeOutCirc(x) { return Math.sqrt(1 - Math.pow(x - 1, 2)); } static easeInOutCirc(x) { return x < 0.5 ? (1 - Math.sqrt(1 - Math.pow(2 * x, 2))) / 2 : (Math.sqrt(1 - Math.pow(-2 * x + 2, 2)) + 1) / 2; } static easeInBack(x) { const c1 = 1.70158; const c3 = c1 + 1; return c3 * x * x * x - c1 * x * x; } static easeOutBack(x) { const c1 = 1.70158; const c3 = c1 + 1; return 1 + c3 * Math.pow(x - 1, 3) + c1 * Math.pow(x - 1, 2); } static easeInOutBack(x) { const c1 = 1.70158; const c2 = c1 * 1.525; return x < 0.5 ? (Math.pow(2 * x, 2) * ((c2 + 1) * 2 * x - c2)) / 2 : (Math.pow(2 * x - 2, 2) * ((c2 + 1) * (x * 2 - 2) + c2) + 2) / 2; } static easeInElastic(x) { const c4 = (2 * Math.PI) / 3; return x === 0 ? 0 : x === 1 ? 1 : -Math.pow(2, 10 * x - 10) * Math.sin((x * 10 - 10.75) * c4); } static easeOutElastic(x) { const c4 = (2 * Math.PI) / 3; return x === 0 ? 0 : x === 1 ? 1 : Math.pow(2, -10 * x) * Math.sin((x * 10 - 0.75) * c4) + 1; } static easeInOutElastic(x) { const c5 = (2 * Math.PI) / 4.5; return x === 0 ? 0 : x === 1 ? 1 : x < 0.5 ? -(Math.pow(2, 20 * x - 10) * Math.sin((20 * x - 11.125) * c5)) / 2 : (Math.pow(2, -20 * x + 10) * Math.sin((20 * x - 11.125) * c5)) / 2 + 1; } static easeInBounce(x) { return 1 - Easing.easeOutBounce(1 - x); } static easeOutBounce(x) { const n1 = 7.5625; const d1 = 2.75; if (x < 1 / d1) { return n1 * x * x; } else if (x < 2 / d1) { return n1 * (x -= 1.5 / d1) * x + 0.75; } else if (x < 2.5 / d1) { return n1 * (x -= 2.25 / d1) * x + 0.9375; } else { return n1 * (x -= 2.625 / d1) * x + 0.984375; } } static easeInOutBounce(x) { return x < 0.5 ? (1 - Easing.easeOutBounce(1 - 2 * x)) / 2 : (1 + Easing.easeOutBounce(2 * x - 1)) / 2; } } function separateGrid(x, y, d, min_d, target) { let sepNum = int(random(3, 7)); let w = d / sepNum; for (let i = x; i < x + d - 1; i += w) { for (let j = y; j < y + d - 1; j += w) { if (random(100) < 98 && w > min_d) { separateGrid(i, j, w, min_d, target); } else { target.noStroke(); let distance = dist( i + w / 2, j + w / 2, target.width / 2, target.height / 2 ); let v = i + w / 2 > width / 2 ? distance / (sqrt(2) * d) : 1 - distance / (sqrt(2) * d); let t = (v / 3) % 2; let a = constrain(Easing.easeOutSine(t), 0, 1); let b = constrain(Easing.easeOutSine(t), 0, 1); let n = int( noise( (i / target.width) * 2, (w / target.height) * 2, frameCount / 400 ) * 9 ); let z = constrain(Easing.easeOutQuint(abs(t - 1)), 0, 1); let t2 = t; t = pow( Easing.easeOutQuint( noise(x / width, y / height) > 0.5 ? abs(t - 1) : pow(abs(t - 1), 1) ), random(-1, 1) ); target.push(); target.translate(i + w / 2, j + w / 2); target.rectMode(CENTER); target.fill(0); target.rect(0, 0, w * z, w * z); target.drawingContext.clip(); target.fill(random(palette)); target.rotate((n * TWO_PI) / 4); // target.scale(1-t); switch (n) { case 0: target.translate(-w / 2, -w / 2); target.translate(w * t * 3, 0); // target.scale(t); // target.triangle(0, 0, w, 0, 0, w); target.circle(0, 0, w * 2); // * 2, w * 2, 0, PI / 2, PIE); target.circle(-w * 3, 0, w * 2); // 0, w * 2, w * 2, 0, PI / 2, PIE); break; case 1: target.translate(-w / 2, -w / 2); target.translate(w * t * 3, 0); target.circle(w / 2, w / 2, w * (1 - t)); target.circle(-w * 3 + w / 2, w / 2, w * t); break; case 2: target.translate(-w / 2, -w / 2); target.translate(w * t * 3, 0); target.rectMode(CENTER); target.triangle(-w, 0, 0, w, w, 0); target.translate(-w * 2, 0); target.triangle(-w, 0, 0, w, w, 0); break; case 3: target.translate(-w / 2, -w / 2); target.translate(w * t * 3, 0); target.rectMode(CENTER); target.square(w / 2, w / 2, w * (1 - t)); target.square(-w * 3 + w / 2, w / 2, w * t); break; case 4: target.circle(0, 0, w * t * sqrt(2)); break; case 5: target.circle(-w / 2, 0, w * 2 * t); target.circle(+w / 2, 0, w * 2 * (1 - t)); break; case 6: target.push(); target.translate(-w / 2, -w / 2); target.triangle(0, 0, w * t, 0, 0, w * t); target.pop(); target.push(); target.rotate(PI); target.translate(-w / 2, -w / 2); target.triangle(0, 0, w * (1 - t), 0, 0, w * (1 - t)); target.pop(); break; case 7: target.push(); target.translate(-w / 2, -w / 2); target.rectMode(CORNER); target.rect(0, 0, w * a, w * b); target.pop(); break; case 8: target.push(); target.translate(-w / 2, -w / 2); target.arc(0, 0, w * t * 2, w * t * 2, 0, PI / 2); target.pop(); target.push(); target.rotate(PI); target.translate(-w / 2, -w / 2); target.arc(0, 0, w * t * 2, w * t * 2, 0, PI / 2); target.pop(); break; } target.pop(); } } } } }],