|
var v0; |
|
var v1; |
|
var v2; |
|
var v3; |
|
var glSize; |
|
|
|
var v4; |
|
var v5; |
|
var v6; |
|
var v7; |
|
|
|
/* |
|
* val4 is an array of 4 numbers that range from [0,100] |
|
* size is the number of pixels for width and height |
|
* use p5.js to draw a round grawscale glpyh within the bounding box |
|
*/ |
|
function glyph4(values, size) { |
|
stroke(0); |
|
noFill(); |
|
var s2 = size/2 |
|
strokeWeight(glSize / 128); |
|
ellipse(s2, s2, size); |
|
v0 = values[0]/100.0; // polypoint size |
|
v1 = values[1]/100.0; // rotation (not useful) |
|
v2 = values[2]/100.0; // number of points |
|
v3 = values[3]/100.0; // number of layered polys |
|
glSize = size; |
|
|
|
var rectSize = size; |
|
push(); |
|
translate(rectSize*.5, rectSize*.5); |
|
|
|
var rectHeight = rectSize / 2.85; |
|
|
|
push(); |
|
|
|
// draw each polygon |
|
var numPolys = max(ceil(v3 * 15), 1); |
|
var numPoints = max(ceil(v2 * 12), 1); |
|
var circMax = (glSize / 3.6); |
|
push(); |
|
for (var i = numPolys; i > 0; i--) { |
|
// rotate a tiny bit depending on v0 |
|
rotate(map(v0, 0, 1, 0, QUARTER_PI * 0.1)); |
|
var amt = i / numPolys; |
|
var iSize = amt * rectHeight; |
|
var circMin = map(amt, 0, 1, 0, circMax); |
|
var circlePointSize = map(v1, 1, 0, circMin, circMax); |
|
drawPoly(0, 0, iSize, numPoints, circlePointSize); |
|
} |
|
pop(); |
|
pop(); |
|
pop(); |
|
} |
|
|
|
function drawPoly(x, y, size, numP, ripSize){ |
|
var numRips = 1; |
|
|
|
var points = circlePoints(x, y, size, numP); |
|
|
|
//draw polygon |
|
push(); |
|
fill(255); |
|
strokeWeight(glSize / 48); |
|
beginShape(); |
|
for(var i = 0; i < points.length; i++){ |
|
var p = points[i]; |
|
vertex(p.x, p.y); |
|
} |
|
endShape(CLOSE); |
|
pop(); |
|
|
|
//draw ellipses on points |
|
push(); |
|
stroke(0); |
|
for(var i = 0; i < points.length; i++){ |
|
var p = points[i]; |
|
for(var c = numRips; c > 0; c--){ |
|
var ripAmt = c / numRips; |
|
var col = (1-ripAmt) * 255; |
|
// console.log(ripAmt); |
|
ellipse(p.x, p.y, ripAmt * ripSize, ripAmt * ripSize); |
|
} |
|
} |
|
pop(); |
|
} |
|
/*Returns a list of points that make up a circle/polygon*/ |
|
function circlePoints(x, y, size, numNodes){ |
|
var nodes = []; |
|
for(var i = 0.0; i < numNodes; i++){ |
|
var node = { |
|
x: 0, |
|
y: 0 |
|
}; |
|
var amt = i/numNodes; |
|
node.x = x + (sin(amt * TWO_PI) * size); |
|
node.y = y + (cos(amt * TWO_PI) * size); |
|
nodes[i] = node; |
|
} |
|
return nodes; |
|
} |
|
|
|
/* |
|
* val8 is an array of 8 numbers that range from [0,100] |
|
* size is the number of pixels for width and height |
|
* use p5.js to draw a square color glpyh within the bounding box |
|
*/ |
|
function glyph8(values, size) { |
|
v0 = values[0]/100.0; // stars |
|
v1 = values[1]/100.0; // land color (health) |
|
v2 = values[2]/100.0; // war |
|
v3 = values[3]/100.0; // planet direction |
|
v4 = values[4]/100.0; // cloud position |
|
v5 = values[5]/100.0; // planet speed |
|
v6 = values[6]/100.0; // twilight / night |
|
v7 = values[7]/100.0; // speed |
|
glSize = size; |
|
|
|
noFill(); |
|
|
|
sky(); |
|
stars(); |
|
push(); |
|
var plx = cos((v3 * TWO_PI) + PI) * glSize * 0.15 * v7; |
|
var ply = sin((v3 * TWO_PI) + PI) * glSize * 0.15 * v7; |
|
translate(plx, ply); |
|
planet(); |
|
pop(); |
|
speedStrokes(); |
|
// pallet(); |
|
} |
|
|
|
function sky(){ |
|
push(); |
|
var skyCol = lerpColor(color(cols.purple),color(0),v5); |
|
fill(skyCol); |
|
noStroke(); |
|
rect(0, 0, glSize, glSize); |
|
pop(); |
|
} |
|
|
|
function stars(){ |
|
noiseSeed(45234); |
|
var numStars = v0 * 100; |
|
for (var i = 0; i < numStars; i++) { |
|
var x = noise(i * 3) * glSize; |
|
var y = noise(i * 28736) * glSize; |
|
star(x, y, noise(i * 123) * 5); |
|
} |
|
} |
|
|
|
function star(x, y, sz){ |
|
push(); |
|
stroke(cols.yellow); |
|
strokeWeight(glSize / 500); |
|
var numPoints = 5; |
|
for(var i = 0; i < numPoints; i++){ |
|
var amt = (i/numPoints) * PI; |
|
line(x + sin(amt) * sz,y + cos(amt) * sz,x + sin(amt+PI) * sz,y + cos(amt+PI) * sz); |
|
} |
|
pop(); |
|
} |
|
|
|
function planet(){ |
|
var planSize = glSize / 2; |
|
push(); |
|
noStroke(); |
|
translate(glSize * .5, glSize * .5); |
|
// atmosphere |
|
var atmoCount = 10; |
|
for (var i = 0; i < atmoCount; i++) { |
|
var amt = (i+1.0) / atmoCount; |
|
var scalar = map(amt, 0.0, 1, 1, 1.5); |
|
fill(cols.blue[0],cols.blue[1],cols.blue[2],log((1-amt)+1)*50*v6); |
|
// fill(255,0,0); |
|
ellipse(0,0, planSize * scalar,planSize * scalar); |
|
} |
|
//planet |
|
fill(cols.blue); |
|
ellipse(0, 0, planSize, planSize); |
|
|
|
countries(planSize); |
|
pop(); |
|
} |
|
|
|
|
|
|
|
function countries(size){ |
|
var c1 = [ |
|
{ x: -size/2.8, y: -size/3 }, |
|
{ x: -size*.5, y: 0 }, |
|
{ x: -size*.3, y: size*0.1}, |
|
{ x: -size*0.2, y: size*0.3}, |
|
{ x: -size*0.15, y: size*0.25}, |
|
{ x: -size*0.1, y: size*-0.1}, |
|
{ x: 0, y: size*-.4} |
|
]; |
|
country(c1); |
|
var c2 = [ |
|
{ x: size*.2, y: -size*0 }, |
|
{ x: size*0.5, y: 0 }, |
|
{ x: size*0.4, y: size*.3 }, |
|
{ x: size*0.2, y: size*.44 }, |
|
]; |
|
country(c2); |
|
//explosions over c1 |
|
var points1 = getDistPoints(size*.4, size*.6, v2*20, v2*1234); |
|
for (var i = 0; i < points1.length; i++) { |
|
var p = points1[i]; |
|
explosion(p.x+c1[0].x, p.y+c1[0].y, glSize*.1*v2); |
|
} |
|
//explosions over c2 |
|
var points1 = getDistPoints(size*.3, size*.4, v2*20, v2*472); |
|
for (var i = 0; i < points1.length; i++) { |
|
var p = points1[i]; |
|
explosion(p.x+c2[0].x, p.y+c2[0].y, glSize*.1*v2); |
|
} |
|
clouds(); |
|
// c1 cities |
|
// var cities1 = |
|
// c2 cities |
|
} |
|
|
|
function country(points){ |
|
push(); |
|
|
|
stroke(color(cols.green[0],cols.green[1],cols.green[2])); |
|
var from = color(cols.darkYellow); |
|
var to = color(cols.green); |
|
colorMode(RGB); // Try changing to HSB. |
|
interA = lerpColor(from, to, v1); |
|
fill(interA); |
|
ellipseMode(CENTER); |
|
stroke(0); |
|
beginShape(); |
|
|
|
for (var i = 0; i <= points.length+2; i++) { |
|
var x = points[i % points.length].x; |
|
var y = points[i % points.length].y; |
|
curveVertex(x,y); |
|
// ellipse(x,y,3,3); |
|
} |
|
endShape(); |
|
pop(); |
|
} |
|
|
|
function clouds(){ |
|
push(); |
|
var cloudSz = glSize * 0.5; |
|
rotate(v4 * TWO_PI); |
|
translate(glSize * 0.3,0); |
|
rotate(HALF_PI); |
|
translate(-cloudSz*.1, 0); |
|
|
|
// translate(glSize * .5, glSize * .5); |
|
ellipseMode(CENTER); |
|
fill(cols.cream); |
|
|
|
noStroke(); |
|
rect(0, 0, cloudSz * .2, cloudSz * .05); |
|
ellipse(0, 0, cloudSz * .1, cloudSz * .1); |
|
ellipse(cloudSz * .2, 0, cloudSz * .1, cloudSz * .1); |
|
ellipse(cloudSz * .1, -cloudSz*.025, cloudSz * .12, cloudSz * .12); |
|
//clouds |
|
noFill(); |
|
strokeWeight(glSize * 0.008); |
|
stroke(cols.cream); |
|
push(); |
|
translate(glSize * 0.008,0); |
|
// ellipse(); |
|
line(0, glSize * .04, glSize * .02, glSize * .1); |
|
line(glSize * .04 , glSize * .04, glSize * .06, glSize * .1); |
|
line(glSize * .08 , glSize * .04, glSize * .1, glSize * .1); |
|
pop(); |
|
pop(); |
|
} |
|
|
|
function explosion(x, y, size){ |
|
push(); |
|
fill(cols.red); |
|
ellipse(x, y, size); |
|
fill(cols.darkYellow); |
|
ellipse(x, y, size/1.3); |
|
pop(); |
|
} |
|
|
|
function getDistPoints(wid, hei, num, seed){ |
|
var pts = []; |
|
noiseSeed(seed); |
|
for (var i = 0; i < num; i++) { |
|
var x = noise(i*123) * wid; |
|
var y = noise(i*12345) * hei; |
|
pts.push({x:x,y:y}); |
|
} |
|
return pts; |
|
} |
|
|
|
function speedStrokes(){ |
|
push(); |
|
translate(glSize * .5,glSize *.5); |
|
rotate(v3 * TWO_PI); |
|
stroke(cols.cream[0],cols.cream[1],cols.cream[2],200); |
|
strokeWeight(glSize * 0.007); |
|
var size = glSize * 0.3 * v7; |
|
var xOff = glSize * 0.15; |
|
translate((1-v7) * glSize * 0.3,0); |
|
bezier(size * 0 + xOff,size * 0, size*.37+ xOff,size * .07, size * 0.59 + xOff, size * .05, size + xOff, size * -0.15); |
|
translate(0,glSize * 0.05); |
|
bezier(size * 0 + xOff,size * 0, size*.37+ xOff,size * .07, size * 0.59 + xOff, size * .05, size + xOff, size * -0.15); |
|
translate(0,glSize * 0.05); |
|
bezier(size * 0 + xOff,size * 0, size*.37+ xOff,size * .07, size * 0.59 + xOff, size * .05, size + xOff, size * -0.15); |
|
pop(); |
|
} |
|
|
|
function sketchyEllipse(xOrig, yOrig, wid, hei, funkAmt, seed){ |
|
var frequency = 3; //jaggedness |
|
seed = seed | 70.8; |
|
wid = wid * 0.5; |
|
hei = hei * 0.5; |
|
//noise seed based on position |
|
noiseSeed(seed); |
|
//set the max funkyness of the ellipse based on size & funk amt |
|
var avgSizeOffset = ((wid + hei) * (constrain(funkAmt, 0, 1.0) * 0.7)); |
|
|
|
var numPoints = 50; |
|
noiseSeed(seed * 10); |
|
beginShape(); |
|
for(var k = 0; k <= numPoints; k++){ |
|
var amt = (k/numPoints) * TWO_PI; |
|
|
|
var noiseX = (cos((k/numPoints)*TWO_PI) + 1)*frequency; |
|
var noiseY = (sin((k/numPoints)*TWO_PI) + 1)*frequency; |
|
|
|
var noiseAmt = noise(noiseX, noiseY) - 0.5; |
|
var nextX = xOrig + sin(amt) * (wid + noiseAmt * avgSizeOffset); |
|
var nextY = yOrig + cos(amt) * (hei + noiseAmt * avgSizeOffset); |
|
vertex(nextX, nextY); |
|
} |
|
endShape(CLOSE); |
|
} |
|
|
|
|
|
|
|
function pallet(){ |
|
var colsKeys = Object.keys(cols); |
|
for (var i = 0; i < colsKeys.length; i++) { |
|
fill(cols[colsKeys[i]]); |
|
// console.log(i,colsKeys[i]); |
|
rect(i*10, 0, 10, 10); |
|
} |
|
} |
|
var cols = { |
|
black: [55, 55, 55], |
|
yellow: [254, 209, 86], |
|
red: [226, 79, 50], |
|
cream: [226, 218, 183], |
|
blue: [88, 182, 194], |
|
darkYellow: [246, 163, 60], |
|
green: [10, 208, 149], |
|
purple: [75,59,125] |
|
}; |