├── .gitignore ├── README.md ├── badges ├── badges_recto.html ├── badges_verso.html ├── circle.js ├── extra_methods.js ├── generators │ ├── 0.js │ ├── 1.js │ ├── 10.js │ ├── 11.js │ ├── 12.js │ ├── 13.js │ ├── 14.js │ ├── 15.js │ ├── 16.js │ ├── 17.js │ ├── 18.js │ ├── 19.js │ ├── 2.js │ ├── 20.js │ ├── 21.js │ ├── 22.js │ ├── 23.js │ ├── 24.js │ ├── 25.js │ ├── 26.js │ ├── 27.js │ ├── 28.js │ ├── 29.js │ ├── 3.js │ ├── 30.js │ ├── 31.js │ ├── 32.js │ ├── 33.js │ ├── 34.js │ ├── 35.js │ ├── 36.js │ ├── 37.js │ ├── 38.js │ ├── 39.js │ ├── 4.js │ ├── 40.js │ ├── 41.js │ ├── 42.js │ ├── 43.js │ ├── 44.js │ ├── 45.js │ ├── 46.js │ ├── 47.js │ ├── 48.js │ ├── 49.js │ ├── 5.js │ ├── 50.js │ ├── 51.js │ ├── 52.js │ ├── 53.js │ ├── 54.js │ ├── 55.js │ ├── 56.js │ ├── 57.js │ ├── 58.js │ ├── 59.js │ ├── 6.js │ ├── 60.js │ ├── 61.js │ ├── 62.js │ ├── 63.js │ ├── 64.js │ ├── 65.js │ ├── 66.js │ ├── 67.js │ ├── 68.js │ ├── 69.js │ ├── 7.js │ ├── 70.js │ ├── 71.js │ ├── 72.js │ ├── 73.js │ ├── 74.js │ ├── 8.js │ └── 9.js ├── grow.svg ├── grow_crop.svg ├── grow_verso.svg ├── index.html ├── save.js ├── trash │ ├── grow_badges_0.html │ ├── grow_badges_1.html │ ├── grow_badges_10.html │ ├── grow_badges_11.html │ ├── grow_badges_12.html │ ├── grow_badges_2.html │ ├── grow_badges_3.html │ ├── grow_badges_4.html │ ├── grow_badges_5.html │ ├── grow_badges_6.html │ ├── grow_badges_7.html │ ├── grow_badges_8.html │ └── grow_badges_9.html └── vendor │ ├── dat.gui.js.map │ ├── dat.gui.min.js │ ├── pdfmake.js │ ├── pdfmake.min.js │ ├── pdfmake.min.js.map │ ├── vfs_fonts.js │ └── vfs_fonts_bkup.js ├── slides ├── css │ ├── print │ │ ├── paper.css │ │ └── pdf.css │ ├── reveal.css │ ├── reveal.scss │ └── theme │ │ ├── README.md │ │ ├── beige.css │ │ ├── black.css │ │ ├── blood.css │ │ ├── league.css │ │ ├── moon.css │ │ ├── night.css │ │ ├── serif.css │ │ ├── simple.css │ │ ├── sky.css │ │ ├── solarized.css │ │ ├── source │ │ ├── beige.scss │ │ ├── black.scss │ │ ├── blood.scss │ │ ├── league.scss │ │ ├── moon.scss │ │ ├── night.scss │ │ ├── serif.scss │ │ ├── simple.scss │ │ ├── sky.scss │ │ ├── solarized.scss │ │ └── white.scss │ │ ├── template │ │ ├── mixins.scss │ │ ├── settings.scss │ │ └── theme.scss │ │ └── white.css ├── img │ ├── GROW_RS_Banner02@2x.png │ └── flashettes │ │ ├── 2017-12-01 (1).png │ │ ├── 2017-12-01 (2).png │ │ ├── 2017-12-01 (3).png │ │ ├── 2017-12-01 (4).png │ │ ├── 2017-12-01.png │ │ ├── flashette.psd │ │ ├── liste.png │ │ └── selection.png ├── index.html ├── js │ ├── head.min.js │ └── reveal.js └── lib │ └── font │ ├── league-gothic │ ├── LICENSE │ ├── league-gothic.css │ ├── league-gothic.eot │ ├── league-gothic.ttf │ └── league-gothic.woff │ └── source-sans-pro │ ├── LICENSE │ ├── source-sans-pro-italic.eot │ ├── source-sans-pro-italic.ttf │ ├── source-sans-pro-italic.woff │ ├── source-sans-pro-regular.eot │ ├── source-sans-pro-regular.ttf │ ├── source-sans-pro-regular.woff │ ├── source-sans-pro-semibold.eot │ ├── source-sans-pro-semibold.ttf │ ├── source-sans-pro-semibold.woff │ ├── source-sans-pro-semibolditalic.eot │ ├── source-sans-pro-semibolditalic.ttf │ ├── source-sans-pro-semibolditalic.woff │ └── source-sans-pro.css ├── sources ├── LICENSE ├── csv │ ├── attendees.csv │ ├── extras.csv │ ├── intervenants_plus_one.csv │ ├── new_kids.csv │ ├── sandbox.csv │ └── staff.csv ├── grow.svg ├── index.html ├── main.js ├── map │ ├── map.html │ └── map0.html ├── package.json ├── parseSvg.js ├── parser.html └── text.png └── utils ├── CatmullRom.js ├── CubicPath.js ├── D3.js ├── Delaunator.js ├── Graphics.js ├── PRNG.js ├── Point.js ├── Poisson.js ├── distributions.js ├── earcut.js ├── geomUtils.js ├── hull.js ├── noise.js └── voronoi.js /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | /sources/ecal2017/ 3 | /sources/node_modules/ 4 | #/sources/csv/ 5 | /badges/trash/ 6 | /workshop/ecal2017/ 7 | /sources/csv/ 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # GROW 2 | [GROW Paris](http://grow.paris), an event about creative coding. 3 | 4 | this repoitory contains some graphic assets and generative designs used to promote the event. -------------------------------------------------------------------------------- /badges/circle.js: -------------------------------------------------------------------------------- 1 | 2 | var Circle = function( count, normalLength, radiusIn, radiusOut ) 3 | { 4 | count = count % 1 == 0 ? count : ( count + 1 ); 5 | this.count = count; 6 | 7 | this.normalLength = normalLength; 8 | this.radiusIn = radiusIn; 9 | this.radiusOut = radiusOut; 10 | 11 | this.angleSpeed = ( PRNG.random() - .5 ) * RAD * .1; 12 | this.points = []; 13 | this.init(); 14 | 15 | 16 | }; 17 | 18 | Circle.prototype = { 19 | 20 | init : function(){ 21 | 22 | var step = PI2 / this.count; 23 | var angle = PRNG.random() * PI2; 24 | 25 | this.points = []; 26 | 27 | for( var i = 0; i < this.count; i++ ){ 28 | angle += step; 29 | 30 | var p = new Point( 0,0 ); 31 | p.angle = angle; 32 | 33 | p.radius = 0; 34 | p.radiusAngle = PRNG.random() * PI2; 35 | p.radiusSpeed = RAD + PRNG.random() * 2 * RAD; 36 | 37 | p.normal = this.normalLength; 38 | this.points.push( p ); 39 | } 40 | 41 | }, 42 | 43 | update : function( s, apply ) 44 | { 45 | var scope = this; 46 | this.points.forEach( function( p ){ 47 | 48 | p.angle += scope.angleSpeed; 49 | p.radius = scope.radiusIn + ( .5 + ( .5 * Math.cos( p.radiusAngle ) ) ) * scope.radiusOut; 50 | p.radiusAngle += p.radiusSpeed; 51 | 52 | var x = Math.cos( p.angle ) * p.radius; 53 | var y = Math.sin( p.angle ) * p.radius; 54 | 55 | //jump in place if true 56 | if( Boolean( apply ) === true ) { 57 | p.x = x; 58 | p.y = y; 59 | }else{ 60 | p.x += ( x - p.x ) * .1; 61 | p.y += ( y - p.y ) * .1; 62 | } 63 | 64 | //compute radius normals 65 | p.lx = p.x + Math.cos( p.angle + HPI ) * p.normal; 66 | p.ly = p.y + Math.sin( p.angle + HPI ) * p.normal; 67 | 68 | p.rx = p.x + Math.cos( p.angle - HPI ) * p.normal; 69 | p.ry = p.y + Math.sin( p.angle - HPI ) * p.normal; 70 | 71 | 72 | } ); 73 | 74 | }, 75 | render : function( ctx, unit ){ 76 | 77 | ctx.beginPath(); 78 | this.points.forEach( function( p, i, a ){ 79 | 80 | //next point on curve 81 | var n = a[ ( i + 1 ) % a.length ]; 82 | 83 | ctx.lineTo( p.x, p.y); 84 | ctx.bezierCurveTo( p.lx, p.ly, n.rx, n.ry, n.x, n.y ); 85 | 86 | 87 | }); 88 | 89 | } 90 | }; 91 | -------------------------------------------------------------------------------- /badges/extra_methods.js: -------------------------------------------------------------------------------- 1 | 2 | function distance( a,b ){ 3 | var dx = a.x - b.x; 4 | var dy = a.y - b.y; 5 | return Math.sqrt( dx*dx+dy*dy ); 6 | } 7 | 8 | function angle( a,b ){ 9 | var dx = a.x - b.x; 10 | var dy = a.y - b.y; 11 | return Math.atan2( dy,dx ); 12 | } 13 | 14 | 15 | function areaABC( a,b,c ){ 16 | var side1 = getDistance(a,b) 17 | var side2 = getDistance(b,c) 18 | var side3 = getDistance(c,a) 19 | var perimeter = (side1 + side2 + side3)/2; 20 | return Math.sqrt(perimeter*((perimeter-side1)*(perimeter-side2)*(perimeter-side3))); 21 | } 22 | 23 | var PI = Math.PI; 24 | var HPI = PI / 2; 25 | var PI2 = PI * 2; 26 | var RAD = PI / 180; 27 | var DEG = 180 / PI; 28 | function lerp ( t, a, b ){ return a * (1-t) + b * t; } 29 | function norm( t, a, b ){return ( t - a ) / ( b - a );} 30 | function map( t, a0, b0, a1, b1 ){ return lerp( norm( t, a0, b0 ), a1, b1 );} 31 | -------------------------------------------------------------------------------- /badges/generators/0.js: -------------------------------------------------------------------------------- 1 | 2 | generators[ genId++ ] = function( g, ctx, s, seed, unit ){ 3 | 4 | PRNG.setSeed( seed || 0 ); 5 | 6 | ctx.save(); 7 | ctx.translate( s/2, s/2 ); 8 | ctx.scale( 1., 0.5); 9 | ctx.rotate( Math.PI / 4 ); 10 | ctx.translate(-s/2, -s/2 ); 11 | 12 | var step = s / 100; 13 | ctx.globalAlpha = .1; 14 | 15 | var sca = 5 / s; 16 | var oct = 8; 17 | var amp = s / 10; 18 | 19 | ctx.globalAlpha = .5; 20 | ctx.beginPath(); 21 | for( i = 0; i <= s; i += step * 2 ){ 22 | for( var j = 0; j <= s; j += step * 2 ){ 23 | var n = PRNG.FBM( i * sca, j * sca, oct ); 24 | var offset = ( n ) * amp; 25 | g.disc( i - offset, j - offset , Math.abs(1+n ) * 3 * unit ); 26 | } 27 | } 28 | 29 | ctx.globalAlpha = 0.5; 30 | ctx.beginPath(); 31 | for( i = 0; i <= s; i += step ){ 32 | for( j = 0; j <= s; j += step ){ 33 | n = PRNG.FBM( i * sca, j * sca, oct ); 34 | offset = ( n ) * amp; 35 | ctx.moveTo( i - offset, j - offset ); 36 | ctx.lineTo( i, j ); 37 | } 38 | } 39 | ctx.stroke(); 40 | ctx.restore(); 41 | 42 | return PORTRAIT; 43 | } -------------------------------------------------------------------------------- /badges/generators/1.js: -------------------------------------------------------------------------------- 1 | 2 | generators[ genId++ ] = function( g, ctx, s, seed, unit ){ 3 | 4 | PRNG.setSeed( seed || 0 ); 5 | 6 | 7 | var count = 10; 8 | var cellSize = s/count; 9 | 10 | var ran = PRNG.random(); 11 | var sca = ( .001 + ran * 0.001 ) / unit; 12 | // g.ctx.globalAlpha = .2; 13 | ctx.lineCap = "round"; 14 | ctx.lineJoin = "round"; 15 | for( var i = 0; i < count; i++ ){ 16 | 17 | for ( var j = 0; j < count; j++ ){ 18 | 19 | var x = i * cellSize; 20 | var y = j * cellSize; 21 | 22 | var tot = 100; 23 | for ( var k = 0; k < tot; k+=.25 ){ 24 | 25 | ctx.lineWidth = map( k, 0, tot, unit, s / ( 20 * unit ), unit ); 26 | 27 | var a = PRNG.FBM( x * sca, y * sca, 1 ) * Math.PI * 2; 28 | 29 | ctx.beginPath(); 30 | ctx.moveTo( x, y ); 31 | 32 | x += Math.cos( a ) * s / ( 100 * unit); 33 | y += Math.sin( a ) * s / ( 100 * unit); 34 | 35 | ctx.lineTo( x, y ); 36 | ctx.stroke(); 37 | } 38 | 39 | } 40 | } 41 | ctx.restore(); 42 | return LANDSCAPE; 43 | }; -------------------------------------------------------------------------------- /badges/generators/10.js: -------------------------------------------------------------------------------- 1 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 2 | 3 | PRNG.setSeed(seed || 0); 4 | 5 | // ctx.save(); 6 | // ctx.translate( s/2,s/2 + s/ 3 ); 7 | // 8 | // var sy = .5; 9 | // ctx.scale( 1, .5 ); 10 | // 11 | // ctx.fillStyle = "#FFF"; 12 | // var step = ( ( s/3 ) * 2 ) / 100; 13 | // for( var i = -( s/3 ); i < ( s/3 ); i+= step ){ 14 | // 15 | // ctx.translate( 0, -step * ( 1 / sy ) ); 16 | // 17 | // 18 | // var r = Math.sin( norm( i, -s/3, s/3 ) ); 19 | // ctx.beginPath(); 20 | // ctx.arc( 0, 0, r * s / 3, 0, Math.PI * 2); 21 | // ctx.fill(); 22 | // ctx.stroke(); 23 | // 24 | // } 25 | // ctx.fillStyle = "#000"; 26 | // ctx.restore(); 27 | 28 | var sy = .5; 29 | ctx.save(); 30 | ctx.fillStyle = "#FFF"; 31 | var oy = s/2 + s/3; 32 | var step = ( ( s/3 ) * 2 ) / 100; 33 | for( var i = -( s/3 ); i < ( s/3 ); i+= step ){ 34 | 35 | var r = Math.sin( norm( i, -s/3, s/3 ) ); 36 | oy -= .45 * step * ( 1 / sy ); 37 | ctx.beginPath(); 38 | ctx.ellipse( s/2, oy, r * s / 3 , r * s / 3 * .5, 0, Math.PI * 2, false); 39 | ctx.fill(); 40 | ctx.stroke(); 41 | 42 | } 43 | ctx.fillStyle = "#000"; 44 | ctx.restore(); 45 | 46 | return LANDSCAPE; 47 | 48 | 49 | } 50 | -------------------------------------------------------------------------------- /badges/generators/11.js: -------------------------------------------------------------------------------- 1 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 2 | 3 | PRNG.setSeed(seed || 0); 4 | 5 | ctx.save(); 6 | ctx.translate( s/2,s/2 + s/ 3 ); 7 | 8 | var sy = .5; 9 | ctx.scale( 1, .5 ); 10 | 11 | var radiusIn = s/5; 12 | var normal = s / 30 + ( PRNG.random() * s/100 ); 13 | var radiusOut = normal * ( 2 + PRNG.random() ); 14 | 15 | var circle = new Circle( 24, normal, radiusIn, radiusOut ); 16 | 17 | ctx.translate( s/2, s/2 ); 18 | var radius = s/3; 19 | for( var i = 0; i < 100; i++ ){ 20 | 21 | var t = ( i / 100 ); 22 | 23 | var y = radius - t * radius * 2; 24 | 25 | var r = Math.cos( t * Math.PI ) * 1.25; 26 | 27 | ctx.restore(); 28 | ctx.save(); 29 | ctx.translate( s/2, s/2 ); 30 | ctx.globalAlpha = .1; 31 | ctx.scale( r, r ); 32 | circle.update( s, true ); 33 | circle.render(ctx, unit); 34 | ctx.fill(); 35 | } 36 | ctx.fillStyle = "#000"; 37 | ctx.restore(); 38 | 39 | return PORTRAIT; 40 | } 41 | -------------------------------------------------------------------------------- /badges/generators/12.js: -------------------------------------------------------------------------------- 1 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 2 | 3 | PRNG.setSeed(seed || 0); 4 | 5 | ctx.save(); 6 | ctx.translate( s/2,s/2 + s/ 3 ); 7 | 8 | var sy = .5; 9 | ctx.scale( 1, .5 ); 10 | 11 | ctx.fillStyle = "#FFF"; 12 | var step = ( ( s/3 ) * 2 ) / 100; 13 | for( var i = -( s/3 ); i < ( s/3 ); i+= step ){ 14 | 15 | ctx.translate( 0, -step * ( 1 / sy ) ); 16 | 17 | var r = Math.sin( map( i, -s/3, s/3, 0, Math.PI ) ) * .95; 18 | 19 | ctx.beginPath(); 20 | var nx = PRNG.FBM( i * 0.01/unit, r, 6 ) * 20; 21 | ctx.rect( nx, 0, r * s / 3, r * s / 3); 22 | ctx.fill(); 23 | ctx.stroke(); 24 | 25 | } 26 | ctx.fillStyle = "#000"; 27 | ctx.restore(); 28 | 29 | return LANDSCAPE; 30 | } 31 | -------------------------------------------------------------------------------- /badges/generators/13.js: -------------------------------------------------------------------------------- 1 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 2 | 3 | PRNG.setSeed(seed || 0); 4 | 5 | ctx.save(); 6 | ctx.translate( s/2,s/2 + s/ 3 ); 7 | 8 | var sy = .5; 9 | ctx.scale( 1, .5 ); 10 | 11 | var radiusIn = s/5; 12 | var normal = s / 30 + ( PRNG.random() * s/100 ); 13 | var radiusOut = normal * ( 2 + PRNG.random() ); 14 | 15 | var circle = new Circle( 32, normal, radiusIn, radiusOut ); 16 | 17 | var radius = s/4; 18 | for( var i = 0; i < 100; i++ ){ 19 | 20 | var t = ( i / 100 ); 21 | 22 | var y = radius - t * radius * 2; 23 | 24 | var r = Math.sin( t * Math.PI ); 25 | 26 | ctx.restore(); 27 | ctx.save(); 28 | ctx.fillStyle = "#FFF"; 29 | ctx.strokeStyle = "#000000"; 30 | 31 | ctx.translate( s/2, s/2 + y ); 32 | ctx.scale( lerp( 1-t, t, r*r ), .5 ); 33 | 34 | 35 | circle.update( s, true ); 36 | circle.render(ctx, unit); 37 | ctx.globalAlpha = .1 / t;// * unit; 38 | ctx.fill(); 39 | 40 | ctx.globalAlpha = .75;// * unit; 41 | ctx.stroke(); 42 | 43 | } 44 | ctx.fillStyle = "#000"; 45 | ctx.restore(); 46 | 47 | return LANDSCAPE; 48 | } 49 | -------------------------------------------------------------------------------- /badges/generators/14.js: -------------------------------------------------------------------------------- 1 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 2 | 3 | PRNG.setSeed(seed || 0); 4 | 5 | var radiusIn = s/4; 6 | var normal = s / 20 + ( PRNG.random() * s/100 ); 7 | var radiusOut = normal * 1.5 ;// normal * ( 2 * PRNG.random() ); 8 | 9 | ctx.globalAlpha = .1 * unit; 10 | ctx.save(); 11 | ctx.translate(s/2, s/2); 12 | ctx.lineWidth = 1 * unit; 13 | ctx.globalAlpha = .15;// * unit; 14 | var circle = new Circle( 25, normal, radiusIn, radiusOut ); 15 | for( var i = 0; i < 40; i++ ){ 16 | 17 | circle.update( s, true ); 18 | circle.render(ctx, unit); 19 | ctx.stroke(); 20 | 21 | } 22 | ctx.restore(); 23 | return PORTRAIT; 24 | } -------------------------------------------------------------------------------- /badges/generators/15.js: -------------------------------------------------------------------------------- 1 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 2 | 3 | PRNG.setSeed(seed || 0); 4 | 5 | ctx.save(); 6 | ctx.translate( s/2,s/2 + s/ 3 ); 7 | 8 | var sy = .5; 9 | ctx.scale( 1, .5 ); 10 | 11 | var radiusIn = s/5; 12 | var normal = s / 30 + ( PRNG.random() * s/100 ); 13 | var radiusOut = normal * ( 2 + PRNG.random() ); 14 | 15 | var circle = new Circle( 16, normal, radiusIn, radiusOut ); 16 | 17 | var radius = s/4; 18 | for( var i = 0; i < 100; i++ ){ 19 | 20 | var t = ( i / 100 ); 21 | 22 | var y = radius - t * radius * 2; 23 | 24 | var r = Math.sin( t * Math.PI * 2 ); 25 | 26 | ctx.restore(); 27 | ctx.save(); 28 | 29 | ctx.globalAlpha = .1; 30 | ctx.translate( s/2, s/2 + y ); 31 | ctx.scale( r, .5 ); 32 | 33 | circle.update( s, true ); 34 | circle.render(ctx, unit); 35 | ctx.fill(); 36 | ctx.stroke(); 37 | 38 | } 39 | ctx.fillStyle = "#000"; 40 | ctx.restore(); 41 | 42 | return LANDSCAPE; 43 | } 44 | -------------------------------------------------------------------------------- /badges/generators/16.js: -------------------------------------------------------------------------------- 1 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 2 | 3 | PRNG.setSeed(seed || 0); 4 | 5 | ctx.save(); 6 | ctx.translate( s/2,s/2 + s/ 3 ); 7 | 8 | var sy = .5; 9 | ctx.scale( 1, .5 ); 10 | 11 | var radiusIn = s/5; 12 | var normal = s / 30 + ( PRNG.random() * s/100 ); 13 | var radiusOut = normal * ( 2 + PRNG.random() ); 14 | 15 | var circle = new Circle( 32, normal, radiusIn, radiusOut ); 16 | 17 | var radius = s/4; 18 | for( var i = 0; i < 100; i++ ){ 19 | 20 | var t = ( i / 100 ); 21 | 22 | var y = radius * .38 - t * radius * 2; 23 | 24 | var r = 1 - Math.pow( t, .75 );//1 - Math.sin( t * t * t * Math.PI * 3 ); 25 | 26 | ctx.restore(); 27 | ctx.save(); 28 | ctx.globalAlpha = .1; 29 | ctx.translate( s/2, s/2 + y ); 30 | ctx.scale( r, .5 ); 31 | circle.update( s, true ); 32 | circle.render(ctx, unit); 33 | ctx.fill(); 34 | ctx.stroke(); 35 | 36 | } 37 | ctx.fillStyle = "#000"; 38 | ctx.restore(); 39 | 40 | return LANDSCAPE; 41 | } 42 | -------------------------------------------------------------------------------- /badges/generators/17.js: -------------------------------------------------------------------------------- 1 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 2 | 3 | PRNG.setSeed(seed || 0); 4 | 5 | var radiusIn = s/5; 6 | var normal = s / 20 + ( PRNG.random() * s/100 ); 7 | var radiusOut = normal * ( 3 + PRNG.random() ); 8 | 9 | var circle = new Circle( 7, normal, radiusIn, radiusOut ); 10 | ctx.save(); 11 | ctx.translate(s/2, s/2); 12 | for( var i = 0; i < 100; i++ ){ 13 | 14 | circle.update( s, true ); 15 | circle.render(ctx, unit); 16 | 17 | ctx.lineWidth = PRNG.random() * 5 * unit; 18 | ctx.globalAlpha = .1; 19 | ctx.stroke(); 20 | } 21 | ctx.restore(); 22 | 23 | return PORTRAIT; 24 | } -------------------------------------------------------------------------------- /badges/generators/18.js: -------------------------------------------------------------------------------- 1 | 2 | generators[ genId++ ] = function( g, ctx, s, seed, unit ){ 3 | 4 | PRNG.setSeed( seed || 0 ); 5 | 6 | 7 | var count = 100; 8 | var cellSize = s/count; 9 | 10 | ctx.save(); 11 | var ran = PRNG.random(); 12 | var sca = ( .001 + ran * 0.001 ) / unit; 13 | ctx.lineCap = "round"; 14 | ctx.lineJoin = "round"; 15 | ctx.shadowBlur = s/100; 16 | g.ctx.globalAlpha = .5; 17 | for( var i = 0; i < count; i++ ){ 18 | 19 | for ( var j = 0; j < count; j++ ){ 20 | 21 | if( PRNG.random() > .1 )continue; 22 | ctx.shadowColor = i%2 === 0 ? "#000":"#FFF"; 23 | ctx.shadowBlur = ( i%2 === 1 ? s/100 : s / 200 ) * unit; 24 | var x = i * cellSize; 25 | var y = j * cellSize; 26 | 27 | var tot = 100; 28 | ctx.beginPath(); 29 | ctx.lineWidth = Math.sqrt( PRNG.random() ) * s/100;// * unit; 30 | for ( var k = 0; k < tot; k++ ){ 31 | 32 | 33 | var a = PRNG.FBM( x * sca, y* sca, 1 ) * Math.PI * 2; 34 | 35 | ctx.moveTo( x, y ); 36 | 37 | x += Math.cos( a ) * s/500; 38 | y += Math.sin( a ) * s/500; 39 | 40 | ctx.lineTo( x, y ) 41 | } 42 | ctx.stroke(); 43 | 44 | } 45 | } 46 | ctx.restore(); 47 | 48 | return LANDSCAPE; 49 | }; -------------------------------------------------------------------------------- /badges/generators/19.js: -------------------------------------------------------------------------------- 1 | 2 | generators[ genId++ ] = function( g, ctx, s, seed, unit ){ 3 | 4 | PRNG.setSeed( seed || 0 ); 5 | 6 | var count = 10; 7 | var cellSize = s/count; 8 | var ran = PRNG.random() * .001; 9 | var sca = ( .0001 + ran ) / unit; 10 | var ox = ( PRNG.random() - .5 ) * s; 11 | var oy = ( PRNG.random() - .5 ) * s; 12 | for( var i = 0; i < count; i++ ){ 13 | 14 | for ( var j = 0; j < count; j++ ){ 15 | 16 | var x = i * cellSize; 17 | var y = j * cellSize; 18 | 19 | var tot = 100; 20 | for ( var k = 0; k < tot; k+=.5 ){ 21 | 22 | ctx.lineWidth = map( k, 0, tot, unit, s/100, unit ); 23 | ctx.globalAlpha = k/tot; 24 | 25 | var a = PRNG.FBM( (ox + x) * sca, ( oy+y ) * sca, 1 ) * Math.PI * 2; 26 | //if( isNaN( a ) )console.log( a ); 27 | ctx.beginPath(); 28 | ctx.moveTo( x, y ); 29 | 30 | x += Math.cos( a ) * s/100; 31 | y += Math.sin( a ) * s/100; 32 | 33 | ctx.lineTo( x, y ); 34 | ctx.stroke(); 35 | } 36 | 37 | } 38 | } 39 | ctx.restore(); 40 | 41 | return LANDSCAPE; 42 | }; -------------------------------------------------------------------------------- /badges/generators/2.js: -------------------------------------------------------------------------------- 1 | 2 | generators[ genId++ ] = function( g, ctx, s, seed, unit ){ 3 | 4 | PRNG.setSeed( seed || 0 ); 5 | 6 | var turns = 10; 7 | var total = Math.PI * 2 * turns; 8 | var minRadius = s / 5; 9 | var maxRadius = minRadius + s/5; 10 | var ga = ( ( 1 + Math.sqrt(5) ) / 2 ) / 5; 11 | 12 | var i=0; 13 | ctx.save(); 14 | ctx.translate( s/2,s/2 ); 15 | ctx.lineJoin = "round"; 16 | var sca = .0005 / unit; 17 | for ( var angle = 0; angle <= total; angle+=ga ){ 18 | 19 | var radius = map( angle, 0, total, minRadius, maxRadius ); 20 | var x = Math.cos( angle ) * radius * .75; 21 | var y = Math.sin( angle ) * radius; 22 | 23 | g.disc( x,y, 2 * unit ); 24 | ctx.moveTo(x,y); 25 | var ang = ( PRNG.FBM( x * sca, y * sca ) * Math.PI * 4 ); 26 | 27 | x += Math.cos( ang ) * radius * .25; 28 | y += Math.sin( ang ) * radius * .25; 29 | ctx.lineTo(x,y); 30 | ctx.stroke(); 31 | 32 | } 33 | ctx.restore(); 34 | 35 | return PORTRAIT; 36 | } -------------------------------------------------------------------------------- /badges/generators/20.js: -------------------------------------------------------------------------------- 1 | 2 | generators[ genId++ ] = function( g, ctx, s, seed, unit ){ 3 | 4 | PRNG.setSeed( seed || 0 ); 5 | 6 | var count = 10; 7 | var cellSize = s/count; 8 | 9 | var ran = PRNG.random() * .001; 10 | var sca = ( .0001 + ran ) / unit; 11 | var ox = ( PRNG.random() - .5 ) * s; 12 | var oy = ( PRNG.random() - .5 ) * s; 13 | for( var i = 0; i < count; i++ ){ 14 | 15 | for ( var j = 0; j < count; j++ ){ 16 | 17 | var x = i * cellSize; 18 | var y = j * cellSize; 19 | 20 | if( PRNG.random() > .75 )continue; 21 | 22 | var skip = 1 + ~~( PRNG.random() * s/500 ); 23 | var thi = ( PRNG.random() * s/200 ) * unit; 24 | 25 | var tot = 150; 26 | 27 | ctx.shadowColor = "#000"; 28 | ctx.shadowBlur = thi; 29 | ctx.globalAlpha = .75; 30 | 31 | var delta = s / 500; 32 | var octaves = 2; 33 | for ( var k = 0; k < tot; k++ ){ 34 | 35 | var t = map( k, 0, tot, 0, thi ); 36 | ctx.lineWidth = ( Math.sin( k/tot * Math.PI * 2 ) * thi ); 37 | 38 | var a = PRNG.FBM( (ox + x) * sca, ( oy+y ) * sca, octaves ) * Math.PI * octaves; 39 | 40 | ctx.beginPath(); 41 | ctx.moveTo( x, y ); 42 | 43 | x += Math.cos( a ) * delta; 44 | y += Math.sin( a ) * delta; 45 | 46 | ctx.lineTo( x, y ); 47 | if( k%skip !== 0 )ctx.stroke(); 48 | 49 | } 50 | ctx.shadowBlur = 0; 51 | 52 | x = i * cellSize; 53 | y = j * cellSize; 54 | ctx.globalAlpha = .25; 55 | ctx.lineWidth = unit; 56 | ctx.beginPath(); 57 | for ( k = 0; k < tot; k++ ){ 58 | a = PRNG.FBM( (ox + x) * sca, ( oy+y ) * sca, octaves ) * Math.PI * octaves; 59 | ctx.moveTo( x, y ); 60 | x += Math.cos( a ) * delta; 61 | y += Math.sin( a ) * delta; 62 | ctx.lineTo( x, y ); 63 | } 64 | ctx.stroke(); 65 | } 66 | } 67 | ctx.restore(); 68 | 69 | return LANDSCAPE; 70 | }; -------------------------------------------------------------------------------- /badges/generators/21.js: -------------------------------------------------------------------------------- 1 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 2 | 3 | PRNG.setSeed(seed || 0); 4 | 5 | var points = []; 6 | var a = PI * 0.5; 7 | var c = new Point(s/2, s/2); 8 | var d = pointAtAngleRadius(a, Math.sqrt(2) * s / 4).add( c); 9 | var ad = pointAtAngleRadius(a-PI/2, Math.sqrt(2) * s / 4).add( c); 10 | var e = pointAtAngleRadius(a+PI, Math.sqrt(2) * s / 4).add( c); 11 | var ae = pointAtAngleRadius(a+PI/2, Math.sqrt(2) * s / 4).add( c); 12 | 13 | ctx.lineCap = 14 | ctx.lineJoin = "butt"; 15 | var ran = PRNG.random(); 16 | ctx.globalAlpha = .05; 17 | for ( var i = 0; i < 100; i++ ){ 18 | 19 | var r = i/100; 20 | var t = PRNG.random(); 21 | var p = d.pointAt( t, e ); 22 | points.push( p ); 23 | 24 | g.bezierCurve( d, ad, p, ae ); 25 | g.bezierCurve( ae, p, e, ad ); 26 | 27 | } 28 | 29 | return PORTRAIT; 30 | }; -------------------------------------------------------------------------------- /badges/generators/22.js: -------------------------------------------------------------------------------- 1 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 2 | 3 | PRNG.setSeed(seed || 0); 4 | 5 | var points = []; 6 | var a = PRNG.random() * PI * 2; 7 | var c = new Point(s/2, s/2); 8 | var d = pointAtAngleRadius(a, Math.sqrt(2) * s / 4).add( c); 9 | 10 | var ad = pointAtAngleRadius(a-PI/2, Math.sqrt(2) * s / 4).add( c); 11 | var e = pointAtAngleRadius(a+PI, Math.sqrt(2) * s / 4).add( c); 12 | var ae = pointAtAngleRadius(a+PI/2, Math.sqrt(2) * s / 4).add( c); 13 | // g.circle(d, unit * 50); 14 | // g.circle(ad, unit * 50); 15 | // g.circle(e, unit * 50); 16 | // g.circle(ae, unit * 50); 17 | 18 | d.set( 0,0 ); 19 | e.set( s,0 ); 20 | 21 | 22 | var segments = []; 23 | for ( var i = 0; i < 100; i++ ){ 24 | 25 | var x = s/2 + ( PRNG.random() - .5 ) * s / 2; 26 | var y = s/2 + ( PRNG.random() - .5 ) * s / 2; 27 | 28 | var a = PRNG.random() * 2 * Math.PI; 29 | var l = 10*unit + PRNG.random() * 50*unit; 30 | 31 | segments.push( [ 32 | new Point( x - Math.cos( a ) * l, y - Math.sin( a ) * l ), 33 | new Point( x + Math.cos( a ) * l, y + Math.sin( a ) * l ), 34 | ] ) 35 | 36 | } 37 | 38 | segments.forEach(function( s ){ 39 | g.line( s[0], s[1]) 40 | g.disc( s[0], 2 ) 41 | g.disc( s[1], 2 ) 42 | }) 43 | 44 | ctx.lineCap = ctx.lineJoin = "butt"; 45 | var ran = PRNG.random(); 46 | var segs = []; 47 | ctx.globalAlpha = .1; 48 | for ( var i = 0; i < 100; i++ ){ 49 | 50 | var r = i/100; 51 | var t = PRNG.random(); 52 | // var p = d.pointAt( t, e ); 53 | // var ep = new Point(p.x, s); 54 | 55 | 56 | var a = PRNG.random() * 2 * Math.PI; 57 | // var p = pointAtAngleRadius(a, Math.sqrt(2) * s / 4).add( c); 58 | // var ep = pointAtAngleRadius(a+PI, Math.sqrt(2) * s / 4).add( c); 59 | 60 | var l = 10*unit + PRNG.random() * 20*unit; 61 | var x = s/2 + ( PRNG.random() - .5 ) * s; 62 | var y = s/2 + ( PRNG.random() - .5 ) * s; 63 | 64 | p = new Point( x - Math.cos( a ) * l, y - Math.sin( a ) * l ) 65 | ep = new Point( x + Math.cos( a ) * l, y + Math.sin( a ) * l ) 66 | points.push( p ); 67 | 68 | g.line( p, ep ); 69 | 70 | // g.disc(p,10 * unit) 71 | 72 | 73 | // console.log (ip ) 74 | // if( ip === undefined ) { 75 | // ip = new Point(p.x, s); 76 | // } 77 | // g.line( p, ip ); 78 | // g.disc( ip, 5 ); 79 | 80 | segs.push( [p, ep ]) 81 | 82 | 83 | } 84 | segs.forEach( function (seg0){ 85 | 86 | var ints = []; 87 | segments.forEach(function (s){ 88 | 89 | var tip = geomUtils.lineIntersectLine( seg0[0],seg0[1], s[0], s[1], false, true ); 90 | 91 | if( tip != null ){ 92 | ints.push( tip ) 93 | } 94 | 95 | }); 96 | 97 | if( ints.length === 0 )return; 98 | 99 | ints.sort( function( a, b ){ 100 | return getDistance( seg0[0], a ) - getDistance( seg0[0], b ); 101 | }); 102 | 103 | 104 | var c = ints.length; 105 | var t = ints.length; 106 | while( c-- ){ 107 | 108 | // console.log (ints) 109 | var ip = ints.shift(); 110 | // ctx.lineWidth = c/t * 2 * unit; 111 | ctx.globalAlpha = c/t ; 112 | g.disc( ip, 10 * unit * c/t ); 113 | g.line( seg0[0], ip ); 114 | } 115 | 116 | }) 117 | return PORTRAIT; 118 | 119 | }; -------------------------------------------------------------------------------- /badges/generators/23.js: -------------------------------------------------------------------------------- 1 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 2 | 3 | PRNG.setSeed(seed || 0); 4 | 5 | var a = PRNG.random() * PI * 2; 6 | var c = new Point(s/2, s/2); 7 | var d = pointAtAngleRadius(a, Math.sqrt(2) * s / 4).add( c); 8 | 9 | var ad = pointAtAngleRadius(a-PI/2, Math.sqrt(2) * s / 4).add( c); 10 | var e = pointAtAngleRadius(a+PI, Math.sqrt(2) * s / 4).add( c); 11 | var ae = pointAtAngleRadius(a+PI/2, Math.sqrt(2) * s / 4).add( c); 12 | 13 | d.set( 0,0 ); 14 | e.set( s,0 ); 15 | 16 | 17 | var segments = []; 18 | for ( var i = 0; i < 100; i++ ){ 19 | 20 | var x = s/2 + ( PRNG.random() - .5 ) * s / 4; 21 | var y = s/2 + ( PRNG.random() - .5 ) * s / 4; 22 | 23 | var a = PRNG.random() * 2 * Math.PI; 24 | var l = s/ 3 + PRNG.random() * 50*unit; 25 | 26 | segments.push( [ 27 | new Point( x - Math.cos( a ) * l, y - Math.sin( a ) * l ), 28 | new Point( x + Math.cos( a ) * l, y + Math.sin( a ) * l ), 29 | ] ) 30 | 31 | } 32 | 33 | ctx.globalAlpha = .5; 34 | segments.forEach(function( s ){ 35 | g.line( s[0], s[1]); 36 | g.disc( s[0], unit ); 37 | g.disc( s[1], unit ); 38 | }); 39 | 40 | var points = []; 41 | segments.forEach( function (seg0, i){ 42 | 43 | var ints = []; 44 | segments.forEach(function (s, j){ 45 | 46 | if( i==j )return; 47 | 48 | var tip = geomUtils.lineIntersectLine( seg0[0],seg0[1], s[0], s[1], true, true ); 49 | 50 | if( tip != null ){ 51 | ints.push( tip ) 52 | } 53 | 54 | }); 55 | 56 | g.line( seg0[0], seg0[1] ); 57 | 58 | if( ints.length === 0 )return; 59 | 60 | ints.sort( function( a, b ){ 61 | return getDistance( seg0[0], a ) - getDistance( seg0[1], b ); 62 | }); 63 | 64 | 65 | var c = ints.length; 66 | var t = ints.length; 67 | while( c-- ){ 68 | 69 | var ip = ints[0]; 70 | ints.push( ints.shift()); 71 | ctx.globalAlpha = 1; 72 | g.disc( ip, 2 * unit ); 73 | points.push( ip ); 74 | } 75 | ctx.globalAlpha = .1; 76 | g.line( ints[0], ints[ints.length - 1 ] ); 77 | 78 | }); 79 | 80 | var voronoi = new Voronoi(); 81 | var bbox = {xl: -s, xr: s, yt: -s, yb: s}; 82 | var diagram = voronoi.compute(points, bbox); 83 | 84 | diagram.edges.forEach(function(e){ 85 | ctx.globalAlpha = .25; 86 | ctx.beginPath(); 87 | ctx.moveTo(e.va.x, e.va.y); 88 | ctx.lineTo(e.vb.x, e.vb.y); 89 | ctx.stroke(); 90 | 91 | }); 92 | 93 | 94 | ctx.restore(); 95 | 96 | function drawTri( ctx, a, b, c ){ 97 | 98 | 99 | ctx.beginPath(); 100 | ctx.moveTo( a.x, a.y ); 101 | ctx.lineTo( b.x, b.y ); 102 | ctx.lineTo( c.x, c.y ); 103 | ctx.lineTo( a.x, a.y ); 104 | 105 | 106 | } 107 | 108 | return LANDSCAPE; 109 | 110 | }; -------------------------------------------------------------------------------- /badges/generators/24.js: -------------------------------------------------------------------------------- 1 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 2 | 3 | PRNG.setSeed(seed || 0); 4 | 5 | var points = []; 6 | var a = PI ; 7 | var c = new Point(s/2, s/2); 8 | var d = pointAtAngleRadius(a, Math.sqrt(2) * s / 4).add( c); 9 | var ad = pointAtAngleRadius(a-PI/2, Math.sqrt(2) * s / 4).add( c); 10 | var e = pointAtAngleRadius(a+PI, Math.sqrt(2) * s / 4).add( c); 11 | var ae = pointAtAngleRadius(a+PI/2, Math.sqrt(2) * s / 4).add( c); 12 | 13 | ctx.lineCap = 14 | ctx.lineJoin = "butt"; 15 | var ran = PRNG.random(); 16 | ctx.globalAlpha = .05; 17 | for ( var i = 0; i < 100; i++ ){ 18 | 19 | var r = i/100; 20 | var t = PRNG.random(); 21 | var p = d.pointAt( t, e ); 22 | points.push( p ); 23 | 24 | ctx.globalAlpha = .1; 25 | ctx.lineWidth = unit; 26 | p = d.pointAt( t, ae ); 27 | g.bezierCurve( e.pointAt( t,ae ), ae, ad, p ); 28 | 29 | p = e.pointAt( t, ad ); 30 | g.bezierCurve( d.pointAt( t,ad ), ad, ae, p ); 31 | } 32 | 33 | return PORTRAIT; 34 | }; -------------------------------------------------------------------------------- /badges/generators/25.js: -------------------------------------------------------------------------------- 1 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 2 | 3 | PRNG.setSeed(seed || 0); 4 | 5 | var points = []; 6 | var a = PI * .5; 7 | var c = new Point(s/2, s/2); 8 | var d = pointAtAngleRadius(a, Math.sqrt(2) * s / 4).add( c); 9 | var ad = pointAtAngleRadius(a-PI/2, Math.sqrt(2) * s / 4).add( c); 10 | var e = pointAtAngleRadius(a+PI, Math.sqrt(2) * s / 4).add( c); 11 | var ae = pointAtAngleRadius(a+PI/2, Math.sqrt(2) * s / 4).add( c); 12 | 13 | ctx.lineCap = 14 | ctx.lineJoin = "butt"; 15 | var ran = PRNG.random(); 16 | ctx.globalAlpha = .05; 17 | for ( var i = 0; i < 100; i++ ){ 18 | 19 | var r = i/100; 20 | var t = PRNG.random(); 21 | var p = d.pointAt( t, e ); 22 | points.push( p ); 23 | 24 | ctx.globalAlpha = .05; 25 | ctx.lineWidth = r * 20 * unit; 26 | g.bezierCurve( d, ad, p, ae ); 27 | ctx.fill(); 28 | 29 | ctx.lineWidth = unit * 2; 30 | p = e.pointAt( t, ad ); 31 | p.y = 0; 32 | g.bezierCurve( d.pointAt( t,ad ), ad, ae, p ); 33 | g.disc( p, 2 * unit) 34 | } 35 | 36 | return LANDSCAPE; 37 | 38 | }; -------------------------------------------------------------------------------- /badges/generators/26.js: -------------------------------------------------------------------------------- 1 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 2 | 3 | //quads are arrays storing the top left and bottom right corners 4 | //of a rect, no need for an actual class 5 | var Quad = { 6 | 7 | build: function (x, y, l, b) { 8 | return [x, y, l, b]; 9 | }, 10 | 11 | split: function (quad, nx, ny) { 12 | 13 | var ox = quad[0]; 14 | var oy = quad[1]; 15 | 16 | var right = quad[2]; 17 | var bottom = quad[3]; 18 | 19 | return [ 20 | 21 | //top left 22 | Quad.build(ox, oy, nx, ny), 23 | 24 | //top right 25 | Quad.build(nx, oy, right, ny), 26 | 27 | // bottom right 28 | Quad.build(nx, ny, right, bottom), 29 | 30 | //bottom left 31 | Quad.build(ox, ny, nx, bottom) 32 | 33 | ]; 34 | }, 35 | 36 | contains: function (quad, x, y) { 37 | return quad[0] < x && x < quad[2] && quad[1] < y && y < quad[3]; 38 | }, 39 | 40 | draw: function (ctx, quad) { 41 | ctx.beginPath(); 42 | ctx.moveTo(quad[0], quad[1]); 43 | ctx.lineTo(quad[2], quad[1]); 44 | ctx.lineTo(quad[2], quad[3]); 45 | ctx.lineTo(quad[0], quad[3]); 46 | ctx.lineTo(quad[0], quad[1]); 47 | ctx.fill(); 48 | } 49 | 50 | }; 51 | PRNG.setSeed(seed || 0); 52 | 53 | 54 | quads = [Quad.build(0, 0, s, s)]; 55 | ctx.save(); 56 | 57 | while( quads.length < 1000 ){ 58 | 59 | //gets a random quad 60 | var id = parseInt( ( 1-Math.sqrt( PRNG.random() ) ) * quads.length ); 61 | 62 | var q = quads[id]; 63 | 64 | //finds it's center 65 | var x = q[0] + ( q[2] - q[0] ) / 2; 66 | var y = q[1] + ( q[3] - q[1] ) / 2; 67 | 68 | //then remove this quad from our list 69 | q = quads.splice(id, 1)[0]; 70 | 71 | //subdivide it 72 | var tmp = Quad.split(q, x, y); 73 | 74 | //and merge the 4 new quads to the list 75 | quads = quads.concat(tmp); 76 | 77 | } 78 | 79 | ctx.globalAlpha = 1; 80 | quads.forEach(function (q, i) { 81 | var v = 0xFF - ( i % 0xFF ); 82 | ctx.strokeStyle = "rgba(" + v + "," + v + "," + v + ",1)"; 83 | ctx.fillStyle = "rgba(" + v + "," + v + "," + v + ",1)"; 84 | Quad.draw(ctx, q); 85 | ctx.stroke(); 86 | }); 87 | 88 | ctx.restore(); 89 | 90 | return LANDSCAPE; 91 | 92 | 93 | }; 94 | -------------------------------------------------------------------------------- /badges/generators/27.js: -------------------------------------------------------------------------------- 1 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 2 | 3 | //tris are arrays storing the top left and bottom right corners 4 | //of a rect, no need for an actual class 5 | var Tri = { 6 | 7 | build: function ( a,b,c) { 8 | return [a,b,c]; 9 | }, 10 | 11 | split: function (tri, r0, r1 ) { 12 | 13 | var p0 = tri[0].pointAt(r0, tri[1]); 14 | var p1 = tri[0].pointAt(r0, tri[2]); 15 | var p = p0.pointAt( r1, p1 ); 16 | 17 | return [ 18 | 19 | Tri.build( tri[0], p, tri[1] ), 20 | Tri.build( tri[1], p, tri[2] ), 21 | Tri.build( tri[2], p, tri[0] ) 22 | 23 | ]; 24 | }, 25 | 26 | draw: function (ctx, tri) { 27 | ctx.beginPath(); 28 | ctx.moveTo(tri[0].x, tri[0].y); 29 | ctx.lineTo(tri[1].x, tri[1].y); 30 | ctx.lineTo(tri[2].x, tri[2].y); 31 | ctx.fill(); 32 | } 33 | 34 | }; 35 | PRNG.setSeed(seed || 0); 36 | 37 | var ang = -PI / 2; 38 | var step = PI / 3 * 2; 39 | var r = s * Math.sqrt(2) * 2; 40 | 41 | var a = new Point( Math.cos( ang ) * r, Math.sin( ang ) * r ); 42 | ang+=step; 43 | var b = new Point( Math.cos( ang ) * r, Math.sin( ang ) * r ); 44 | ang+=step; 45 | var c = new Point( Math.cos( ang ) * r, Math.sin( ang ) * r ); 46 | 47 | tris = [Tri.build(a,b,c)]; 48 | ctx.save(); 49 | ctx.translate(s/2,s/2+ 0.5 * r); 50 | g.polyline([a,b,c], true); 51 | while( tris.length < 10000 ){ 52 | 53 | //gets a random quad 54 | var id = parseInt( ( 1-Math.sqrt( PRNG.random() ) ) * tris.length ); 55 | 56 | var t = tris[id]; 57 | t = tris.splice(id, 1)[0]; 58 | 59 | //subdivide it 60 | var tmp = Tri.split( t, PRNG.random(), PRNG.random() ); 61 | tris = tris.concat(tmp); 62 | 63 | } 64 | ctx.save(); 65 | tris.forEach(function (q, i) { 66 | var v = 0xFF - ( i % 0xFF ); 67 | ctx.strokeStyle = "#000"; 68 | ctx.globalAlpha = .5; 69 | ctx.lineWidth = 14 * unit; 70 | Tri.draw(ctx, q); 71 | ctx.stroke(); 72 | ctx.strokeStyle = ctx.fillStyle = "rgba(" + v + "," + v + "," + v + ",1)"; 73 | ctx.lineWidth = 10 * unit; 74 | Tri.draw(ctx, q); 75 | ctx.stroke(); 76 | }); 77 | 78 | ctx.restore(); 79 | ctx.restore(); 80 | 81 | return LANDSCAPE; 82 | 83 | }; 84 | -------------------------------------------------------------------------------- /badges/generators/28.js: -------------------------------------------------------------------------------- 1 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 2 | 3 | var Tri = { 4 | 5 | build: function ( a,b,c) { 6 | return [a,b,c]; 7 | }, 8 | 9 | split: function (tri, r0, r1 ) { 10 | 11 | var p0 = tri[0].pointAt(r0, tri[1]); 12 | var p1 = tri[0].pointAt(r0, tri[2]); 13 | var p = p0.pointAt( r1, p1 ); 14 | 15 | return [ 16 | 17 | Tri.build( tri[0], p, tri[1] ), 18 | Tri.build( tri[1], p, tri[2] ), 19 | Tri.build( tri[2], p, tri[0] ) 20 | 21 | ]; 22 | }, 23 | 24 | draw: function (ctx, tri) { 25 | ctx.beginPath(); 26 | ctx.moveTo(tri[0].x, tri[0].y); 27 | ctx.lineTo(tri[1].x, tri[1].y); 28 | ctx.lineTo(tri[2].x, tri[2].y); 29 | ctx.fill(); 30 | } 31 | 32 | }; 33 | PRNG.setSeed(seed || 0); 34 | 35 | var points= []; 36 | var tot = 10; 37 | var ang = -PI / 2; 38 | var step = PI * 2 / tot; 39 | var r = s * Math.sqrt( 2 ) * .5; 40 | 41 | ctx.save(); 42 | ctx.shadowColor = "#000"; 43 | ctx.translate(s/2,s/2); 44 | var cell = s / tot; 45 | 46 | ctx.shadowBlur = 50 * unit; 47 | for( var j = 0; j <= tot; j++ ){ 48 | for( var i = 0; i <= tot; i++ ){ 49 | 50 | // var a = new Point( Math.cos( ang ) * r, Math.sin( ang ) * r ); 51 | var a = new Point( cell * i -s/2, cell * j -s/2); 52 | points.push( a ); 53 | } 54 | 55 | } 56 | 57 | var ox = PRNG.random() * s; 58 | var oy = PRNG.random() * s; 59 | // points.sort( function( a,b ){return PRNG.random() > .5 ? - 1 : 1;}); 60 | points.forEach( function(a){ 61 | 62 | var sca = unit; 63 | var r = Math.min( 10, 1 + Math.abs( PRNG.FBM( ( ox + a.x ) * sca, ( oy + a.y ) * sca, 2 ) * Math.PI * 3 ) ); 64 | ctx.fillStyle = "#FFF"; 65 | g.disc( a, 20 * unit * r ); 66 | 67 | }); 68 | 69 | ctx.restore(); 70 | ctx.drawImage( segment( ctx.canvas, s, 8), 0,0 ); 71 | 72 | ctx.restore(); 73 | return LANDSCAPE; 74 | 75 | }; 76 | 77 | function segment( imageOrCanvas, s, steps ) 78 | { 79 | 80 | var canvas = document.createElement("canvas"); 81 | canvas.width = s; 82 | canvas.height = s; 83 | 84 | var context = canvas.getContext("2d"); 85 | context.fillStyle = "rgba(255,255,255,255)"; 86 | context.fillRect(0, 0, s, s); 87 | context.drawImage(imageOrCanvas, 0, 0 ); 88 | 89 | var imgData = context.getImageData(0, 0, s, s); 90 | var data = imgData.data; 91 | 92 | for( var i = 0; i < data.length; i += 4 ) 93 | { 94 | data[i] = parseInt(parseInt( ( data[i] / 0xFF ) * steps + .5 ) * ( 0xFF / steps ) ); 95 | data[i + 1] = parseInt(parseInt( ( data[i + 1] / 0xFF ) * steps + .5 ) * ( 0xFF / steps ) ); 96 | data[i + 2] = parseInt(parseInt( ( data[i + 2] / 0xFF ) * steps + .5 ) * ( 0xFF / steps ) ); 97 | } 98 | 99 | imgData.data = data; 100 | context.putImageData( imgData, 0, 0 ); 101 | return canvas; 102 | } 103 | // var img = document.getElementById( "me_gusta" ); 104 | // segment( img, 16 ); 105 | // segment( img, 8 ); 106 | // segment( img, 1 ); -------------------------------------------------------------------------------- /badges/generators/29.js: -------------------------------------------------------------------------------- 1 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 2 | 3 | var Tri = { 4 | 5 | build: function ( a,b,c) { 6 | return [a,b,c]; 7 | }, 8 | 9 | split: function (tri, r0, r1 ) { 10 | 11 | var p0 = tri[0].pointAt(r0, tri[1]); 12 | var p1 = tri[0].pointAt(r0, tri[2]); 13 | var p = p0.pointAt( r1, p1 ); 14 | 15 | return [ 16 | 17 | Tri.build( tri[0], p, tri[1] ), 18 | Tri.build( tri[1], p, tri[2] ), 19 | Tri.build( tri[2], p, tri[0] ) 20 | 21 | ]; 22 | }, 23 | 24 | draw: function (ctx, tri) { 25 | ctx.beginPath(); 26 | ctx.moveTo(tri[0].x, tri[0].y); 27 | ctx.lineTo(tri[1].x, tri[1].y); 28 | ctx.lineTo(tri[2].x, tri[2].y); 29 | ctx.fill(); 30 | } 31 | 32 | }; 33 | PRNG.setSeed(seed || 0); 34 | 35 | var ang = PI / 2; 36 | var step = PI / 3 * 2; 37 | var r = s * 0.3; 38 | 39 | var a = new Point( Math.cos( ang ) * r, Math.sin( ang ) * r ); 40 | ang+=step; 41 | var b = new Point( Math.cos( ang ) * r, Math.sin( ang ) * r ); 42 | ang+=step; 43 | var c = new Point( Math.cos( ang ) * r, Math.sin( ang ) * r ); 44 | 45 | tris = [Tri.build(a,b,c)]; 46 | ctx.save(); 47 | 48 | ctx.translate(s/2,s/2); 49 | // ctx.strokeStyle = "#FFF"; 50 | ctx.lineWidth = 5 * unit; 51 | g.polyline([a,b,c], true); 52 | while( tris.length < 100 ){ 53 | 54 | //gets a random quad 55 | var id = parseInt( ( 1-Math.sqrt( PRNG.random() ) ) * tris.length ); 56 | 57 | var t = tris[id]; 58 | t = tris.splice(id, 1)[0]; 59 | 60 | //subdivide it 61 | var tmp = Tri.split( t, PRNG.random(), PRNG.random() ); 62 | tris = tris.concat(tmp); 63 | 64 | } 65 | ctx.save(); 66 | 67 | tris.forEach(function (q, i) { 68 | 69 | // ctx.shadowBlur = unit * 50.1 * ( i / 100 + 1 ); 70 | 71 | ctx.globalAlpha = .01; 72 | g.disc( q[0], ( i / 100 + 1 ) * i * .45 * unit ); 73 | g.disc( q[1], ( i / 100 + 1 ) * i * .45 * unit ); 74 | g.disc( q[2], ( i / 100 + 1 ) * i * .45 * unit ); 75 | 76 | ctx.globalAlpha = .25; 77 | var v = 0xFF - ~~( i / 100 * 0xFF ); 78 | ctx.strokeStyle = ctx.fillStyle = "rgba(" + v + "," + v + "," + v + ",1)"; 79 | ctx.lineWidth = unit; 80 | Tri.draw(ctx, q); 81 | ctx.stroke(); 82 | }); 83 | 84 | 85 | ctx.restore(); 86 | ctx.restore(); 87 | 88 | return PORTRAIT; 89 | 90 | }; 91 | -------------------------------------------------------------------------------- /badges/generators/3.js: -------------------------------------------------------------------------------- 1 | 2 | generators[ genId++ ] = function( g, ctx, s, seed, unit ){ 3 | 4 | PRNG.setSeed( seed || 0 ); 5 | 6 | var turns = 5; 7 | var total = Math.PI * 2 * turns; 8 | var minRadius = s/5; 9 | var maxRadius = minRadius + s/5; 10 | var ga = ( ( 1 + Math.sqrt(5) ) / 2 ) / 5; 11 | var points = []; 12 | var i=0; 13 | ctx.save(); 14 | ctx.translate( s/2,s/2 ); 15 | 16 | 17 | var weights = []; 18 | for ( var angle = 0; angle <= total; angle+=ga ){ 19 | 20 | var radius = map( angle, 0, total, minRadius, maxRadius ); 21 | var x = Math.cos( angle ) * radius * .75; 22 | var y = Math.sin( angle ) * radius; 23 | points.push([x,y]); 24 | 25 | g.disc( x,y, 2 * unit ); 26 | ctx.moveTo(x,y); 27 | var sca = .0005 / unit; 28 | var ang = ( PRNG.FBM( x * sca, y * sca ) * Math.PI * 4 ); 29 | 30 | x += Math.cos( ang ) * radius * .25; 31 | y += Math.sin( ang ) * radius * .25; 32 | ctx.lineTo(x,y); 33 | points.push([x,y,0]); 34 | weights.push(0); 35 | 36 | 37 | } 38 | // ctx.stroke(); 39 | 40 | var delaunay = new Delaunator( points ); 41 | var tris = delaunay.triangles; 42 | for( i = 0; i < tris.length; ){ 43 | grow( ctx, points, tris[i++], tris[i++], tris[i++]); 44 | } 45 | var max = weights.reduce( function( a,b ){ 46 | if( isNaN(b) )return a; 47 | return Math.max( a,b ); 48 | },0 ); 49 | 50 | points.forEach(function( p, i ){ 51 | ctx.globalAlpha = 1 - weights[i]/max; 52 | g.disc( p[0],p[1], unit * weights[i] ); 53 | }); 54 | 55 | for( i = 0; i < tris.length; ){ 56 | drawTri( ctx, points, tris[i++], tris[i++], tris[i++]); 57 | } 58 | 59 | function grow( ctx, ps, a, b, c ){ 60 | weights[a] += 1; 61 | weights[b] += 1; 62 | weights[c] += 1; 63 | ps[a][2] += 1; 64 | ps[b][2] += 1; 65 | ps[c][2] += 1; 66 | } 67 | function drawTri( ctx, ps, a, b, c ){ 68 | 69 | ctx.beginPath(); 70 | 71 | ctx.globalAlpha = 1 - Math.sqrt( ( weights[a]+weights[b]+weights[c] ) / max / 3 ); 72 | 73 | 74 | // var a =new Point( ps[a][0], ps[a][1], ps[a][2] ); 75 | // var b =new Point( ps[b][0], ps[b][1], ps[b][2] ); 76 | // var c =new Point( ps[c][0], ps[c][1], ps[c][2] ); 77 | // 78 | // if( a==undefined || b == undefined || c == undefined){ 79 | // return; 80 | // } 81 | // var light = new Point( 0,100, 100 ).normalize(); 82 | // var normal = cross( c.clone().sub( a ), c.clone().sub( b ) ).normalize(); 83 | // ctx.globalAlpha = map( light.dot( normal ), -1, 1, 0.75, .0 ); 84 | 85 | 86 | ctx.moveTo(ps[a][0], ps[a][1]); 87 | ctx.lineTo(ps[b][0], ps[b][1]); 88 | ctx.lineTo(ps[c][0], ps[c][1]); 89 | ctx.lineTo(ps[a][0], ps[a][1]); 90 | ctx.stroke() 91 | 92 | 93 | } 94 | ctx.restore(); 95 | 96 | return PORTRAIT; 97 | 98 | } 99 | -------------------------------------------------------------------------------- /badges/generators/30.js: -------------------------------------------------------------------------------- 1 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 2 | 3 | PRNG.setSeed(seed); 4 | 5 | 6 | ctx.save(); 7 | ctx.shadowColor = "#000"; 8 | // ctx.translate(s/2,s/2); 9 | 10 | var points= []; 11 | var tot = 20; 12 | var ang = -PI / 2; 13 | var step = PI * 2 / tot; 14 | var r = s * Math.sqrt( 2 ) * .5; 15 | 16 | var cell = s/1000; 17 | for( var k = 25 * cell; k < 100 * cell; k += cell * 25 ){ 18 | 19 | var tot = s / k; 20 | ctx.shadowBlur = k; 21 | 22 | var ox = PRNG.random() * s; 23 | var oy = PRNG.random() * s; 24 | var sca = unit * .1; 25 | for( var j = 0; j <= tot; j++ ){ 26 | for( var i = 0; i <= tot; i++ ){ 27 | 28 | var a = new Point( k * i, k * j ); 29 | 30 | var size = Math.abs( PRNG.FBM( ( ox + a.x ) * sca, ( oy + a.y ) * sca, 2 ) ); 31 | 32 | ctx.globalAlpha = size * k/100*unit; 33 | // ctx.fillRect( a.x,a.y, k, k ); 34 | 35 | ctx.beginPath(); 36 | 37 | if( PRNG.random() > .38 )continue; 38 | var ran = PRNG.random(); 39 | if( ran < .25 ){ 40 | ctx.moveTo( a.x,a.y); 41 | ctx.lineTo( a.x + k ,a.y); 42 | ctx.lineTo( a.x ,a.y+k); 43 | }else if( ran < .5 ){ 44 | ctx.moveTo( a.x + k,a.y); 45 | ctx.lineTo( a.x +k,a.y+k); 46 | ctx.lineTo( a.x ,a.y+k); 47 | }else if( ran < .75 ){ 48 | ctx.moveTo( a.x + k,a.y+k); 49 | ctx.lineTo( a.x ,a.y+k); 50 | ctx.lineTo( a.x ,a.y ); 51 | }else{ 52 | ctx.moveTo( a.x,a.y); 53 | ctx.lineTo( a.x +k,a.y); 54 | ctx.lineTo( a.x +k,a.y+k); 55 | } 56 | 57 | ctx.fill(); 58 | 59 | } 60 | 61 | } 62 | } 63 | ctx.restore(); 64 | 65 | return LANDSCAPE; 66 | } -------------------------------------------------------------------------------- /badges/generators/31.js: -------------------------------------------------------------------------------- 1 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 2 | 3 | PRNG.setSeed(seed); 4 | 5 | 6 | ctx.save(); 7 | ctx.shadowColor = "#000"; 8 | // ctx.translate(s/2,s/2); 9 | 10 | var points= []; 11 | var tot = 20; 12 | var ang = -PI / 2; 13 | var step = PI * 2 / tot; 14 | var r = s * Math.sqrt( 2 ) * .5; 15 | 16 | ctx.save(); 17 | ctx.translate(s/2,s/2); 18 | var golden_angle = Math.PI * 2 / ( ( 1 + Math.sqrt(5) ) / 2 );var count = 100; 19 | for( var i = 0; i < count; i++ ) { 20 | var theta = i * golden_angle; 21 | var radius = Math.sqrt( i / count ) * s / 3; 22 | var p = new Point( Math.cos(theta) * radius,Math.sin(theta) * radius, 1 + i/count ); 23 | points.push( p ); 24 | g.disc( p, p.z * 2 * unit ); 25 | // g.circle(Math.cos(theta) * radius,Math.sin(theta) * radius, 1 ); 26 | } 27 | 28 | var voronoi = new Voronoi(); 29 | var bbox = {xl: -s, xr: s, yt: -s, yb: s}; 30 | 31 | var diagram = voronoi.compute(points, bbox); 32 | diagram.edges.forEach(function(e){ 33 | ctx.globalAlpha = .25; 34 | ctx.beginPath(); 35 | ctx.moveTo(e.va.x, e.va.y); 36 | ctx.lineTo(e.vb.x, e.vb.y); 37 | ctx.stroke(); 38 | }); 39 | 40 | ctx.restore(); 41 | 42 | return LANDSCAPE; 43 | }; -------------------------------------------------------------------------------- /badges/generators/32.js: -------------------------------------------------------------------------------- 1 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 2 | 3 | PRNG.setSeed(seed); 4 | 5 | 6 | ctx.save(); 7 | var alt = 0; 8 | 9 | var vs = s/40; 10 | var es = s/10; 11 | for( var k = vs; k <= es; k *= 2 ){ 12 | 13 | var tot = s / k; 14 | 15 | ctx.lineCap = "round"; 16 | 17 | ctx.lineWidth = unit * 10 * ( 1 - k / es ); 18 | ctx.globalAlpha = 1;// - ( 1 - k / es ) ;//1 - ( .15 * ( k / es ) ); 19 | 20 | var v = ~~( ( k / es ) * 0xFF ); 21 | var c = 'rgb('+v+','+v+','+v+')'; 22 | ctx.strokeStyle = c; 23 | 24 | // ctx.shadowColor = "#000"; 25 | // ctx.shadowBlur = 5 * unit; 26 | 27 | for( var i = 0; i <= tot; i++ ){ 28 | for( var j = 0; j <= tot; j++ ){ 29 | 30 | var a = new Point( k * i, k * j ); 31 | 32 | ctx.beginPath(); 33 | drawTile( a,k ); 34 | 35 | } 36 | 37 | } 38 | 39 | 40 | } 41 | function drawTile( a, k ){ 42 | 43 | var v = 0; 44 | var c = 1 + PRNG.random() >.5 ? 2 : 0; 45 | while( c-- ){ 46 | 47 | var ran = PRNG.random(); 48 | if( ran < .25 ){ 49 | v |= 1; 50 | }else if( ran < .50 ){ 51 | v |= 1 << 1; 52 | }else if( ran < .75 ){ 53 | v |= 1 << 2; 54 | }else{ 55 | v |= 1 << 3; 56 | } 57 | 58 | } 59 | 60 | if( v >> 0 & 1 ) g.arc(a.x, a.y, k / 2, 0, PI / 2, false); 61 | 62 | if( v >> 1 & 1 ) g.arc(a.x + k, a.y + k, k / 2, -PI / 2, -PI, false); 63 | 64 | if( v >> 2 & 1 ) g.arc( a.x+k, a.y, k/2, PI / 2, PI, false ); 65 | 66 | if( v >> 3 & 1 ) g.arc( a.x,a.y+k, k/2, -PI / 2, 0, false ); 67 | 68 | }; 69 | ctx.restore(); 70 | return LANDSCAPE; 71 | 72 | } -------------------------------------------------------------------------------- /badges/generators/33.js: -------------------------------------------------------------------------------- 1 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 2 | 3 | PRNG.setSeed(seed); 4 | 5 | 6 | 7 | var turns = 10; 8 | var total = Math.PI * 2 * turns; 9 | var minRadius = s/5; 10 | var maxRadius = minRadius + s/5; 11 | var ga = ( ( 1 + Math.sqrt(5) ) / 2 ) / 5; 12 | 13 | var i=0; 14 | ctx.save(); 15 | ctx.translate( s/2,s/2 ); 16 | var points = []; 17 | var sca = .001 / unit; 18 | for ( var angle = 0; angle <= total; angle+=ga ){ 19 | 20 | var radius = map( angle, 0, total, minRadius, maxRadius ); 21 | var x = Math.cos( angle ) * radius; 22 | var y = Math.sin( angle ) * radius * .62; 23 | 24 | var ang = ( PRNG.FBM_legacy( x * sca, y * sca, 2 ) * Math.PI * 4 ); 25 | 26 | x += Math.cos( ang ) * radius * .25; 27 | y += Math.sin( ang ) * radius * .25; 28 | 29 | points.push( [x, y] ); 30 | 31 | } 32 | ctx.fillStyle = "#000"; 33 | 34 | var convex = hull( points, 20 * unit ); 35 | g.polygon(convex, true); 36 | 37 | 38 | ctx.globalAlpha = .5; 39 | convex = hull(points, 50 * unit ); 40 | ctx.lineWidth = 2 * unit; 41 | g.polyline(convex, true); 42 | 43 | convex = hull(points, 70 * unit); 44 | ctx.lineWidth = unit; 45 | g.polyline(convex, true); 46 | 47 | ctx.globalAlpha = 1; 48 | points.forEach(function (p){ 49 | 50 | var x = p[0]; 51 | var y = p[1]; 52 | 53 | ctx.fillStyle = "#000"; 54 | g.disc( x,y, 4 * unit ); 55 | ctx.fillStyle = "#FFF"; 56 | g.disc( x,y, 2 * unit ); 57 | 58 | }); 59 | 60 | ctx.restore(); 61 | return PORTRAIT; 62 | 63 | 64 | }; -------------------------------------------------------------------------------- /badges/generators/34.js: -------------------------------------------------------------------------------- 1 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 2 | 3 | PRNG.setSeed(seed); 4 | 5 | var turns = 10; 6 | var total = Math.PI * 2 * turns; 7 | var minRadius = s/5; 8 | var maxRadius = minRadius + s/5; 9 | var ga = ( ( 1 + Math.sqrt(5) ) / 2 ) / 5; 10 | 11 | var i = 0; 12 | var points = []; 13 | ctx.save(); 14 | ctx.translate( s/2,s/2 ); 15 | for ( var angle = 0; angle <= total; angle+=ga ){ 16 | 17 | var radius = map( angle, 0, total, minRadius, maxRadius ); 18 | var x = Math.cos( angle ) * radius; 19 | var y = Math.sin( angle ) * radius * .62; 20 | 21 | var ang = ( PRNG.random() * Math.PI * 2 ); 22 | 23 | x = Math.cos( ang ) * radius; 24 | y = Math.sin( ang ) * radius; 25 | 26 | points.push( [x, y] ); 27 | 28 | } 29 | ctx.fillStyle = "#000"; 30 | 31 | ctx.strokeStyle = "#FFF"; 32 | ctx.lineWidth = 2 * unit; 33 | ctx.lineJoin = "round"; 34 | 35 | 36 | var convex = hull(points, 80 * unit ); 37 | g.polygon(convex, true); 38 | 39 | var delaunay = new Delaunator( convex ); 40 | var tris = delaunay.triangles; 41 | for( i = 0; i < tris.length; ){ 42 | drawTri( ctx, convex, tris[i++], tris[i++], tris[i++]); 43 | } 44 | 45 | convex = hull(points, 150 * unit ); 46 | ctx.strokeStyle = "#000"; 47 | g.polyline(convex, true); 48 | 49 | function drawTri( ctx, ps, a, b, c ){ 50 | 51 | ctx.beginPath(); 52 | ctx.moveTo(ps[a][0], ps[a][1]); 53 | ctx.lineTo(ps[b][0], ps[b][1]); 54 | ctx.lineTo(ps[c][0], ps[c][1]); 55 | ctx.lineTo(ps[a][0], ps[a][1]); 56 | ctx.stroke() 57 | 58 | } 59 | 60 | ctx.restore(); 61 | return PORTRAIT; 62 | 63 | }; -------------------------------------------------------------------------------- /badges/generators/35.js: -------------------------------------------------------------------------------- 1 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 2 | 3 | PRNG.setSeed(seed); 4 | 5 | var turns = 10; 6 | var total = Math.PI * 2 * turns; 7 | var minRadius = s/5; 8 | var maxRadius = minRadius + s/5; 9 | var ga = ( ( 1 + Math.sqrt(5) ) / 2 ) / 5; 10 | 11 | var i = 0; 12 | var points = []; 13 | var sources = []; 14 | ctx.save(); 15 | ctx.translate( s/2,s/2 ); 16 | for ( var angle = 0; angle <= total / 3; angle+=ga ){ 17 | 18 | var radius = map( angle, 0, total, minRadius, maxRadius ); 19 | var x = Math.cos( angle ) * radius; 20 | var y = Math.sin( angle ) * radius * .62; 21 | 22 | var ang = ( PRNG.random() * Math.PI * 2 ); 23 | x += Math.cos( ang ) * radius; 24 | y += Math.sin( ang ) * radius * .62; 25 | points.push( [x, y] ); 26 | 27 | radius = s * Math.sqrt( 2 ); 28 | // angle = PRNG.random() * PI2 29 | x = Math.cos( angle ) * radius; 30 | y = Math.sin( angle ) * radius; 31 | var p = new Point( x,y ); 32 | sources.push( p ); 33 | 34 | } 35 | 36 | ctx.fillStyle = "#000"; 37 | 38 | ctx.strokeStyle = "#FFF"; 39 | ctx.lineWidth = 2 * unit; 40 | ctx.lineJoin = "round"; 41 | 42 | 43 | var convex = hull(points, 40 ); 44 | // g.polyline(convex, true); 45 | 46 | convex = []; 47 | var step = PI / 15; 48 | for ( angle = PI / 2; angle <= PI2 * 2.5; angle+=step){ 49 | 50 | radius = map( angle, 0, PI2 * 2.5, s/100, s / 4 ); 51 | x = Math.cos( angle ) * radius; 52 | y = Math.sin( angle ) * radius; 53 | convex.push( [x,y] ); 54 | } 55 | 56 | var segs = convex.map( function( p, i, a ){ 57 | return [ new Point( a[i][0], a[i][1] ), new Point( a[( i+1) % a.length ][0], a[( i+1) % a.length ][1] ) ]; 58 | }); 59 | 60 | ctx.strokeStyle = "#000"; 61 | 62 | var c = new Point(0,0); 63 | segs.forEach( function (s) { 64 | ctx.globalAlpha = 1; 65 | ctx.lineWidth = 2 * unit; 66 | ctx.globalAlpha = .25; 67 | ctx.lineWidth = .5 * unit; 68 | sources.forEach(function( p ){ 69 | 70 | var bv = geomUtils.bounceVector( p, c, s[0], s[1] ); 71 | if( bv != null ){ 72 | g.line( bv[0], bv[1] ); 73 | } 74 | 75 | }) 76 | 77 | }); 78 | 79 | ctx.fillStyle = "#FFF"; 80 | ctx.strokeStyle = "#000"; 81 | ctx.lineWidth = 10 * unit; 82 | ctx.lineJoin = "round"; 83 | 84 | 85 | ctx.globalAlpha = 1; 86 | function drawTri( ctx, ps, a, b, c ){ 87 | 88 | ctx.beginPath(); 89 | ctx.moveTo(ps[a][0], ps[a][1]); 90 | ctx.lineTo(ps[b][0], ps[b][1]); 91 | ctx.lineTo(ps[c][0], ps[c][1]); 92 | ctx.lineTo(ps[a][0], ps[a][1]); 93 | ctx.stroke() 94 | 95 | } 96 | 97 | ctx.restore(); 98 | return LANDSCAPE; 99 | 100 | }; -------------------------------------------------------------------------------- /badges/generators/36.js: -------------------------------------------------------------------------------- 1 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 2 | 3 | PRNG.setSeed(seed); 4 | 5 | var turns = 10; 6 | var total = Math.PI * 2 * turns; 7 | var minRadius = s/5; 8 | var maxRadius = minRadius + s/5; 9 | var ga = ( ( 1 + Math.sqrt(5) ) / 2 ) / 5; 10 | 11 | var i = 0; 12 | var points = []; 13 | ctx.save(); 14 | ctx.translate( s/2,s/2 ); 15 | for ( var angle = 0; angle <= total; angle+=ga ){ 16 | 17 | var radius = map( angle, 0, total, minRadius, maxRadius ); 18 | var x = Math.cos( angle ) * radius * .62; 19 | var y = Math.sin( angle ) * radius; 20 | 21 | var ang = ( PRNG.random() * Math.PI * 2 ); 22 | x += Math.cos( ang ) * radius * .62; 23 | y += Math.sin( ang ) * radius; 24 | points.push( [x, y] ); 25 | 26 | 27 | } 28 | 29 | ctx.strokeStyle = "#000"; 30 | ctx.lineWidth = 2 * unit; 31 | ctx.lineJoin = "round"; 32 | var convex = hull(points, 40 * unit ); 33 | // g.polyline(convex, true); 34 | 35 | points = convex.map( function( p, i, a ){ 36 | 37 | var sca = 0.001; 38 | var x = a[i][0] * sca; 39 | var y = a[i][1] * sca; 40 | var z0 = PRNG.FBM(x,y,3 ) * 100; 41 | return new Point( a[i][0], a[i][1], z0 ); 42 | 43 | }); 44 | 45 | ctx.fillStyle = "#000"; 46 | ctx.strokeStyle = "#000"; 47 | ctx.lineWidth = 1 * unit; 48 | ctx.lineJoin = "round"; 49 | 50 | 51 | var ecp = []; 52 | convex.forEach(function(p){ ecp.push( p[0], p[1 ] ); } ); 53 | var tris = earcut( ecp ); 54 | 55 | var light = new Point( 0, -100, 100 ).normalize(); 56 | for( i = 0; i < tris.length; ){ 57 | 58 | var a = points[ tris[i++] ]; 59 | var b = points[ tris[i++] ]; 60 | var c = points[ tris[i++] ]; 61 | var normal = cross(c.clone().sub(a), c.clone().sub(b)).normalize(); 62 | ctx.globalAlpha = .25; 63 | drawTri( ctx, a,b,c ); 64 | ctx.stroke() 65 | 66 | ctx.globalAlpha = map(light.dot(normal), -1, 1, 0.75, .0); 67 | ctx.fill(); 68 | } 69 | 70 | function drawTri( ctx, a, b, c ){ 71 | 72 | ctx.beginPath(); 73 | ctx.moveTo(a.x, a.y); 74 | ctx.lineTo(b.x, b.y); 75 | ctx.lineTo(c.x, c.y); 76 | ctx.lineTo(a.x, a.y); 77 | 78 | } 79 | 80 | ctx.restore(); 81 | 82 | return LANDSCAPE; 83 | }; -------------------------------------------------------------------------------- /badges/generators/37.js: -------------------------------------------------------------------------------- 1 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 2 | 3 | PRNG.setSeed(seed); 4 | 5 | var turns = 10; 6 | var total = Math.PI * 2 * turns; 7 | var minRadius = s/8; 8 | var maxRadius = minRadius + s/5; 9 | var ga = ( ( 1 + Math.sqrt(5) ) / 2 ) / 5; 10 | 11 | var i = 0; 12 | var points = []; 13 | ctx.save(); 14 | ctx.translate( s/2,s/2 ); 15 | for ( var angle = 0; angle <= total; angle+=ga ){ 16 | 17 | var radius = map( angle, 0, total, minRadius, maxRadius ); 18 | var x = Math.cos( angle ) * radius; 19 | var y = Math.sin( angle ) * radius * .62; 20 | 21 | var ang = ( PRNG.random() * Math.PI * 4 ); 22 | x += Math.cos( ang ) * radius; 23 | y += Math.sin( ang ) * radius * .62; 24 | points.push( [x, y] ); 25 | 26 | } 27 | 28 | ctx.strokeStyle = "#000"; 29 | ctx.lineWidth = unit; 30 | ctx.lineJoin = "round"; 31 | 32 | var it = 5; 33 | for( i = 10; i < 140; i += it ){ 34 | 35 | ctx.globalAlpha = .1; 36 | var convex = hull(points, i * unit ); 37 | g.polygon(convex, true); 38 | g.polyline(convex, true); 39 | it *= 2; 40 | 41 | } 42 | ctx.globalAlpha = 1; 43 | ctx.stroke(); 44 | 45 | ctx.restore(); 46 | return LANDSCAPE; 47 | 48 | }; -------------------------------------------------------------------------------- /badges/generators/38.js: -------------------------------------------------------------------------------- 1 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 2 | 3 | PRNG.setSeed(seed); 4 | 5 | var turns = 10; 6 | var total = Math.PI * 2 * turns; 7 | var minRadius = s/8; 8 | var maxRadius = minRadius + s/6; 9 | var ga = ( ( 1 + Math.sqrt(5) ) / 2 ) / 5; 10 | 11 | var i = 0; 12 | var points = []; 13 | 14 | ctx.save(); 15 | ctx.translate( s/2,s/2 ); 16 | 17 | for ( i = 0; i < 80; i++ ){ 18 | var angle = ( PRNG.random() * Math.PI * 2 ); 19 | var radius = s/2 * .62; 20 | var x = Math.cos( angle ) * radius; 21 | var y = Math.sin( angle ) * radius; 22 | points.push( new Point( x, y ) ); 23 | } 24 | 25 | for ( i = 0; i < 20; i++ ){ 26 | angle = ( PRNG.random() * Math.PI * 2 ); 27 | radius = s/2.38; 28 | x = Math.cos( angle ) * radius; 29 | y = Math.sin( angle ) * radius; 30 | points.push( new Point( x, y ) ); 31 | } 32 | 33 | ctx.strokeStyle = "#000"; 34 | ctx.lineJoin = "round"; 35 | ctx.lineWidth = unit; 36 | 37 | points.forEach( function( p,i ){ 38 | ctx.globalAlpha = .01; 39 | points.forEach( function( o,j ){ 40 | if( i === j )return ; 41 | g.line( p, o ); 42 | }); 43 | }); 44 | ctx.restore(); 45 | return PORTRAIT; 46 | 47 | }; -------------------------------------------------------------------------------- /badges/generators/39.js: -------------------------------------------------------------------------------- 1 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 2 | 3 | PRNG.setSeed(seed); 4 | 5 | ctx.save(); 6 | 7 | var c = new Point( s/2, s/2 ); 8 | c.radius = s / 6; 9 | 10 | var tot = 250; 11 | var cell = s/tot; 12 | ctx.globalAlpha = .25; 13 | for ( var i = 0; i < tot; i++ ){ 14 | 15 | 16 | var p = new Point( i * cell, 0 ); 17 | var e = new Point( i * cell, s ); 18 | 19 | var count = 100;// + PRNG.random() * 100; 20 | drawBullet( e, p, count, 3, c ); 21 | 22 | 23 | } 24 | 25 | function drawBullet( s, e, count, size, c ){ 26 | 27 | var d = getDistance(s,e); 28 | var tot = count; 29 | var i = 0; 30 | var sca = 0.01 / unit; 31 | ctx.beginPath(); 32 | while( i < tot ){ 33 | 34 | var p = s.pointAt( i/tot, e ); 35 | p.x += PRNG.FBM_legacy( p.x * sca, p.y * sca, 6 ) * 20 * unit; 36 | p.y += PRNG.FBM_legacy( p.x * sca, p.y * sca, 6 ) * 50 * unit; 37 | ctx.lineTo( p.x, p.y ); 38 | i++; 39 | 40 | } 41 | ctx.stroke(); 42 | 43 | } 44 | 45 | 46 | ctx.restore(); 47 | return LANDSCAPE; 48 | 49 | }; -------------------------------------------------------------------------------- /badges/generators/4.js: -------------------------------------------------------------------------------- 1 | 2 | generators[ genId++ ] = function( g, ctx, s, seed, unit ){ 3 | 4 | PRNG.setSeed( seed || 0 ); 5 | 6 | var count = 50; 7 | var cellSize = s/count; 8 | 9 | var turns = 5; 10 | var total = Math.PI * 2 * turns; 11 | var minRadius = s/5; 12 | var maxRadius = minRadius + s/5; 13 | var ga = ( ( 1 + Math.sqrt(5) ) / 2 ) / 5; 14 | var points = []; 15 | var i=0; 16 | ctx.save(); 17 | ctx.translate( s/2,s/2 ); 18 | ctx.beginPath(); 19 | var sca = .0005 / unit; 20 | for ( var angle = 0; angle <= total; angle+=ga ){ 21 | 22 | var radius = map( angle, 0, total, minRadius, maxRadius ); 23 | var x = Math.cos( angle ) * radius * .75; 24 | var y = Math.sin( angle ) * radius; 25 | points.push([x,y]); 26 | 27 | g.disc( x,y, 2 ); 28 | ctx.moveTo(x,y); 29 | var ang = ( PRNG.FBM( x * sca, y * sca ) * Math.PI * 4 ); 30 | 31 | x += Math.cos( ang ) * radius * .25; 32 | y += Math.sin( ang ) * radius * .25; 33 | ctx.lineTo(x,y); 34 | 35 | points.push([x,y]); 36 | 37 | 38 | } 39 | 40 | var delaunay = new Delaunator( points ); 41 | var tris = delaunay.triangles; 42 | for( i = 0; i < tris.length; ){ 43 | 44 | ctx.beginPath(); 45 | ctx.globalAlpha = PRNG.random(); 46 | drawTri( ctx, points, tris[i++], tris[i++], tris[i++]); 47 | ctx.stroke(); 48 | 49 | if( ctx.globalAlpha < .15 ){ 50 | ctx.fillStyle = "#000"; 51 | ctx.fill(); 52 | } 53 | if( ctx.globalAlpha > .75 ){ 54 | ctx.fillStyle = "#FFF"; 55 | ctx.fill(); 56 | } 57 | } 58 | 59 | ctx.restore(); 60 | 61 | function drawTri( ctx, ps, a, b, c ){ 62 | 63 | ctx.moveTo(ps[a][0], ps[a][1]); 64 | ctx.lineTo(ps[b][0], ps[b][1]); 65 | ctx.lineTo(ps[c][0], ps[c][1]); 66 | ctx.lineTo(ps[a][0], ps[a][1]); 67 | 68 | var cx0 = lerp( .25,ps[a][0], ps[b][0]); 69 | var cy0 = lerp( .25,ps[a][1], ps[b][1]); 70 | var cx00 = lerp( .75,ps[a][0], ps[b][0]); 71 | var cy00 = lerp( .75,ps[a][1], ps[b][1]); 72 | 73 | var cx1 = lerp( .25,ps[b][0], ps[c][0]); 74 | var cy1 = lerp( .25,ps[b][1], ps[c][1]); 75 | var cx10 = lerp( .75,ps[b][0], ps[c][0]); 76 | var cy10 = lerp( .75,ps[b][1], ps[c][1]); 77 | 78 | var cx2 = lerp( .25,ps[c][0], ps[a][0]); 79 | var cy2 = lerp( .25,ps[c][1], ps[a][1]); 80 | var cx20 = lerp( .75,ps[c][0], ps[a][0]); 81 | var cy20 = lerp( .75,ps[c][1], ps[a][1]); 82 | 83 | ctx.moveTo( cx00, cy00 ); 84 | ctx.lineTo( cx1, cy1 ); 85 | 86 | ctx.moveTo( cx10, cy10 ); 87 | ctx.lineTo( cx2, cy2 ); 88 | 89 | ctx.moveTo( cx20, cy20 ); 90 | ctx.lineTo( cx0, cy0 ); 91 | 92 | } 93 | return PORTRAIT; 94 | } 95 | -------------------------------------------------------------------------------- /badges/generators/40.js: -------------------------------------------------------------------------------- 1 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 2 | 3 | PRNG.setSeed(seed); 4 | noise.seed(PRNG.random()); 5 | 6 | ctx.save(); 7 | 8 | var c = new Point( s/2, s/2 ); 9 | c.radius = s / 6; 10 | var tot = 1000; 11 | var cell = s/tot; 12 | ctx.globalAlpha = .1; 13 | for ( var i = 0; i < tot; i++ ){ 14 | 15 | 16 | var p = new Point( i * cell, 0 ); 17 | var e = new Point( i * cell, s ); 18 | 19 | var count = 100; 20 | drawBullet( e, p, count, 3, c ); 21 | 22 | } 23 | 24 | function drawBullet( s, e, count, size, c ){ 25 | 26 | var d = getDistance(s,e); 27 | size *= unit; 28 | var tot = count; 29 | var i = 0; 30 | ctx.beginPath(); 31 | var sca = 0.01 / unit; 32 | while( i < tot ){ 33 | 34 | var p = s.pointAt( i/tot, e ); 35 | var p0 = s.pointAt( 0, e ); 36 | var p1 = s.pointAt( 1, e ); 37 | 38 | 39 | var rn = 0; 40 | 41 | rn = PRNG.FBM_legacy( p.x * sca, p.y * sca, 6 ) ;//* 40 * unit; 42 | rn *= PRNG.FBM_legacy( p0.x * sca, p0.y * sca, 6 ) ;//* 20 * unit; 43 | rn += PRNG.FBM_legacy( p1.x * sca, p1.y * sca, 6 ) ;//* 10 * unit; 44 | 45 | rn *= 40 * unit; 46 | p.x += rn; 47 | p.y -= rn; 48 | 49 | 50 | ctx.lineTo( p.x, p.y ); 51 | i++; 52 | 53 | } 54 | ctx.stroke(); 55 | 56 | } 57 | 58 | ctx.restore(); 59 | return LANDSCAPE; 60 | 61 | }; -------------------------------------------------------------------------------- /badges/generators/41.js: -------------------------------------------------------------------------------- 1 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 2 | 3 | PRNG.setSeed(seed); 4 | 5 | ctx.save(); 6 | 7 | var c = new Point( s/2, s/2 ); 8 | c.radius = s / 6; 9 | var tot = 1000; 10 | var cell = s/tot; 11 | ctx.globalAlpha = .2; 12 | for ( var i = 0; i < tot; i++ ){ 13 | 14 | 15 | var p = new Point( i * cell, 0 ); 16 | var e = new Point( i * cell, s ); 17 | 18 | var count = 10; 19 | drawBullet( e, p, count, c ); 20 | 21 | } 22 | 23 | function drawBullet( s, e, count, c ){ 24 | 25 | var tot = count; 26 | var i = 0; 27 | ctx.beginPath(); 28 | ctx.moveTo( s.x, s.y ); 29 | var sca = 0.01 / unit; 30 | while( i < tot ){ 31 | 32 | var p = s.pointAt( i/tot, e ); 33 | var rn = 0; 34 | rn = PRNG.FBM_legacy( p.x * sca, p.y * sca, 5 ); 35 | rn *= 40 * unit ; 36 | p.x += rn; 37 | p.y -= rn; 38 | ctx.lineTo( p.x, p.y ); 39 | i++; 40 | 41 | } 42 | ctx.lineTo( e.x, e.y ); 43 | ctx.stroke(); 44 | 45 | } 46 | ctx.restore(); 47 | return LANDSCAPE; 48 | 49 | }; -------------------------------------------------------------------------------- /badges/generators/42.js: -------------------------------------------------------------------------------- 1 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 2 | 3 | PRNG.setSeed(seed); 4 | 5 | noise.seed(PRNG.random()); 6 | 7 | 8 | 9 | ctx.save(); 10 | 11 | var c = new Point( s/2, s/3 ); 12 | c.radius = s / 6; 13 | var tot = 500; 14 | var cell = s/tot; 15 | ctx.globalAlpha = .2; 16 | for ( var i = 0; i < tot; i++ ){ 17 | 18 | 19 | var p = new Point( i * cell, 0 ); 20 | var e = new Point( i * cell, s ); 21 | 22 | var count = 150; 23 | drawBullet( p, e, count, c ); 24 | 25 | } 26 | 27 | function drawBullet( s, e, count, c ){ 28 | 29 | var tot = count; 30 | var i = 0; 31 | ctx.beginPath(); 32 | ctx.moveTo( s.x, s.y ); 33 | var sca = 0.005 / unit;//TODO reporter l'échelle des noise partout 34 | while( i < tot ){ 35 | 36 | 37 | var p = s.pointAt( i/tot, e ); 38 | 39 | 40 | var dist = getDistance(c, p); 41 | if( dist < c.radius ){ 42 | var dir = c.direction(p).normalize().multiplyScalar(c.radius * .05 ); 43 | s.add( dir ); 44 | } 45 | // sca = ( 1 - dist / c.radius ) * 0.01; 46 | 47 | var rn = noise.FBM( p.x * sca, p.y * sca, 3 ) * ( .15 ); 48 | 49 | rn *= 50 * unit ; 50 | p.x += rn; 51 | p.y -= rn; 52 | ctx.lineTo( p.x, p.y ); 53 | i++; 54 | 55 | } 56 | ctx.lineTo( e.x, e.y ); 57 | ctx.stroke(); 58 | 59 | } 60 | 61 | 62 | ctx.restore(); 63 | return LANDSCAPE; 64 | 65 | }; -------------------------------------------------------------------------------- /badges/generators/43.js: -------------------------------------------------------------------------------- 1 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 2 | 3 | PRNG.setSeed(seed); 4 | 5 | noise.seed(PRNG.random()); 6 | 7 | 8 | ctx.fillStyle = "#000"; 9 | ctx.fillRect( 0,0,s,s ); 10 | ctx.fillStyle = "#FFF"; 11 | ctx.save(); 12 | 13 | var c = new Point( s/2, s/2 ); 14 | c.radius = s / 6; 15 | var tot = 500; 16 | var cell = s/tot; 17 | ctx.globalAlpha = .2; 18 | for ( var i = 0; i < tot; i++ ){ 19 | 20 | 21 | var p = new Point( i * cell, 0 ); 22 | var e = new Point( i * cell, s ); 23 | 24 | var count = 30; 25 | var delta = s/100; 26 | drawBullet( p, e, count, c ); 27 | 28 | } 29 | 30 | function drawBullet( s, e, count, c ){ 31 | 32 | var tot = count; 33 | var i = 0; 34 | // ctx.beginPath(); 35 | // ctx.moveTo( s.x, s.y ); 36 | var sca= 0.005 / unit; 37 | while( i < tot ){ 38 | 39 | 40 | var p = s.pointAt( i/tot, e ); 41 | var dist = getDistance(c, p); 42 | if( dist < c.radius ){ 43 | var dir = c.direction(p).normalize().multiplyScalar( c.radius * .01 ); 44 | s.add( dir ); 45 | } 46 | 47 | 48 | var rn = PRNG.centralDifference( p.x, p.y, sca, 2 ); 49 | sca = 1 - ( dist / c.radius );// * 0.01; 50 | p.y += Math.sin( sca * PI2 ) * delta ;//* unit; 51 | g.disc( p, 1 + unit * Math.abs( sca * 5 ) ) 52 | i++; 53 | 54 | } 55 | } 56 | 57 | 58 | ctx.restore(); 59 | return LANDSCAPE; 60 | 61 | }; -------------------------------------------------------------------------------- /badges/generators/46.js: -------------------------------------------------------------------------------- 1 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 2 | 3 | PRNG.setSeed(seed); 4 | noise.seed(PRNG.random()); 5 | 6 | var iteration = 250; 7 | function update(){ 8 | 9 | ctx.save(); 10 | ctx.translate( s/2, s/2 ); 11 | 12 | points.forEach(function( p,i ){ 13 | p.lx = p.x; 14 | p.ly = p.y; 15 | p.lz = p.z; 16 | }); 17 | 18 | var minZ = Number.POSITIVE_INFINITY; 19 | var maxZ = Number.NEGATIVE_INFINITY; 20 | points.forEach(function( p,i ){ 21 | minZ = Math.min( p.z, minZ); 22 | maxZ = Math.max( p.z, maxZ); 23 | }); 24 | minZ -= .1; 25 | maxZ += .1; 26 | 27 | points.forEach(function( p,i ){ 28 | 29 | 30 | ctx.beginPath(); 31 | 32 | var r = norm( Math.abs( p.z ), minZ, maxZ ); 33 | if( isNaN(r))return; 34 | ctx.globalAlpha = 1 - r; 35 | 36 | var sca = 0.005 / unit; 37 | p.multiplyScalar( 1 + noise.perlin3( p.x * sca, p.y * sca, p.z * sca ) * .25 ); 38 | 39 | ctx.arc( p.x, p.z, ( 1 + r * 15 ) * unit, 0, Math.PI * 2 ); 40 | ctx.fill(); 41 | 42 | } ); 43 | 44 | ctx.restore(); 45 | 46 | } 47 | 48 | var points = distribution.sphereUniform( 10000, s/3 ); 49 | 50 | update(); 51 | return PORTRAIT; 52 | 53 | 54 | }; 55 | -------------------------------------------------------------------------------- /badges/generators/47.js: -------------------------------------------------------------------------------- 1 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 2 | 3 | PRNG.setSeed(seed); 4 | noise.seed(PRNG.random()); 5 | 6 | var iteration = 25; 7 | function update(){ 8 | 9 | ctx.save(); 10 | ctx.translate( s/2, s/2 ); 11 | 12 | points.forEach(function( p,i ){ 13 | p.lx = p.x; 14 | p.ly = p.y; 15 | p.lz = p.z; 16 | }); 17 | 18 | var minZ = Number.POSITIVE_INFINITY; 19 | var maxZ = Number.NEGATIVE_INFINITY; 20 | points.forEach(function( p,i ){ 21 | minZ = Math.min( p.z, minZ); 22 | maxZ = Math.max( p.z, maxZ); 23 | }); 24 | minZ -= .1; 25 | maxZ += .1; 26 | 27 | var tmp = new Point(); 28 | points.forEach(function( p,i ){ 29 | 30 | 31 | var r = Math.sin( norm( p.z, minZ, maxZ ) * PI ); 32 | 33 | ctx.globalAlpha = ( 1 - r ) * .5; 34 | 35 | var sca = 0.005 / unit; 36 | 37 | tmp.copy( p ).multiplyScalar(sca); 38 | 39 | var cn = curlNoise( tmp, .01 / unit ).multiplyScalar(.4); 40 | 41 | p.add( cn ); 42 | 43 | var thi = ( 1 + r * 5 ) * unit; 44 | ctx.lineWidth = thi; 45 | 46 | ctx.beginPath(); 47 | ctx.moveTo(p.lx, p.ly ); 48 | ctx.lineTo(p.x, p.y); 49 | ctx.stroke(); 50 | 51 | } ); 52 | 53 | ctx.restore(); 54 | 55 | if( iteration-->0 ){ 56 | update() 57 | } 58 | 59 | } 60 | 61 | var points = distribution.sphereUniform( 10000, s/3 ); 62 | 63 | update(); 64 | 65 | function curlNoise( p, delta ){ 66 | 67 | var p_x0 = noise.perlin3( p.x-delta, p.y, p.z ); 68 | var p_x1 = noise.perlin3( p.x+delta, p.y, p.z ); 69 | var p_y0 = noise.perlin3( p.x, p.y-delta, p.z ); 70 | var p_y1 = noise.perlin3( p.x, p.y+delta, p.z ); 71 | var p_z0 = noise.perlin3( p.x, p.y, p.z-delta ); 72 | var p_z1 = noise.perlin3( p.x, p.y, p.z+delta ); 73 | 74 | var x = p_y1 - p_y0 - p_z1 + p_z0; 75 | var y = p_z1 - p_z0 - p_x1 + p_x0; 76 | var z = p_x1 - p_x0 - p_y1 + p_y0; 77 | 78 | var divisor = 1.0 / ( 2.0 * delta ); 79 | return new Point( x , y , z ).normalize().multiplyScalar( divisor ); 80 | 81 | } 82 | return LANDSCAPE; 83 | 84 | }; 85 | -------------------------------------------------------------------------------- /badges/generators/48.js: -------------------------------------------------------------------------------- 1 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 2 | 3 | PRNG.setSeed(seed); 4 | noise.seed(PRNG.random()); 5 | 6 | var iteration = 25; 7 | function update(){ 8 | 9 | ctx.save(); 10 | ctx.translate( s/2, s/2 ); 11 | 12 | points.forEach(function( p,i ){ 13 | p.lx = p.x; 14 | p.ly = p.y; 15 | p.lz = p.z; 16 | }); 17 | 18 | var minZ = Number.POSITIVE_INFINITY; 19 | var maxZ = Number.NEGATIVE_INFINITY; 20 | points.forEach(function( p,i ){ 21 | minZ = Math.min( p.z, minZ); 22 | maxZ = Math.max( p.z, maxZ); 23 | }); 24 | minZ -= .1; 25 | maxZ += .1; 26 | 27 | var tmp = new Point(); 28 | points.forEach(function( p,i ){ 29 | 30 | 31 | var r = Math.sin( norm( p.z, minZ, maxZ ) * PI ); 32 | 33 | ctx.globalAlpha = ( 1 - r ) * .5; 34 | 35 | var sca = 0.005 / unit; 36 | 37 | var n = normals[i]; 38 | p.add( n ); 39 | 40 | tmp.copy( n ).multiplyScalar(sca).add( p ); 41 | 42 | var cn = curlNoise( tmp, .01 / unit ).multiplyScalar(.04); 43 | n.add( cn ); 44 | 45 | 46 | var thi = ( 1 + r * 5 ) * unit; 47 | ctx.lineWidth = thi; 48 | 49 | 50 | ctx.beginPath(); 51 | ctx.moveTo( p.lx, p.ly ); 52 | ctx.lineTo( p.x + n.x , p.y + n.y ); 53 | 54 | ctx.stroke(); 55 | 56 | } ); 57 | 58 | ctx.restore(); 59 | 60 | if( iteration-->0 ){ 61 | update() 62 | } 63 | 64 | } 65 | 66 | var points = distribution.sphereUniform( 1000, s/3 ); 67 | var normals = []; 68 | points.forEach(function( p ){ 69 | normals.push( p.clone().normalize() );//.multiplyScalar(20*unit) );//.add( p ) ); 70 | }); 71 | 72 | update(); 73 | 74 | function curlNoise( p, delta ){ 75 | 76 | var p_x0 = noise.perlin3( p.x-delta, p.y, p.z ); 77 | var p_x1 = noise.perlin3( p.x+delta, p.y, p.z ); 78 | var p_y0 = noise.perlin3( p.x, p.y-delta, p.z ); 79 | var p_y1 = noise.perlin3( p.x, p.y+delta, p.z ); 80 | var p_z0 = noise.perlin3( p.x, p.y, p.z-delta ); 81 | var p_z1 = noise.perlin3( p.x, p.y, p.z+delta ); 82 | 83 | var x = p_y1 - p_y0 - p_z1 + p_z0; 84 | var y = p_z1 - p_z0 - p_x1 + p_x0; 85 | var z = p_x1 - p_x0 - p_y1 + p_y0; 86 | 87 | var divisor = 1.0 / ( 2.0 * delta ); 88 | return new Point( x , y , z ).normalize().multiplyScalar( divisor ); 89 | 90 | } 91 | return LANDSCAPE; 92 | 93 | }; 94 | -------------------------------------------------------------------------------- /badges/generators/49.js: -------------------------------------------------------------------------------- 1 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 2 | 3 | PRNG.setSeed(seed); 4 | noise.seed(PRNG.random()); 5 | 6 | var iteration = 50; 7 | var G= new Point(0,.1,0) 8 | function update(){ 9 | 10 | ctx.save(); 11 | ctx.translate( s/2, s/2 ); 12 | 13 | points.forEach(function( p,i ){ 14 | p.lx = p.x; 15 | p.ly = p.y; 16 | p.lz = p.z; 17 | }); 18 | 19 | var minZ = Number.POSITIVE_INFINITY; 20 | var maxZ = Number.NEGATIVE_INFINITY; 21 | points.forEach(function( p,i ){ 22 | minZ = Math.min( p.z, minZ); 23 | maxZ = Math.max( p.z, maxZ); 24 | }); 25 | minZ -= .1; 26 | maxZ += .1; 27 | 28 | G.normalize(); 29 | ctx.fillStyle = "#FFF" 30 | var tmp = new Point(); 31 | points.forEach(function( p,i ){ 32 | 33 | 34 | var r = Math.sin( norm( p.z, minZ, maxZ ) * PI ); 35 | 36 | // ctx.globalAlpha = ( 1 - r ) * .5; 37 | 38 | var sca = 0.005 / unit; 39 | 40 | var n = normals[i]; 41 | p.add( n ); 42 | n.add( G ); 43 | 44 | tmp.copy( n ).multiplyScalar(sca).add( p ); 45 | 46 | var cn = curlNoise( tmp, 0.1 / unit ).multiplyScalar(0.1); 47 | 48 | var thi = getDistance(n, p) * .14;//* ( 1 + r * 5 ) * unit; 49 | ctx.save(); 50 | ctx.rotate( getAngle(n, cn) ); 51 | n.add( cn ); 52 | G.add(cn); 53 | 54 | ctx.beginPath(); 55 | ctx.rect( p.x + n.x , p.y + n.y, thi, .16*thi ); 56 | 57 | ctx.fill(); 58 | ctx.stroke(); 59 | ctx.restore(); 60 | 61 | } ); 62 | 63 | ctx.restore(); 64 | 65 | if( iteration-->0 ){ 66 | update() 67 | } 68 | 69 | } 70 | 71 | var points = distribution.sphereUniform( 100, s/6 ); 72 | var normals = []; 73 | points.forEach(function( p ){ 74 | normals.push( p.clone().normalize() );//.multiplyScalar(20*unit) );//.add( p ) ); 75 | // p.y -= s / 3; 76 | }); 77 | 78 | update(); 79 | 80 | function curlNoise( p, delta ){ 81 | 82 | var p_x0 = noise.perlin3( p.x-delta, p.y, p.z ); 83 | var p_x1 = noise.perlin3( p.x+delta, p.y, p.z ); 84 | var p_y0 = noise.perlin3( p.x, p.y-delta, p.z ); 85 | var p_y1 = noise.perlin3( p.x, p.y+delta, p.z ); 86 | var p_z0 = noise.perlin3( p.x, p.y, p.z-delta ); 87 | var p_z1 = noise.perlin3( p.x, p.y, p.z+delta ); 88 | 89 | var x = p_y1 - p_y0 - p_z1 + p_z0; 90 | var y = p_z1 - p_z0 - p_x1 + p_x0; 91 | var z = p_x1 - p_x0 - p_y1 + p_y0; 92 | 93 | var divisor = 1.0 / ( 2.0 * delta ); 94 | return new Point( x , y , z ).normalize().multiplyScalar( divisor ); 95 | 96 | } 97 | return LANDSCAPE; 98 | 99 | }; 100 | -------------------------------------------------------------------------------- /badges/generators/5.js: -------------------------------------------------------------------------------- 1 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 2 | 3 | PRNG.setSeed(seed || 0); 4 | 5 | g.ctx.globalAlpha = 1; 6 | var count = 50; 7 | 8 | var turns = 5; 9 | var total = Math.PI * 2 * turns; 10 | var minRadius = s / 5; 11 | var maxRadius = minRadius + s / 5; 12 | var ga = ( ( 1 + Math.sqrt(5) ) / 2 ) / 5; 13 | var points = []; 14 | var i = 0; 15 | ctx.save(); 16 | ctx.translate(s / 2, s / 2); 17 | ctx.beginPath(); 18 | var sca = .0005 / unit; 19 | for (var angle = 0; angle <= total; angle += ga) { 20 | 21 | var radius = map(angle, 0, total, minRadius, maxRadius); 22 | var x = Math.cos(angle) * radius * .75; 23 | var y = Math.sin(angle) * radius; 24 | points.push([x, y]); 25 | 26 | ctx.moveTo(x, y); 27 | var ang = ( PRNG.FBM(x * sca, y * sca) * Math.PI * 4 ) + PRNG.random(); 28 | 29 | x += Math.cos(ang) * radius * .25; 30 | y += Math.sin(ang) * radius * .25; 31 | ctx.lineTo(x, y); 32 | points.push([x, y]); 33 | } 34 | 35 | var delaunay = new Delaunator(points); 36 | var tris = delaunay.triangles; 37 | ctx.beginPath(); 38 | for (i = 0; i < tris.length;) { 39 | 40 | drawTri(ctx, points, tris[i++], tris[i++], tris[i++]); 41 | 42 | } 43 | ctx.stroke(); 44 | ctx.restore(); 45 | 46 | function drawTri(ctx, ps, a, b, c) { 47 | 48 | if (PRNG.random() > .35) return false; 49 | 50 | ctx.moveTo(ps[a][0], ps[a][1]); 51 | ctx.lineTo(ps[b][0], ps[b][1]); 52 | ctx.lineTo(ps[c][0], ps[c][1]); 53 | ctx.lineTo(ps[a][0], ps[a][1]); 54 | 55 | // if( PRNG.random() > .5 )return; 56 | 57 | var cx0 = lerp(.25, ps[a][0], ps[b][0]); 58 | var cy0 = lerp(.25, ps[a][1], ps[b][1]); 59 | var cx00 = lerp(.75, ps[a][0], ps[b][0]); 60 | var cy00 = lerp(.75, ps[a][1], ps[b][1]); 61 | 62 | var cx1 = lerp(.25, ps[b][0], ps[c][0]); 63 | var cy1 = lerp(.25, ps[b][1], ps[c][1]); 64 | var cx10 = lerp(.75, ps[b][0], ps[c][0]); 65 | var cy10 = lerp(.75, ps[b][1], ps[c][1]); 66 | 67 | var cx2 = lerp(.25, ps[c][0], ps[a][0]); 68 | var cy2 = lerp(.25, ps[c][1], ps[a][1]); 69 | var cx20 = lerp(.75, ps[c][0], ps[a][0]); 70 | var cy20 = lerp(.75, ps[c][1], ps[a][1]); 71 | 72 | ctx.moveTo(cx00, cy00); 73 | ctx.lineTo(cx1, cy1); 74 | 75 | ctx.moveTo(cx10, cy10); 76 | ctx.lineTo(cx2, cy2); 77 | 78 | ctx.moveTo(cx20, cy20); 79 | ctx.lineTo(cx0, cy0); 80 | 81 | } 82 | return PORTRAIT; 83 | } 84 | -------------------------------------------------------------------------------- /badges/generators/50.js: -------------------------------------------------------------------------------- 1 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 2 | 3 | PRNG.setSeed(seed); 4 | noise.seed(PRNG.random()); 5 | 6 | ctx.save(); 7 | ctx.translate( s/2, s/2 ); 8 | 9 | 10 | 11 | function drawStrand( count, minZ, maxZ){ 12 | var tmp = new Point(); 13 | var sca = 0.005 / unit; 14 | 15 | for( var i = 0; i < points.length; i++ ){ 16 | 17 | var p = points[i]; 18 | var n = normals[i]; 19 | 20 | for( var k = 0; k < count ; k++ ){ 21 | 22 | ctx.beginPath(); 23 | ctx.globalAlpha = .5; 24 | 25 | ctx.moveTo( p.x, p.y ); 26 | 27 | p.add( n ); 28 | 29 | tmp.copy( p ); 30 | 31 | var cn = curlNoise( tmp.multiplyScalar(sca), 0.05 / unit ).multiplyScalar( sca );//.01 + i/points.length); 32 | n.add( cn ); 33 | n.normalize(); 34 | 35 | ctx.lineTo( p.x , p.y ); 36 | 37 | var t = ( Math.sin( PI * k / count ) ); 38 | // if( t < 0 )continue; 39 | ctx.lineWidth = unit * t * 16; //TODO caler l'échelle 40 | ctx.stroke(); 41 | 42 | } 43 | 44 | } 45 | 46 | } 47 | 48 | var points = distribution.sphereUniform( 100, s/8 ); 49 | var normals = []; 50 | points.forEach(function( p ){ 51 | normals.push( p.clone().normalize() ); 52 | }); 53 | 54 | drawStrand( 5000 ); 55 | 56 | function curlNoise( p, delta ){ 57 | 58 | var p_x0 = noise.perlin3( p.x-delta, p.y, p.z ); 59 | var p_x1 = noise.perlin3( p.x+delta, p.y, p.z ); 60 | var p_y0 = noise.perlin3( p.x, p.y-delta, p.z ); 61 | var p_y1 = noise.perlin3( p.x, p.y+delta, p.z ); 62 | var p_z0 = noise.perlin3( p.x, p.y, p.z-delta ); 63 | var p_z1 = noise.perlin3( p.x, p.y, p.z+delta ); 64 | 65 | var x = p_y1 - p_y0 - p_z1 + p_z0; 66 | var y = p_z1 - p_z0 - p_x1 + p_x0; 67 | var z = p_x1 - p_x0 - p_y1 + p_y0; 68 | 69 | var divisor = 1.0 / ( 2.0 * delta ); 70 | return new Point( x , y , z ).normalize().multiplyScalar( divisor ); 71 | 72 | } 73 | 74 | ctx.restore(); 75 | 76 | return LANDSCAPE; 77 | }; 78 | -------------------------------------------------------------------------------- /badges/generators/51.js: -------------------------------------------------------------------------------- 1 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 2 | 3 | PRNG.setSeed(seed); 4 | noise.seed(PRNG.random()); 5 | 6 | ctx.save(); 7 | ctx.translate( s/2, s/2 ); 8 | 9 | function subdivide( count, p0, p1, p2 ) { 10 | 11 | if( count === 0 ){ 12 | 13 | ctx.beginPath(); 14 | ctx.moveTo( p0.x, p0.y ); 15 | ctx.lineTo( p1.x, p1.y ); 16 | ctx.lineTo( p2.x, p2.y ); 17 | ctx.lineTo( p0.x, p0.y ); 18 | ctx.stroke(); 19 | 20 | return; 21 | } 22 | 23 | var m0 = p0.pointAt( .5, p1 ); 24 | var m1 = p1.pointAt( .5, p2 ); 25 | var m2 = p2.pointAt( .5, p0 ); 26 | 27 | m0.add( curlNoise( m0, ( PRNG.random() * 0.1 ) / unit ) ); 28 | m1.add( curlNoise( m1, ( PRNG.random() * 0.1 ) / unit ) ); 29 | m2.add( curlNoise( m2, ( PRNG.random() * 0.1 ) / unit ) ); 30 | 31 | count--; 32 | subdivide(count, p0, m0, p1 ); 33 | subdivide(count, p1, m1, p2 ); 34 | subdivide(count, p2, m2, p0 ); 35 | subdivide(count, m0, m1, m2 ); 36 | 37 | } 38 | 39 | ctx.globalAlpha = .1; 40 | var a = new Point( 0, -s); 41 | var b = new Point( s, s); 42 | var c = new Point( -s, s); 43 | subdivide(8, a,b,c ); 44 | 45 | function curlNoise( p, delta ){ 46 | 47 | var p_x0 = noise.perlin3( p.x-delta, p.y, p.z ); 48 | var p_x1 = noise.perlin3( p.x+delta, p.y, p.z ); 49 | var p_y0 = noise.perlin3( p.x, p.y-delta, p.z ); 50 | var p_y1 = noise.perlin3( p.x, p.y+delta, p.z ); 51 | var p_z0 = noise.perlin3( p.x, p.y, p.z-delta ); 52 | var p_z1 = noise.perlin3( p.x, p.y, p.z+delta ); 53 | 54 | var x = p_y1 - p_y0 - p_z1 + p_z0; 55 | var y = p_z1 - p_z0 - p_x1 + p_x0; 56 | var z = p_x1 - p_x0 - p_y1 + p_y0; 57 | 58 | var divisor = 1.0 / ( 2.0 * delta ); 59 | return new Point( x , y , z ).normalize().multiplyScalar( divisor ); 60 | 61 | } 62 | 63 | ctx.restore(); 64 | return LANDSCAPE; 65 | 66 | }; 67 | -------------------------------------------------------------------------------- /badges/generators/52.js: -------------------------------------------------------------------------------- 1 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 2 | 3 | PRNG.setSeed(seed); 4 | noise.seed(PRNG.random()); 5 | 6 | ctx.save(); 7 | ctx.translate( s/2, s/2 ); 8 | ctx.rotate( PI / 4 ); 9 | 10 | var tot = 4 11 | function subdivide( count, p0, p1, p2 ) { 12 | 13 | var c = p0.clone().add(p1).add( p2).multiplyScalar(1/3); 14 | if( count === 0 ){ 15 | 16 | 17 | ctx.globalAlpha = .5 * ( 1 - c.length() / s );// / ( s * s );//PRNG.random() * .25; 18 | // ctx.lineWidth = unit * 2 * ( 1 - c.length() / s );// / ( s * s );//PRNG.random() * .25; 19 | 20 | ctx.beginPath(); 21 | ctx.moveTo( p0.x, p0.y ); 22 | ctx.lineTo( p1.x, p1.y ); 23 | ctx.lineTo( p2.x, p2.y ); 24 | ctx.lineTo( p0.x, p0.y ); 25 | ctx.fill(); 26 | 27 | // g.disc( c, unit * Math.sqrt( Math.sqrt( areaABC(p0, p1, p2 ))) ); 28 | g.line( c, p0 ); 29 | g.line( c, p1 ); 30 | g.line( c, p2 ); 31 | 32 | 33 | return; 34 | } 35 | else 36 | { 37 | 38 | count--; 39 | 40 | var m0 = p0.pointAt( .5, p1 ); 41 | var m1 = p1.pointAt( .5, p2 ); 42 | var m2 = p2.pointAt( .5, p0 ); 43 | 44 | m0.add( curlNoise( m0, 0.1 / unit ) ); 45 | // m1.add( curlNoise( m1, 0.01 ) ); 46 | // m2.add( curlNoise( m2, 0.01 ) ); 47 | 48 | if( PRNG.random()>.15 ) subdivide(count, p0, m0, c ); 49 | if( PRNG.random()>.15 ) subdivide(count, p1, m0, c ); 50 | if( PRNG.random()>.15 ) subdivide(count, p1, m1, c ); 51 | if( PRNG.random()>.15 ) subdivide(count, p2, m1, c ); 52 | if( PRNG.random()>.15 ) subdivide(count, p0, m2, c ); 53 | // subdivide(count, p1, m2, p2 ); 54 | // subdivide(count, p2, m0, p0 ); 55 | subdivide(count, m0, m1, m2 ); 56 | } 57 | 58 | } 59 | 60 | var a = new Point( -s * .5, -s * .5 ).multiplyScalar(.8); 61 | var b = new Point( s * .5, -s * .5 ).multiplyScalar(.8); 62 | var c = new Point( s * .5, s * .5 ).multiplyScalar(.8); 63 | var d = new Point( -s * .5, s * .5 ).multiplyScalar(.8); 64 | subdivide( tot, a,b,c ); 65 | subdivide( tot, a,c,d ); 66 | 67 | 68 | 69 | function curlNoise( p, delta ){ 70 | 71 | var p_x0 = noise.perlin3( p.x-delta, p.y, p.z ); 72 | var p_x1 = noise.perlin3( p.x+delta, p.y, p.z ); 73 | var p_y0 = noise.perlin3( p.x, p.y-delta, p.z ); 74 | var p_y1 = noise.perlin3( p.x, p.y+delta, p.z ); 75 | var p_z0 = noise.perlin3( p.x, p.y, p.z-delta ); 76 | var p_z1 = noise.perlin3( p.x, p.y, p.z+delta ); 77 | 78 | var x = p_y1 - p_y0 - p_z1 + p_z0; 79 | var y = p_z1 - p_z0 - p_x1 + p_x0; 80 | var z = p_x1 - p_x0 - p_y1 + p_y0; 81 | 82 | var divisor = 1.0 / ( 2.0 * delta ); 83 | return new Point( x , y , z ).normalize().multiplyScalar( divisor ); 84 | 85 | } 86 | 87 | ctx.restore(); 88 | return LANDSCAPE; 89 | 90 | }; 91 | -------------------------------------------------------------------------------- /badges/generators/53.js: -------------------------------------------------------------------------------- 1 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 2 | 3 | PRNG.setSeed(seed); 4 | noise.seed(PRNG.random()); 5 | 6 | ctx.save(); 7 | ctx.translate( s/2, s/2 ); 8 | ctx.rotate( PI / 4 ); 9 | 10 | var tot = 5 11 | function subdivide( count, p0, p1, p2 ) { 12 | 13 | p0.normalize(s/2.5);//Math.sqrt(2)); 14 | p1.normalize(s/2.5);//Math.sqrt(2)); 15 | p2.normalize(s/2.5);//Math.sqrt(2)); 16 | 17 | var c = p0.clone().add(p1).add( p2).multiplyScalar(1/3); 18 | if( count === 0 ){ 19 | 20 | ctx.globalAlpha = .75 * noise.perlin2(p0.x, p0.y);// ( 1 - c.length() / s );// / ( s * s );//PRNG.random() * .25; 21 | // ctx.lineWidth = unit * 2 * ( 1 - c.length() / s );// / ( s * s );//PRNG.random() * .25; 22 | 23 | ctx.beginPath(); 24 | ctx.moveTo( p0.x, p0.y ); 25 | ctx.lineTo( p1.x, p1.y ); 26 | ctx.lineTo( p2.x, p2.y ); 27 | ctx.lineTo( p0.x, p0.y ); 28 | ctx.fill(); 29 | 30 | // g.disc( c, unit * Math.sqrt( Math.sqrt( areaABC(p0, p1, p2 ))) ); 31 | g.line( c, p0 ); 32 | g.line( c, p1 ); 33 | g.line( c, p2 ); 34 | 35 | 36 | return; 37 | } 38 | else 39 | { 40 | 41 | count--; 42 | 43 | var m0 = p0.pointAt( .5, p1 ); 44 | var m1 = p1.pointAt( .5, p2 ); 45 | var m2 = p2.pointAt( .5, p0 ); 46 | 47 | m0.add( curlNoise( m0, 0.01 / unit ) ); 48 | m1.add( curlNoise( m1, 0.01 / unit ) ); 49 | m2.add( curlNoise( m2, 0.01 / unit ) ); 50 | 51 | if( PRNG.random()>.15 ) subdivide(count, p0, m0, m2 ); 52 | if( PRNG.random()>.15 ) subdivide(count, m0, p1, m1 ); 53 | if( PRNG.random()>.15 ) subdivide(count, m1, m2, p2 ); 54 | 55 | subdivide(count, m0, m1, m2 ); 56 | } 57 | 58 | } 59 | 60 | var a = new Point( -s * .5, -s * .5 ).multiplyScalar(.8); 61 | var b = new Point( s * .5, -s * .5 ).multiplyScalar(.8); 62 | var c = new Point( s * .5, s * .5 ).multiplyScalar(.8); 63 | var d = new Point( -s * .5, s * .5 ).multiplyScalar(.8); 64 | subdivide( tot, a,b,c ); 65 | subdivide( tot, a,c,d ); 66 | 67 | 68 | 69 | function curlNoise( p, delta ){ 70 | 71 | var p_x0 = noise.perlin3( p.x-delta, p.y, p.z ); 72 | var p_x1 = noise.perlin3( p.x+delta, p.y, p.z ); 73 | var p_y0 = noise.perlin3( p.x, p.y-delta, p.z ); 74 | var p_y1 = noise.perlin3( p.x, p.y+delta, p.z ); 75 | var p_z0 = noise.perlin3( p.x, p.y, p.z-delta ); 76 | var p_z1 = noise.perlin3( p.x, p.y, p.z+delta ); 77 | 78 | var x = p_y1 - p_y0 - p_z1 + p_z0; 79 | var y = p_z1 - p_z0 - p_x1 + p_x0; 80 | var z = p_x1 - p_x0 - p_y1 + p_y0; 81 | 82 | var divisor = 1.0 / ( 2.0 * delta ); 83 | return new Point( x , y , z ).normalize().multiplyScalar( divisor ); 84 | 85 | } 86 | 87 | ctx.restore(); 88 | return PORTRAIT; 89 | 90 | }; 91 | -------------------------------------------------------------------------------- /badges/generators/54.js: -------------------------------------------------------------------------------- 1 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 2 | 3 | PRNG.setSeed(seed); 4 | noise.seed(PRNG.random()); 5 | 6 | ctx.save(); 7 | ctx.translate( s/2, s/2 ); 8 | 9 | 10 | var points = distribution.sphereUniform( 100, s/4 ); 11 | var normals = []; 12 | points.forEach(function( p ){ 13 | normals.push( p.clone().normalize() ); 14 | }); 15 | 16 | var t = new Point(); 17 | var sca = 0.005 / unit; 18 | points.forEach(function( p, id ){ 19 | 20 | ctx.globalAlpha = .05; 21 | var n = normals[id]; 22 | var tot = 250; 23 | for ( var i = 0; i < tot; i++ ) { 24 | 25 | 26 | p.add( n.normalize( lerp( i/tot, 10 * unit, s/Math.sqrt( 2 ) ) * 1/tot ) ); 27 | p.add( curlNoise( n, .5 / unit ) ); 28 | 29 | var r = Math.max( 0, 100 * unit * noise.perlin3(p.x*sca, p.y*sca, p.z*sca ) ); 30 | if( r === 0 ) return; 31 | g.disc(p, r ); 32 | 33 | } 34 | 35 | }); 36 | 37 | 38 | 39 | function curlNoise( p, delta ){ 40 | 41 | var p_x0 = noise.perlin3( p.x-delta, p.y, p.z ); 42 | var p_x1 = noise.perlin3( p.x+delta, p.y, p.z ); 43 | var p_y0 = noise.perlin3( p.x, p.y-delta, p.z ); 44 | var p_y1 = noise.perlin3( p.x, p.y+delta, p.z ); 45 | var p_z0 = noise.perlin3( p.x, p.y, p.z-delta ); 46 | var p_z1 = noise.perlin3( p.x, p.y, p.z+delta ); 47 | 48 | var x = p_y1 - p_y0 - p_z1 + p_z0; 49 | var y = p_z1 - p_z0 - p_x1 + p_x0; 50 | var z = p_x1 - p_x0 - p_y1 + p_y0; 51 | 52 | var divisor = 1.0 / ( 2.0 * delta ); 53 | return new Point( x , y , z ).normalize().multiplyScalar( divisor ); 54 | 55 | } 56 | 57 | ctx.restore(); 58 | return LANDSCAPE; 59 | 60 | }; 61 | -------------------------------------------------------------------------------- /badges/generators/55.js: -------------------------------------------------------------------------------- 1 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 2 | 3 | PRNG.setSeed(seed); 4 | noise.seed(PRNG.random()); 5 | 6 | ctx.save(); 7 | 8 | 9 | var points = Poisson.distribute(10000, s/50, s,s ); 10 | 11 | var sca = 0.005 / unit; 12 | var ps = []; 13 | points.forEach(function( p ){ 14 | var r = 8 * unit * Math.abs( noise.perlin2( p.x*sca, p.y*sca ) ); 15 | g.disc(p, r ); 16 | ps.push( [p.x, p.y, r ]) 17 | }); 18 | 19 | 20 | var delaunay = new Delaunator( ps ); 21 | var tris = delaunay.triangles; 22 | 23 | var pa = new Point(); 24 | var pb = new Point(); 25 | var pc = new Point(); 26 | for( var i = 0; i < tris.length; ){ 27 | 28 | ctx.beginPath(); 29 | 30 | var a = tris[i++]; 31 | var b = tris[i++]; 32 | var c = tris[i++]; 33 | 34 | pa.set( ps[a][0], ps[a][1],0 ); 35 | pb.set( ps[b][0], ps[b][1],0 ); 36 | pc.set( ps[c][0], ps[c][1],0 ); 37 | 38 | r = ( noise.perlin2( pa.x*sca, pa.y*sca ) ); 39 | if( r < .0 )continue; 40 | 41 | // if( getDistance(pa, pb ) > s/40 )continue; 42 | // if( getDistance(pb, pc ) > s/40 )continue; 43 | // if( getDistance(pa, pc ) > s/40 )continue; 44 | 45 | ctx.globalAlpha = r * .5; 46 | drawTri( ctx, ps, a, b, c ); 47 | ctx.stroke(); 48 | 49 | } 50 | 51 | function drawTri( ctx, ps, a, b, c ) { 52 | 53 | 54 | ctx.moveTo(ps[a][0], ps[a][1]); 55 | ctx.lineTo(ps[b][0], ps[b][1]); 56 | ctx.lineTo(ps[c][0], ps[c][1]); 57 | ctx.lineTo(ps[a][0], ps[a][1]); 58 | 59 | } 60 | 61 | ctx.restore(); 62 | return LANDSCAPE; 63 | 64 | }; 65 | -------------------------------------------------------------------------------- /badges/generators/56.js: -------------------------------------------------------------------------------- 1 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 2 | 3 | PRNG.setSeed(seed); 4 | noise.seed(PRNG.random()); 5 | 6 | ctx.save(); 7 | 8 | function resetPoint( points ){ 9 | 10 | var rp = points[~~( PRNG.random() * points.length ) ]; 11 | var a = PRNG.random() * PI2; 12 | var r = 10 * unit + PRNG.random() * s / 20; 13 | var nr = r + rp.z; 14 | var p = new Point( rp.x + Math.cos( a ) * nr, rp.y + Math.sin( a ) * nr, r ); 15 | p.parent = rp; 16 | return p; 17 | 18 | } 19 | 20 | var count = 100; 21 | var p = new Point(s/2, s/2, s/6 ); 22 | var points = [p]; 23 | 24 | var c0 = new Point(); 25 | var c1 = new Point(); 26 | while( count > 0 ){ 27 | 28 | var ok = true; 29 | p = resetPoint( points ); 30 | c0.copy( p ); 31 | c0.radius = p.z; 32 | points.forEach(function( o ){ 33 | 34 | if( !ok )return; 35 | 36 | c1.copy( o ); 37 | c1.radius = o.z; 38 | 39 | ok = getDistance( p, o ) - ( p.z + o.z ) > 0; 40 | 41 | }); 42 | 43 | if( ok ){ 44 | points.push( p ); 45 | count--; 46 | } 47 | 48 | } 49 | ctx.beginPath(); 50 | var trees = []; 51 | var maxCount = 0; 52 | points.forEach(function(p, i){ 53 | if( i === 0 )return; 54 | 55 | var tree = []; 56 | 57 | while( p !== null && p !== points[0] ){ 58 | 59 | tree.push( p ); 60 | p = p.parent; 61 | 62 | } 63 | 64 | tree.push( points[0] ); 65 | 66 | trees.push( tree ); 67 | 68 | maxCount = Math.max( maxCount, tree.length ); 69 | 70 | }); 71 | 72 | var cubic = new CubicPath(); 73 | trees.forEach(function( tree ){ 74 | 75 | ctx.globalAlpha = .25 * ( 1 / tree.length); 76 | tree.forEach( function( p ){ 77 | g.disc( p, p.z ); 78 | } ); 79 | 80 | var pts = cubic.compute( tree, .1, false ); 81 | 82 | ctx.globalAlpha = .5; 83 | for( var i = 1; i < pts.length; i++ ){ 84 | var t = i/pts.length; 85 | 86 | ctx.beginPath(); 87 | ctx.lineWidth = unit * t * 10; 88 | ctx.moveTo( pts[i-1].x, pts[i-1].y ); 89 | ctx.lineTo( pts[i].x, pts[i].y ); 90 | ctx.stroke(); 91 | 92 | } 93 | 94 | }); 95 | 96 | ctx.restore(); 97 | return LANDSCAPE; 98 | 99 | }; 100 | -------------------------------------------------------------------------------- /badges/generators/57.js: -------------------------------------------------------------------------------- 1 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 2 | 3 | PRNG.setSeed(seed); 4 | noise.seed(PRNG.random()); 5 | 6 | ctx.save(); 7 | 8 | function resetPoint( points ){ 9 | 10 | var rp = points[~~( PRNG.random() * points.length ) ]; 11 | var a = PRNG.random() * PI2; 12 | var r = 10 * unit + PRNG.random() * s / 40; 13 | var nr = r + rp.z; 14 | var p = new Point( rp.x + Math.cos( a ) * nr, rp.y + Math.sin( a ) * nr, r ); 15 | p.parent = rp; 16 | return p; 17 | 18 | } 19 | 20 | var count = 100; 21 | var p = new Point(s/2, s/2, s/6 ); 22 | var points = [p]; 23 | 24 | var c0 = new Point(); 25 | var c1 = new Point(); 26 | while( count > 0 ){ 27 | 28 | var ok = true; 29 | p = resetPoint( points ); 30 | c0.copy( p ); 31 | c0.radius = p.z; 32 | points.forEach(function( o ){ 33 | 34 | if( !ok )return; 35 | 36 | c1.copy( o ); 37 | c1.radius = o.z; 38 | 39 | ok = getDistance( p, o ) - ( p.z + o.z ) > 0; 40 | 41 | }); 42 | 43 | if( ok ){ 44 | points.push( p ); 45 | 46 | if( PRNG.random() > .5 ) { 47 | g.circle(p, p.z * .5 ); 48 | }else{ 49 | g.disc( p, p.z * .1 ); 50 | } 51 | 52 | count--; 53 | } 54 | 55 | } 56 | 57 | // ctx.lineJoin = "round"; 58 | // ctx.lineCap = "round"; 59 | var trees = []; 60 | var maxCount = 0; 61 | points.forEach(function(p, i){ 62 | if( i === 0 )return; 63 | 64 | var tree = []; 65 | 66 | while( p !== null && p !== points[0] ){ 67 | 68 | tree.push( p ); 69 | p = p.parent; 70 | 71 | } 72 | 73 | // tree.push( points[0] ); 74 | 75 | trees.push( tree ); 76 | maxCount = Math.max( maxCount, tree.length ); 77 | 78 | }); 79 | 80 | function filterHull(src, dst){ 81 | var tmp = []; 82 | src.forEach(function(o){ 83 | var used = false; 84 | dst.forEach(function(p){ 85 | if( used ) return; 86 | if( p[0] === o[0] && p[1] === o[1] )used = true; 87 | }); 88 | if( !used )tmp.push( o ); 89 | }); 90 | return tmp; 91 | } 92 | 93 | var data = points.map(function(p){return [p.x, p.y ];}); 94 | 95 | var hullAlpha = s/10; 96 | var convex = hull( data.concat(), hullAlpha ); 97 | var curve = new CatmullRom(.1, 0,1); 98 | var cubic = new CubicPath(.1, 0,1); 99 | var layers = []; 100 | while( convex.length > 3 ){ 101 | 102 | hullAlpha *= 2; 103 | layers.push( convex.concat() ); 104 | // g.polyline( convex, true); 105 | 106 | data = filterHull( data, convex ); 107 | convex = hull( data, hullAlpha ); 108 | 109 | } 110 | 111 | 112 | for( var i = 0; i < layers.length; i++ ){ 113 | 114 | var t= ( i / layers.length ); 115 | // ctx.globalAlpha = ( 1-t ) - .1; 116 | // ctx.lineWidth = unit * ( 1 - t ) * 3; 117 | var pts = cubic.compute( layers[i].map(function(p){return new Point(p[0], p[1]);}), .1, true ); 118 | // g.polygon( pts, true); 119 | g.polyline( pts, true); 120 | 121 | } 122 | trees.forEach(function( tree ){ 123 | 124 | var pts = curve.compute( tree, .1, false ); 125 | ctx.strokeStyle = "#000"; 126 | 127 | 128 | for( var i = 1; i < pts.length; i++ ){ 129 | 130 | var t = 1 - i/pts.length; 131 | ctx.globalAlpha = t; 132 | 133 | ctx.beginPath(); 134 | ctx.lineWidth = unit + unit * Math.sin( PI * t ) * 3; 135 | ctx.moveTo( pts[i-1].x, pts[i-1].y ); 136 | ctx.lineTo( pts[i].x, pts[i].y ); 137 | ctx.stroke(); 138 | 139 | } 140 | 141 | }); 142 | //*/ 143 | ctx.restore(); 144 | return LANDSCAPE; 145 | 146 | }; 147 | -------------------------------------------------------------------------------- /badges/generators/58.js: -------------------------------------------------------------------------------- 1 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 2 | 3 | PRNG.setSeed( seed || 0 ); 4 | noise.seed(PRNG.random()); 5 | 6 | ctx.save(); 7 | ctx.translate( s/2, s/2 ); 8 | ctx.scale( Math.sqrt( 2 ) * .5, 0.35 ); 9 | ctx.rotate( Math.PI / 4 * 2 ); 10 | ctx.translate(-s/2, -s/2 ); 11 | 12 | var step = s / 100; 13 | // ctx.globalAlpha = .1; 14 | 15 | var sca = 0.5 / s; 16 | var oct = 3; 17 | var amp = ( s / 2 ); 18 | 19 | var or = new Point( s/2,s/2 ); 20 | var p = new Point( 0,0 ); 21 | 22 | ctx.globalAlpha = 0.5; 23 | for( i = -s; i <= s*2; i += step ){ 24 | 25 | ctx.beginPath(); 26 | for( j = -s; j <= s*2; j += step ){ 27 | 28 | p.set( i, j ); 29 | if( getDistance( or, p ) > s * Math.sqrt( 2 ) * .5 )continue; 30 | n = Math.abs( PRNG.FBM( i * sca, j * sca, oct ) * PRNG.FBM( ( s - j ) * sca, i * sca, oct * 2 ) ); 31 | offset = ( n ) * amp; 32 | ctx.lineTo( i - offset, j - offset ); 33 | 34 | ctx.globalAlpha = n; 35 | ctx.lineTo( i, j ); 36 | 37 | } 38 | ctx.stroke(); 39 | } 40 | ctx.restore(); 41 | return LANDSCAPE; 42 | 43 | }; 44 | -------------------------------------------------------------------------------- /badges/generators/59.js: -------------------------------------------------------------------------------- 1 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 2 | 3 | PRNG.setSeed( seed || 0 ); 4 | noise.seed(PRNG.random()); 5 | 6 | ctx.save(); 7 | ctx.translate( s/2, s/2 ); 8 | ctx.scale( Math.sqrt( 2 ) * .5, .5 ); 9 | ctx.rotate( Math.PI / 4 * 2 ); 10 | ctx.translate(-s/2, -s/2 ); 11 | 12 | var step = s / 100; 13 | // ctx.globalAlpha = .1; 14 | 15 | var sca = 0.5 / s; 16 | var oct = 3; 17 | var amp = ( s / 2 ); 18 | 19 | var or = new Point( s/2,s/2 ); 20 | var p = new Point( 0,0 ); 21 | 22 | ctx.globalAlpha = 0.5; 23 | for( i = -s; i <= s*2; i += step ){ 24 | 25 | 26 | 27 | for( j = -s; j <= s*2; j += step ){ 28 | 29 | p.set( i, j ); 30 | 31 | var n = ( PRNG.FBM( i * sca, j * sca, oct ) - PRNG.FBM( ( s - j ) * sca, i * sca, oct * 2 ) ) * .25; 32 | 33 | if( n <= 0 )continue; 34 | 35 | offset = ( n ) * amp; 36 | ctx.beginPath(); 37 | ctx.arc( i, j, Math.abs( offset ), PI/4*3, -PI/4*3, false ); 38 | ctx.stroke(); 39 | 40 | 41 | } 42 | } 43 | ctx.restore(); 44 | return LANDSCAPE; 45 | 46 | }; 47 | -------------------------------------------------------------------------------- /badges/generators/6.js: -------------------------------------------------------------------------------- 1 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 2 | 3 | PRNG.setSeed(seed || 0); 4 | 5 | ctx.save(); 6 | 7 | // perimeter accumulator to compute the lengt / angle ratio 8 | var sum = 0; 9 | // length accumulator to compute the lengt / angle ratio 10 | var acc = 0; 11 | var count = 15 + parseInt( PRNG.random() * 10 ); 12 | var rects = []; 13 | 14 | var minWidth = 10 * unit; 15 | var maxWidth = 100 * unit; 16 | var minHeight = 50 * unit; 17 | var maxHeight = 100 * unit; 18 | 19 | for( var i = 0; i < count; i++ ){ 20 | var r = new Rect( 0,0, minWidth+ PRNG.random() * ( maxWidth - minWidth ), minHeight + PRNG.random() * ( maxHeight - minHeight ) ); 21 | rects.push( r ); 22 | sum += r.w; 23 | } 24 | 25 | var radius = ( sum / 2 ) / Math.PI; 26 | for( i = 0; i < count; i++ ){ 27 | 28 | ctx.save(); 29 | ctx.translate(s/2,s/2); 30 | 31 | r = rects[ i ]; 32 | 33 | //start angle: accumulation of all prvious rects 34 | var start = map( acc, 0, sum, 0, Math.PI * 2 ); 35 | acc += r.w; 36 | var next = map( acc, 0, sum, 0, Math.PI * 2 ); 37 | 38 | //angle span: the angle span covered by this rectangle 39 | var span = map( r.w, 0, sum, 0, Math.PI * 2 ); 40 | 41 | 42 | var sp = pointAtAngleRadius( start, radius + r.h ); 43 | var np = pointAtAngleRadius( next, radius + r.h ); 44 | 45 | ctx.globalAlpha = .25; 46 | 47 | var p0 = pointAtAngleRadius( start, radius ); 48 | var p1 = pointAtAngleRadius( start + span, radius ); 49 | var p2 = pointAtAngleRadius( start + span, radius + r.h ); 50 | var p3 = pointAtAngleRadius( start, radius + r.h ); 51 | var p4 = pointAtAngleRadius( start + span * .5, radius + r.h * 1.5 ); 52 | var c = pointAtAngleRadius( start + span * .5, radius + r.h * .75 ); 53 | c.z=1; 54 | 55 | g.line( p2, p1); 56 | var poly = [p0, p1, p2, p4, p3 ]; 57 | 58 | 59 | var light = new Point( 0,1000, 500 ).normalize(); 60 | 61 | g.line( p0, p1 ); 62 | 63 | poly.forEach(function( p, i, arr ){ 64 | 65 | var n = arr[ ( i+1 ) % arr.length ]; 66 | c.z = 10; 67 | 68 | var normal = cross( c.clone().sub( p ), c.clone().sub( n ) ).normalize(); 69 | ctx.globalAlpha = map( light.dot( normal ), -1, 1, 0.95, .0 ); 70 | 71 | ctx.beginPath(); 72 | ctx.moveTo( n.x, n.y ); 73 | ctx.lineTo( c.x, c.y ); 74 | ctx.lineTo( p.x, p.y ); 75 | ctx.lineTo( n.x, n.y ); 76 | ctx.fill(); 77 | ctx.globalAlpha = .25; 78 | ctx.stroke() 79 | 80 | 81 | }); 82 | 83 | ctx.restore(); 84 | 85 | } 86 | 87 | function Rect( x,y,w,h ) 88 | { 89 | this.x = x || 0; 90 | this.y = y || 0; 91 | this.w = w; 92 | this.h = h; 93 | } 94 | 95 | ctx.restore(); 96 | return PORTRAIT; 97 | }; 98 | -------------------------------------------------------------------------------- /badges/generators/60.js: -------------------------------------------------------------------------------- 1 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 2 | 3 | PRNG.setSeed( seed || 0 ); 4 | noise.seed(PRNG.random()); 5 | 6 | ctx.save(); 7 | ctx.translate( s/2, s/2 ); 8 | ctx.scale( Math.sqrt( 2 ) * .5, .35 ); 9 | ctx.rotate( Math.PI / 3 ); 10 | ctx.translate(-s/2, -s/2 ); 11 | 12 | var step = s / 20; 13 | var sca = 0.5 / s; 14 | var oct = 2; 15 | var amp = ( s / 2 ); 16 | 17 | var or = new Point( s/2,s/2 ); 18 | var p = new Point( 0,0 ); 19 | var points = []; 20 | 21 | for( i = -s; i <= s*2; i += step ){ 22 | 23 | for( j = -s; j <= s*2; j += step ){ 24 | 25 | var n = ( PRNG.FBM( i * sca, j * sca, oct )* PRNG.FBM( ( s - j ) * sca, i * sca, oct ) ) * s; 26 | 27 | points.push( p.set( i - n, j - n, n ).clone() ); 28 | 29 | } 30 | } 31 | 32 | 33 | function pointLineDistance( p, a,b ){ 34 | var pp = geomUtils.project(p, a,b ); 35 | return getDistance( p, pp ) / s; 36 | } 37 | 38 | 39 | var min = 120*unit; 40 | var a0 = new Point( 0, 0 ); 41 | var a1 = new Point( s, s ); 42 | 43 | points.forEach( function (p, i){ 44 | 45 | points.forEach( function (o, j ){ 46 | if( i === j )return; 47 | var d = getDistance(p, o); 48 | if( d > min )return; 49 | 50 | var t = Math.pow( 1 - pointLineDistance(p, a0,a1 ), 3 ); 51 | ctx.globalAlpha = t * .5;//poit1 - d/min; 52 | ctx.lineWidth = ( 1 - t ) * unit * 10; 53 | 54 | g.line( p, o ); 55 | 56 | }); 57 | 58 | }); 59 | 60 | ctx.restore(); 61 | return LANDSCAPE; 62 | 63 | }; 64 | -------------------------------------------------------------------------------- /badges/generators/61.js: -------------------------------------------------------------------------------- 1 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 2 | 3 | PRNG.setSeed( seed || 0 ); 4 | noise.seed(PRNG.random()); 5 | 6 | ctx.save(); 7 | ctx.translate( s/2, s/2 ); 8 | ctx.rotate( PI/2 ); 9 | 10 | function pointLineDistance( p, a,b ){ 11 | var pp = geomUtils.project(p, a,b ); 12 | return getDistance( p, pp ) / s; 13 | } 14 | 15 | 16 | var min = 120*unit; 17 | var radius = min * 2; 18 | var points = distribution.sphereUniform(1000, radius ) 19 | 20 | var a = PI / 2;// PRNG.random() * PI2; 21 | var a0 = new Point( 0, -s/2, 0 ); 22 | var a1 = new Point( s, s, 0 ); 23 | a0 = pointAtAngleRadius( a, s/2 ) 24 | a1 = pointAtAngleRadius( a,-s/2 ) 25 | // g.line( a0, a1 ) 26 | var oct = 2; 27 | var sca = 0.01 / unit ; 28 | 29 | ctx.lineJoin = ctx.lineCap = "round"; 30 | points.forEach( function (p, i){ 31 | 32 | var n = noise.perlin3( p.x * sca, p.y* sca, p.z* sca ); 33 | n = PRNG.FBM( p.x * sca, p.y* sca, oct ) *PRNG.FBM( p.y * sca, p.z* sca, oct ); 34 | 35 | var offset = p.clone().normalize( min * n ); 36 | p.add( offset ); 37 | p.x *= 2.; 38 | p.y *= .9;// ( 1 - p.x / radius ); 39 | p.z *= .5; 40 | 41 | points.forEach( function (o, j ){ 42 | if( i === j )return; 43 | var d = getDistance(p, o); 44 | if( d > min )return; 45 | 46 | var t = Math.pow( pointLineDistance(p, a0,a1 ), 1 ); 47 | ctx.globalAlpha = t; 48 | var t = Math.pow( pointLineDistance(p, a0,a1 ), 3.5 ); 49 | ctx.lineWidth = ( t ) * unit * 50; 50 | 51 | g.line( p, o ); 52 | 53 | }); 54 | 55 | }); 56 | 57 | ctx.restore(); 58 | return LANDSCAPE; 59 | 60 | }; 61 | -------------------------------------------------------------------------------- /badges/generators/62.js: -------------------------------------------------------------------------------- 1 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 2 | 3 | PRNG.setSeed( seed || 0 ); 4 | noise.seed(PRNG.random()); 5 | 6 | ctx.save(); 7 | ctx.translate( s/2, s/2 ); 8 | ctx.rotate( PI / 6 ); 9 | 10 | function pointLineDistance( p, a,b ){ 11 | var pp = geomUtils.project(p, a,b ); 12 | return getDistance( p, pp ) / s; 13 | } 14 | 15 | 16 | var min = 120*unit; 17 | var radius = min * 2.5; 18 | var points = distribution.sphereUniform(1000, radius ) 19 | 20 | var a = PI / 4;// PRNG.random() * PI2; 21 | var a0 = new Point( 0, -s/2, 0 ); 22 | var a1 = new Point( s, s, 0 ); 23 | a0 = pointAtAngleRadius( a, s/2 ) 24 | a1 = pointAtAngleRadius( a,-s/2 ) 25 | var oct = 3; 26 | var sca = 0.01 / unit ; 27 | 28 | ctx.lineJoin = ctx.lineCap = "round"; 29 | points.forEach( function (p, i){ 30 | 31 | p.x *= 1.; 32 | p.y *= 1.32;// ( 1 - p.x / radius ); 33 | p.z *= 1; 34 | 35 | var n = noise.perlin3( p.x * sca, p.y* sca, p.z* sca ) * 2; 36 | n = PRNG.FBM( p.x * sca, p.y* sca, oct ) *PRNG.FBM( p.y * sca, p.z* sca, oct ) * 1.5; 37 | 38 | var offset = p.clone().normalize( min * n ); 39 | p.add( offset ); 40 | 41 | }); 42 | 43 | 44 | function filterHull(src, dst){ 45 | var tmp = []; 46 | src.forEach(function(o){ 47 | var used = false; 48 | dst.forEach(function(p){ 49 | if( used ) return; 50 | if( p[0] === o[0] && p[1] === o[1] )used = true; 51 | }); 52 | if( !used )tmp.push( o ); 53 | }); 54 | return tmp; 55 | } 56 | 57 | var data = points.map(function(p){return [p.x, p.y ];}); 58 | 59 | var hullAlpha = s/5; 60 | var convex = hull( data.concat(), hullAlpha ); 61 | var cubic = new CatmullRom(.1, 0,1); 62 | // var cubic = new CubicPath(.1, 0, true); 63 | var layers = []; 64 | 65 | while( convex.length > 3 ){ 66 | hullAlpha *= 2; 67 | layers.push( convex.concat() ); 68 | data = filterHull( data, convex ); 69 | convex = hull( data, hullAlpha ); 70 | } 71 | 72 | 73 | for( var i = 0; i < layers.length; i++ ){ 74 | 75 | var t = 1 - Math.pow( ( i / layers.length ), 2 ); 76 | ctx.globalAlpha = Math.max( 0, ( t ) - .1 ) * ( 1 / layers.length ) * 4; 77 | // ctx.lineWidth = unit * ( t ) * 2; 78 | var pts = cubic.compute( layers[i].map(function(p){return new Point(p[0], p[1]);}), .1, true ); 79 | g.polygon( pts, true); 80 | 81 | } 82 | 83 | ctx.strokeStyle = "#FFF" 84 | points.forEach( function (p, i){ 85 | 86 | points.forEach( function (o, j ){ 87 | if( i === j )return; 88 | var d = getDistance(p, o); 89 | if( d > min )return; 90 | 91 | var t = Math.pow( pointLineDistance(p, a0,a1 ), 3.5 ); 92 | ctx.globalAlpha = t; 93 | 94 | t = Math.pow( pointLineDistance(p, a0,a1 ), 3.15 ); 95 | ctx.lineWidth = ( t ) * unit * 50; 96 | 97 | g.line( p, o ); 98 | 99 | }); 100 | 101 | }); 102 | 103 | 104 | ctx.restore(); 105 | return PORTRAIT; 106 | 107 | }; 108 | -------------------------------------------------------------------------------- /badges/generators/63.js: -------------------------------------------------------------------------------- 1 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 2 | 3 | PRNG.setSeed( seed || 0 ); 4 | noise.seed(PRNG.random()); 5 | 6 | ctx.save(); 7 | var lines = []; 8 | for( var i = 0; i < 1000; i++ ){ 9 | lines.push( [ 10 | new Point( PRNG.random() * s, PRNG.random() * s, 0 ), 11 | new Point( PRNG.random() * s, PRNG.random() * s, 0 ) 12 | ] 13 | ); 14 | } 15 | var center = new Point(s/2,s/2); 16 | center.radius = s/3.25; 17 | 18 | g.disc( center, center.radius * .9 ); 19 | 20 | lines.forEach(function( l ){ 21 | 22 | var bvs = geomUtils.circleBounceVectors( l[0], l[1], center ); 23 | if( bvs === null )return; 24 | bvs.forEach( function(bv, i) { 25 | 26 | if( bv === null )return; 27 | var p = bv[0]; 28 | var grad; 29 | var l = ( p.clone().sub(bv[1]).length() ) * .5; 30 | if( geomUtils.vectorsHaveSameDirection( center, p,p, bv[1] ) ){ 31 | 32 | grad = ctx.createRadialGradient( p.x,p.y, 0, p.x, p.y, l ); 33 | // grad.addColorStop( 0, "#FFF" ); 34 | // grad.addColorStop( 1, "rgba(255, 255, 255, 0 )" ); 35 | grad.addColorStop( 0, "rgba( 0, 0, 0, 1 )" ); 36 | grad.addColorStop( 1, "rgba( 0, 0, 0, 0 )" ); 37 | 38 | }else{ 39 | grad = ctx.createRadialGradient( p.x,p.y, 0, p.x, p.y, l * .5 ); 40 | // grad.addColorStop( 0, "#000" ); 41 | // grad.addColorStop( 1, "rgba(0, 0, 0, 0 )" ); 42 | grad.addColorStop( 0, "rgba(255, 255, 255, 1 )" ); 43 | grad.addColorStop( 1, "rgba(255, 255, 255, 0 )" ); 44 | } 45 | 46 | ctx.strokeStyle = grad; 47 | ctx.lineWidth = unit * PRNG.random() * 2; 48 | g.line( bv[0], bv[1]); 49 | 50 | }); 51 | 52 | }); 53 | 54 | ctx.restore(); 55 | return PORTRAIT; 56 | 57 | }; -------------------------------------------------------------------------------- /badges/generators/64.js: -------------------------------------------------------------------------------- 1 | 2 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 3 | 4 | PRNG.setSeed( seed || 0 ); 5 | noise.seed(PRNG.random()); 6 | 7 | ctx.save(); 8 | 9 | ctx.lineCap = 'round'; 10 | var c = new Point( s * .5, s * .5 ); 11 | c.radius = s / 2.5; 12 | g.disc(c, c.radius ); 13 | 14 | 15 | var p = new Point(); 16 | var n = new Point(); 17 | var RAD = Math.PI / 180; 18 | 19 | ctx.lineWidth = 20 * unit; 20 | var sa = -PI / 4; 21 | var it = 0; 22 | var step = RAD * .1; 23 | var tot = PI2 / step; 24 | var sca = 0.005 / unit; 25 | ctx.globalAlpha = 0.05; 26 | 27 | for( var i = sa; i < sa + Math.PI * 2; i += step ){ 28 | 29 | var angle = i; 30 | p.x = c.x + Math.cos( angle ) * c.radius; 31 | p.y = c.y + Math.sin( angle ) * c.radius; 32 | 33 | var t = noise.perlin3( p.x * sca, p.y * sca, it++/tot ) * 7.5; 34 | var radius = c.radius * t; 35 | n.x = c.x + Math.cos( angle + RAD * t * 30 ) * radius; 36 | n.y = c.y + Math.sin( angle + RAD * t * 30 ) * radius; 37 | 38 | n = geomUtils.closestPointOnCircle(n,c); 39 | 40 | var grad = ctx.createRadialGradient( p.x,p.y, 0, p.x,p.y, Math.abs( radius * .5 ) ); 41 | grad.addColorStop( 0, "rgba(255,255,255, 1 )" ); 42 | grad.addColorStop( 1, "rgba(255,255,255, 0 )" ); 43 | ctx.strokeStyle = grad; 44 | 45 | g.line(p,n); 46 | 47 | } 48 | ctx.restore(); 49 | return PORTRAIT; 50 | 51 | }; -------------------------------------------------------------------------------- /badges/generators/65.js: -------------------------------------------------------------------------------- 1 | 2 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 3 | 4 | PRNG.setSeed( seed || 0 ); 5 | noise.seed(PRNG.random()); 6 | 7 | ctx.save(); 8 | 9 | var line = []; 10 | for( var i = 0; i < s; i+=2 ){ 11 | line.push( new Point(i,0,0 ) ); 12 | } 13 | 14 | // ctx.fillStyle = "#EEE"; 15 | // g.disc(s/2, s/2 , s/3 ); 16 | 17 | ctx.fillStyle = "#000"; 18 | ctx.globalAlpha = .5; 19 | var sca = 0.005 / unit; 20 | for( i = s/2.75; i < s-s/3.5; i += 50 * unit ){ 21 | 22 | ctx.beginPath(); 23 | ctx.moveTo( s,s ); 24 | ctx.lineTo( 0,s ); 25 | 26 | line.forEach( function( p ){ 27 | p.y = i; 28 | ctx.lineTo( p.x, i + PRNG.FBM( p.x * sca, p.y * sca, 5 ) * 25 * unit ); 29 | } ); 30 | 31 | ctx.lineTo( s,s ); 32 | 33 | ctx.fill(); 34 | 35 | 36 | } 37 | 38 | ctx.restore(); 39 | return LANDSCAPE; 40 | 41 | }; -------------------------------------------------------------------------------- /badges/generators/67.js: -------------------------------------------------------------------------------- 1 | 2 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 3 | 4 | PRNG.setSeed( seed || 0 ); 5 | noise.seed(PRNG.random()); 6 | 7 | ctx.save(); 8 | 9 | var count = 30; 10 | var cell = s / count; 11 | var a = PRNG.random() * PI2; 12 | for ( var i = 0; i < s; i+=cell ){ 13 | for ( var j = 0; j< s; j+=cell ){ 14 | ctx.globalAlpha = 1- Math.abs( PRNG.FBM( i/s, j/s, 2 ) * 2 ); 15 | ctx.beginPath(); 16 | splitQuad( i, j, cell, Math.abs( PRNG.FBM( i/s, j/s, 3 ) * 2 ) ); 17 | ctx.stroke(); 18 | } 19 | } 20 | 21 | 22 | 23 | function splitQuad( x, y, c, t ){ 24 | 25 | var cx = x + c * .5; 26 | var cy = y + c * .5; 27 | 28 | var axis_v = [new Point( cx, y), new Point( cx, y+c ) ]; 29 | 30 | var axis_h = [new Point( x, cy ), new Point( x+c, cy ) ]; 31 | 32 | var lattice = new Point( cx, y ); 33 | var p0 = new Point( 0, 0 ); 34 | var p1 = new Point( c / 2 * t, 0 ); 35 | var p2 = new Point( c / 2 * .5, c/4 ); 36 | var p3 = new Point( c / 2 * ( 1-t ), c/2 ); 37 | var p4 = new Point( c / 2, c/2 ); 38 | 39 | 40 | var line = [p0, p1, p2, p3, p4 ]; 41 | line.forEach(function(p){p.add(lattice );}); 42 | symmetries( line, axis_h, axis_v ); 43 | 44 | var pivot = new Point( cx+c/4, cy+c/4 ); 45 | line.forEach(function(p){ 46 | p.copy( geomUtils.rotateAroundPoint( p, pivot, PI / 2 ) ); 47 | }); 48 | symmetries( line, axis_h, axis_v ); 49 | 50 | } 51 | 52 | function symmetries( line, h, v ){ 53 | 54 | render(line); 55 | line.forEach(function(p){ 56 | p.copy( geomUtils.reflect( p, h[0], h[1] ) ); 57 | }); 58 | render(line); 59 | line.forEach(function(p){ 60 | p.copy( geomUtils.reflect( p, v[0], v[1] ) ); 61 | }); 62 | render(line); 63 | line.forEach(function(p){ 64 | p.copy( geomUtils.reflect( p, h[0], h[1] ) ); 65 | }); 66 | render(line); 67 | 68 | } 69 | 70 | function render( l ){ 71 | ctx.moveTo(l[0].x,l[0].y); 72 | l.forEach( function( p ){ 73 | ctx.lineTo( p.x, p.y ); 74 | }); 75 | } 76 | return LANDSCAPE; 77 | 78 | }; 79 | -------------------------------------------------------------------------------- /badges/generators/68.js: -------------------------------------------------------------------------------- 1 | 2 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 3 | 4 | PRNG.setSeed( seed || 0 ); 5 | noise.seed(PRNG.random()); 6 | 7 | ctx.save(); 8 | ctx.translate(s/2, s/2); 9 | 10 | 11 | var Spring = function( p0,p1,length ){ 12 | 13 | this.p0 = p0; 14 | this.p1 = p1; 15 | 16 | this.o0 = p0.clone(); 17 | this.o1 = p1.clone(); 18 | 19 | this.temp = new Point(); 20 | Spring.damping = 0.1; 21 | this.restLength = length || 50; 22 | this.length = this.restLength; 23 | 24 | this.applyConstraints = function(){ 25 | 26 | this.temp = this.temp.copy( this.p0 ).sub( this.p1 ); 27 | 28 | this.length = 1 - (this.restLength / this.temp.length() ); 29 | 30 | this.temp.multiplyScalar( this.length ).multiplyScalar( 0.5 ).multiplyScalar( Spring.damping ); 31 | 32 | this.temp.z = 0; 33 | 34 | if( !this.p0.fixed ) this.p0.sub( this.temp ); 35 | if( !this.p1.fixed ) this.p1.add( this.temp ); 36 | 37 | } 38 | 39 | 40 | }; 41 | 42 | var springs = []; 43 | var count = 100; 44 | var step = PI2 / count ; 45 | var points = []; 46 | for( var i = 0; i < PI2; i+=step ){ 47 | 48 | var p = pointAtAngleRadius( i, ( 1 + PRNG.random() ) * unit ); 49 | p.r = s / 2; 50 | points.push( p ); 51 | 52 | } 53 | points.forEach(function( p,i,a ){ 54 | springs.push( new Spring( p, a[(i+1)%a.length ], 100 * unit ) ); 55 | }); 56 | 57 | var tot = 250; 58 | i = tot; 59 | while( i-- ){ 60 | 61 | ctx.globalAlpha = 1 - i / tot; 62 | ctx.lineWidth = ( 1 - i / tot ) * unit * 10; 63 | 64 | g.polyline( points, true ); 65 | 66 | springs.forEach(function (s) { 67 | s.applyConstraints(); 68 | }); 69 | repel( points, points ); 70 | } 71 | 72 | 73 | function repel(a, b) { 74 | 75 | var acc = 0; 76 | var dirs = []; 77 | a.forEach(function (circle) { 78 | 79 | b.forEach(function (other) { 80 | 81 | if (circle === other) return; 82 | 83 | var p = circle; 84 | var o = other; 85 | 86 | var d = geomUtils.distance(p, o); 87 | var minDist = circle.r + other.r; 88 | 89 | if (d < minDist) { 90 | 91 | var dir = p.direction(o).multiplyScalar(.35); 92 | dir.z = 0; 93 | p.sub(dir); 94 | o.add(dir); 95 | } 96 | 97 | }); 98 | 99 | }); 100 | return acc; 101 | } 102 | 103 | ctx.restore(); 104 | return LANDSCAPE; 105 | 106 | }; 107 | -------------------------------------------------------------------------------- /badges/generators/69.js: -------------------------------------------------------------------------------- 1 | 2 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 3 | 4 | PRNG.setSeed( seed || 0 ); 5 | noise.seed(PRNG.random()); 6 | 7 | ctx.save(); 8 | 9 | 10 | var points = []; 11 | var count = 10; 12 | var cell = s/count; 13 | for( var i = 0; i< count; i++ ){ 14 | 15 | for( var j = 0; j< count; j++ ){ 16 | 17 | 18 | var x = i * cell + PRNG.random() * cell; 19 | var y = j * cell + PRNG.random() * cell; 20 | 21 | 22 | var p = new Point( x,y ); 23 | points.push( p ); 24 | 25 | } 26 | 27 | } 28 | 29 | 30 | var voronoi = new Voronoi(); 31 | var bbox = {xl: -s, xr: s, yt: -s, yb: s}; 32 | var diagram = voronoi.compute( points, bbox); 33 | 34 | var center = new Point( s/2, s/2 ) 35 | diagram.cells.forEach(function(cell, i){ 36 | 37 | // if( i !== 20 )return; 38 | if( cell.site == undefined )return; 39 | 40 | var poly = []; 41 | cell.halfedges.forEach(function( he ){ 42 | 43 | poly.push( [ he.edge.va.x, he.edge.va.y ] ); 44 | poly.push( [ he.edge.vb.x, he.edge.vb.y ] ); 45 | 46 | }); 47 | 48 | var convex = hull(poly, s ).map( function( v ){ 49 | var p = new Point( v[0], v[1], 0 ); 50 | p.r = s/2; 51 | return p; 52 | } ); 53 | 54 | var d = getDistance( center, cell.site ); 55 | if( d - s / 3 < 0 ){ 56 | var k = 100; 57 | ctx.globalAlpha = ( 1 / k ); 58 | while( k-- ){ 59 | repel(convex, convex ); 60 | g.polygon(convex, true); 61 | } 62 | } 63 | 64 | } ); 65 | 66 | 67 | function repel(a, b) { 68 | 69 | var acc = 0; 70 | var dirs = []; 71 | var sca = 0.005 / unit; 72 | a.forEach(function (circle) { 73 | circle.x += PRNG.FBM(circle.x * sca, circle.y * sca, 5 ) * unit; 74 | circle.y += PRNG.FBM(circle.y * sca, circle.x * sca, 5 ) * unit; 75 | }); 76 | a.forEach(function (circle) { 77 | 78 | b.forEach(function (other) { 79 | 80 | if (circle === other) return; 81 | 82 | var p = circle; 83 | var o = other; 84 | 85 | var d = geomUtils.distance(p, o); 86 | var minDist = circle.r + other.r; 87 | 88 | if (d < minDist) { 89 | 90 | var dir = p.direction(o).multiplyScalar( .01 * unit); 91 | dir.z = 0; 92 | p.sub(dir); 93 | o.add(dir); 94 | } 95 | 96 | }); 97 | 98 | }); 99 | return acc; 100 | } 101 | ctx.restore(); 102 | return PORTRAIT; 103 | 104 | }; 105 | -------------------------------------------------------------------------------- /badges/generators/7.js: -------------------------------------------------------------------------------- 1 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 2 | 3 | PRNG.setSeed(seed || 0); 4 | 5 | var turns = 5; 6 | var total = Math.PI * 2 * turns; 7 | var minRadius = s/5; 8 | var maxRadius = minRadius + s/5; 9 | var ga = ( ( 1 + Math.sqrt(5) ) / 2 ) / 5; 10 | var points = []; 11 | var i=0; 12 | ctx.save(); 13 | ctx.translate( s/2,s/2 ); 14 | var sca = .0005 / unit; 15 | for ( var angle = 0; angle <= total; angle+=ga ){ 16 | 17 | var radius = map( angle, 0, total, minRadius, maxRadius ); 18 | var x = Math.cos( angle ) * radius * .75; 19 | var y = Math.sin( angle ) * radius; 20 | points.push([x,y]); 21 | ctx.moveTo(x,y); 22 | var ang = ( PRNG.FBM( x * sca, y * sca ) * Math.PI * 4 ) + PRNG.random(); 23 | x += Math.cos( ang ) * radius * .25; 24 | y += Math.sin( ang ) * radius * .25; 25 | ctx.lineTo(x,y); 26 | points.push([x,y]); 27 | 28 | 29 | } 30 | 31 | var delaunay = new Delaunator( points ); 32 | var tris = delaunay.triangles; 33 | var centers = []; 34 | ctx.beginPath(); 35 | ctx.fillStyle = ctx.strokeStyle = "#000"; 36 | 37 | for( i = 0; i < tris.length; ){ 38 | 39 | if( PRNG.random() > .5 ){ 40 | i+=3; 41 | continue; 42 | } 43 | 44 | var a = tris[i++]; 45 | var b = tris[i++]; 46 | var c = tris[i++]; 47 | 48 | if( areaABC( a,b,c ) < 50 * unit ){ 49 | continue; 50 | } 51 | 52 | var dt = drawTri( ctx, points, a,b,c ); 53 | if( dt === false ){ 54 | var pa = new Point(points[a][0], points[a][1]); 55 | var pb = new Point(points[b][0], points[b][1]); 56 | var pc = new Point(points[c][0], points[c][1]); 57 | 58 | var da = geomUtils.distance( pb,pc ); 59 | var db = geomUtils.distance( pa,pc ); 60 | var dc = geomUtils.distance( pa,pb ); 61 | var pe = da+db+dc; 62 | 63 | //incenter 64 | var ix = ( da* pa.x + db * pb.x + dc * pc.x ) / pe; 65 | var iy = ( da* pa.y + db * pb.y + dc * pc.y ) / pe; 66 | 67 | //centroid 68 | var cx = ( points[a][0] + points[b][0] + points[c][0] ) / 3; 69 | var cy = ( points[a][1] + points[b][1] + points[c][1] ) / 3; 70 | 71 | var p = new Point( ix, iy ); 72 | p.radius = Math.min( 73 | geomUtils.distance( p, geomUtils.project( p, pa,pb ) ), 74 | Math.min( 75 | geomUtils.distance( p, geomUtils.project( p, pb,pc ) ), 76 | geomUtils.distance( p, geomUtils.project( p, pc,pa ) ) 77 | ) 78 | ); 79 | centers.push( p ); 80 | } 81 | 82 | } 83 | ctx.fill(); 84 | ctx.fillStyle = "#FFF"; 85 | centers.forEach( function(p,i){ 86 | 87 | g.disc(p,p.radius ); 88 | } ); 89 | ctx.restore(); 90 | 91 | 92 | function drawTri( ctx, ps, a, b, c ){ 93 | 94 | 95 | ctx.moveTo(ps[a][0], ps[a][1]); 96 | ctx.lineTo(ps[b][0], ps[b][1]); 97 | ctx.lineTo(ps[c][0], ps[c][1]); 98 | ctx.lineTo(ps[a][0], ps[a][1]); 99 | 100 | return false; 101 | 102 | } 103 | return PORTRAIT; 104 | } -------------------------------------------------------------------------------- /badges/generators/70.js: -------------------------------------------------------------------------------- 1 | 2 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 3 | 4 | PRNG.setSeed( seed || 0 ); 5 | noise.seed(PRNG.random()); 6 | 7 | ctx.save(); 8 | 9 | 10 | var points = []; 11 | var count = 10; 12 | var cell = s/count; 13 | for( var i = 0; i< count; i++ ){ 14 | 15 | for( var j = 0; j< count; j++ ){ 16 | 17 | 18 | var x = i * cell + PRNG.random() * cell - s/2; 19 | var y = j * cell + PRNG.random() * cell - s/2; 20 | 21 | var p = new Point( x,y ); 22 | points.push( p ); 23 | 24 | } 25 | 26 | } 27 | 28 | 29 | var voronoi = new Voronoi(); 30 | var bbox = {xl: -s, xr: s, yt: -s, yb: s}; 31 | var diagram = voronoi.compute( points, bbox); 32 | diagram.cells.forEach(function(cell){ 33 | // g.disc( cell.site, 2 ); 34 | }); 35 | 36 | // ctx.beginPath(); 37 | // diagram.edges.forEach(function(e){ 38 | // ctx.moveTo(e.va.x, e.va.y); 39 | // ctx.lineTo(e.vb.x, e.vb.y); 40 | // }); 41 | // ctx.stroke(); 42 | 43 | ctx.translate( s/2,s/2 ) 44 | ctx.rotate( PI / 4 ) 45 | 46 | var center = new Point( 0,0 );//s/2, s/2 ) 47 | diagram.cells.forEach(function(cell, i){ 48 | 49 | // if( i !== 20 )return; 50 | if( cell.site === undefined )return; 51 | 52 | var poly = []; 53 | cell.halfedges.forEach(function( he ){ 54 | 55 | poly.push( [ he.edge.va.x, he.edge.va.y ] ); 56 | poly.push( [ he.edge.vb.x, he.edge.vb.y ] ); 57 | 58 | }); 59 | 60 | var convex = hull(poly, s ).map( function( v ){ 61 | var p = new Point( v[0], v[1], PRNG.random() * s/2 ); 62 | p.r = PRNG.random() * s/2; 63 | return p; 64 | } ); 65 | 66 | var d = getDistance( center, cell.site ); 67 | if( d - s / 5 > 0 ){ 68 | var k = 250; 69 | ctx.globalAlpha = 0.02;// / k; 70 | 71 | while( k-- ) { 72 | 73 | // g.polyline(convex, true); 74 | var sca = 0.005 / unit; 75 | convex.forEach(function (p) { 76 | p.x += PRNG.FBM( p.x * sca, p.y * sca, 2 ) * .1 * unit; 77 | p.y += PRNG.FBM( p.z * sca, p.r * sca, 2 ) * .1 * unit; 78 | }); 79 | repel(convex, convex ); 80 | g.polyline(convex, true); 81 | 82 | } 83 | } 84 | 85 | 86 | } ); 87 | 88 | 89 | function repel(a, b) { 90 | 91 | var acc = 0; 92 | var sca = 0.001 / unit; 93 | a.forEach(function (circle) { 94 | circle.x += PRNG.FBM(circle.x * sca, circle.y * sca, 5 ) * unit; 95 | circle.y += PRNG.FBM(circle.y * sca, circle.x * sca, 5 ) * unit; 96 | }); 97 | a.forEach(function (circle) { 98 | 99 | b.forEach(function (other) { 100 | 101 | if (circle === other) return; 102 | 103 | var p = circle; 104 | var o = other; 105 | 106 | var d = geomUtils.distance(p, o); 107 | var minDist = circle.r + other.r; 108 | 109 | if (d < minDist) { 110 | 111 | var dir = p.direction(o).multiplyScalar(-.01 * unit); 112 | dir.z = 0; 113 | p.sub(dir); 114 | o.add(dir); 115 | } 116 | 117 | }); 118 | 119 | }); 120 | return acc; 121 | } 122 | ctx.restore() 123 | return LANDSCAPE; 124 | 125 | }; 126 | -------------------------------------------------------------------------------- /badges/generators/72.js: -------------------------------------------------------------------------------- 1 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 2 | 3 | PRNG.setSeed( seed || 0 ); 4 | noise.seed(PRNG.random()); 5 | 6 | ctx.save(); 7 | ctx.translate( s/2, s/2 ); 8 | 9 | function pointLineDistance( p, a,b ){ 10 | var pp = geomUtils.project(p, a,b ); 11 | return getDistance( p, pp ) / s; 12 | } 13 | 14 | 15 | var min = 120*unit; 16 | var radius = min * 2; 17 | var points = distribution.sphereUniform(1000, radius ) 18 | 19 | var a = PI / 2;// PRNG.random() * PI2; 20 | var a0 = new Point( 0, -s/2, 0 ); 21 | var a1 = new Point( s, s, 0 ); 22 | a0 = pointAtAngleRadius( a, s/2 ) 23 | a1 = pointAtAngleRadius( a,-s/2 ) 24 | // g.line( a0, a1 ) 25 | var oct = 2; 26 | var sca = 0.01 / unit ; 27 | 28 | ctx.lineJoin = ctx.lineCap = "round"; 29 | points.forEach( function (p, i){ 30 | 31 | var n = noise.perlin3( p.x * sca, p.y* sca, p.z* sca ); 32 | n = PRNG.FBM( p.x * sca, p.y* sca, oct ) *PRNG.FBM( p.y * sca, p.z* sca, oct ); 33 | 34 | var offset = p.clone().normalize( min * n ); 35 | p.add( offset ); 36 | p.x *= .9; 37 | p.y *= 2.;// ( 1 - p.x / radius ); 38 | p.z *= .5; 39 | 40 | points.forEach( function (o, j ){ 41 | if( i === j )return; 42 | var d = getDistance(p, o); 43 | if( d > min )return; 44 | 45 | var t = Math.pow( pointLineDistance(p, a0,a1 ), 1 ); 46 | ctx.globalAlpha = t; 47 | var t = Math.pow( pointLineDistance(p, a0,a1 ), 3.5 ); 48 | ctx.lineWidth = ( t ) * unit * 50; 49 | 50 | g.line( p, o ); 51 | 52 | }); 53 | 54 | }); 55 | 56 | ctx.restore(); 57 | return LANDSCAPE; 58 | 59 | }; 60 | -------------------------------------------------------------------------------- /badges/generators/73.js: -------------------------------------------------------------------------------- 1 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 2 | 3 | PRNG.setSeed( seed || 0 ); 4 | noise.seed(PRNG.random()); 5 | 6 | ctx.save(); 7 | 8 | function pointLineDistance( p, a,b ){ 9 | var pp = geomUtils.project(p, a,b, true ); 10 | return getDistance( p, pp ); 11 | } 12 | 13 | var points = Poisson.distribute( 10000, unit * 7, s,s ) 14 | 15 | var lines = []; 16 | for( var i = 0; i < 50; i++ ){ 17 | var p0 = new Point(PRNG.random() * s, PRNG.random() * s ); 18 | var p1 = new Point(PRNG.random() * s, PRNG.random() * s ); 19 | lines.push( [p0, p1]); 20 | } 21 | 22 | points.forEach(function(p){ 23 | var d; 24 | var min = Number.POSITIVE_INFINITY; 25 | lines.forEach(function( l ){ 26 | min = Math.min( min, pointLineDistance( p, l[0], l[1] ) ); 27 | }); 28 | var w = Math.min( 10 * unit , unit * ( min / s ) * 1000 ); 29 | g.disc( p, w ); 30 | 31 | }); 32 | 33 | ctx.restore(); 34 | return PORTRAIT; 35 | 36 | }; 37 | -------------------------------------------------------------------------------- /badges/generators/74.js: -------------------------------------------------------------------------------- 1 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 2 | 3 | PRNG.setSeed( seed || 0 ); 4 | noise.seed(PRNG.random()); 5 | 6 | ctx.save(); 7 | 8 | function pointLineDistance( p, a,b ){ 9 | var pp = geomUtils.project(p, a,b, true ); 10 | return getDistance( p, pp ); 11 | } 12 | 13 | var points = Poisson.distribute( 100, s/25, s,s ); 14 | 15 | var maxDist = Number.NEGATIVE_INFINITY; 16 | points.forEach(function(p,i){ 17 | points.forEach(function(o,j){ 18 | if( i === j )return; 19 | maxDist = Math.max( maxDist, getDistance(p,o) ); 20 | }); 21 | ctx.fillStyle = "#000"; 22 | g.disc( p, 5 * unit ); 23 | ctx.fillStyle = "#FFF"; 24 | g.disc( p.x,p.y-2*unit, 2 * unit ); 25 | ctx.fillStyle = "#000"; 26 | }); 27 | 28 | var count = 100; 29 | var cell = s / count; 30 | 31 | for( var i = 0; i < count; i++ ){ 32 | for( var j = 0; j < count; j++ ){ 33 | 34 | var minDist = Number.POSITIVE_INFINITY; 35 | 36 | var p = new Point( i * cell, j * cell ); 37 | //p.x += PRNG.random() * cell * .5; 38 | //p.y += PRNG.random() * cell * .5; 39 | 40 | points.forEach(function(o){ 41 | minDist = Math.min( minDist, getDistance(p,o) ); 42 | }); 43 | if( minDist > maxDist * .1 )continue; 44 | 45 | var idw = Math.max( .1, Math.pow( 1 - minDist/maxDist, 16 ) ); 46 | // ctx.globalAlpha = idw * 2; 47 | 48 | // g.disc( p, idw * 10 * unit ); 49 | var w = cell - idw * cell;// 50 | ctx.beginPath(); 51 | ctx.rect( p.x, p.y, w, w ); 52 | ctx.fill(); 53 | 54 | } 55 | } 56 | 57 | ctx.restore(); 58 | return PORTRAIT; 59 | 60 | }; 61 | -------------------------------------------------------------------------------- /badges/generators/8.js: -------------------------------------------------------------------------------- 1 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 2 | 3 | PRNG.setSeed(seed || 0); 4 | 5 | var turns = 5.2; 6 | var total = Math.PI * 2 * turns; 7 | var minRadius = s/5; 8 | var maxRadius = minRadius + s/5; 9 | var ga = ( ( 1 + Math.sqrt(5) ) / 2 ) / 5; 10 | var points = []; 11 | var i=0; 12 | ctx.save(); 13 | ctx.translate( s/2,s/2 ); 14 | var sca = .0005 / unit; 15 | for ( var angle = 0; angle <= total; angle+=ga ){ 16 | 17 | var radius = map( angle, 0, total, minRadius, maxRadius ); 18 | var x = Math.cos( angle ) * radius * .75; 19 | var y = Math.sin( angle ) * radius; 20 | points.push([x,y]); 21 | 22 | ctx.moveTo(x,y); 23 | var ang = ( PRNG.FBM( x * sca, y * sca ) * Math.PI * 4 ) + PRNG.random(); 24 | 25 | x += Math.cos( ang ) * radius * .25; 26 | y += Math.sin( ang ) * radius * .25; 27 | ctx.lineTo(x,y); 28 | 29 | points.push([x,y]); 30 | 31 | 32 | } 33 | 34 | var voronoi = new Voronoi(); 35 | var bbox = {xl: -s, xr: s, yt: -s, yb: s}; 36 | var sites = points.map( function( a ){ return { x:a[0], y:a[1] }; } ); 37 | 38 | var diagram = voronoi.compute(sites, bbox); 39 | 40 | diagram.cells.forEach(function(cell){ 41 | g.disc( cell.site, 2 * unit ); 42 | }); 43 | 44 | diagram.edges.forEach(function(e){ 45 | ctx.moveTo(e.va.x, e.va.y); 46 | ctx.lineTo(e.vb.x, e.vb.y); 47 | }); 48 | ctx.stroke(); 49 | 50 | 51 | ctx.restore(); 52 | 53 | function drawTri( ctx, ps, a, b, c ){ 54 | 55 | var cx0 = lerp( .25,ps[a][0], ps[b][0]); 56 | var cy0 = lerp( .25,ps[a][1], ps[b][1]); 57 | var cx00 = lerp( .75,ps[a][0], ps[b][0]); 58 | var cy00 = lerp( .75,ps[a][1], ps[b][1]); 59 | 60 | var cx1 = lerp( .25,ps[b][0], ps[c][0]); 61 | var cy1 = lerp( .25,ps[b][1], ps[c][1]); 62 | var cx10 = lerp( .75,ps[b][0], ps[c][0]); 63 | var cy10 = lerp( .75,ps[b][1], ps[c][1]); 64 | 65 | var cx2 = lerp( .25,ps[c][0], ps[a][0]); 66 | var cy2 = lerp( .25,ps[c][1], ps[a][1]); 67 | var cx20 = lerp( .75,ps[c][0], ps[a][0]); 68 | var cy20 = lerp( .75,ps[c][1], ps[a][1]); 69 | 70 | ctx.moveTo( cx00, cy00 ); 71 | ctx.lineTo( cx1, cy1 ); 72 | 73 | ctx.moveTo( cx10, cy10 ); 74 | ctx.lineTo( cx2, cy2 ); 75 | 76 | ctx.moveTo( cx20, cy20 ); 77 | ctx.lineTo( cx0, cy0 ); 78 | 79 | } 80 | return LANDSCAPE 81 | } 82 | -------------------------------------------------------------------------------- /badges/generators/9.js: -------------------------------------------------------------------------------- 1 | generators[ genId++ ] = function(g, ctx, s, seed, unit) { 2 | 3 | PRNG.setSeed(seed || 0); 4 | 5 | // ctx.save(); 6 | // ctx.translate( s/2,s/2 + s/ 3 ); 7 | // //TODO fix line width 8 | // ctx.scale( 1, .1 ); 9 | // 10 | // ctx.fillStyle = "#FFF"; 11 | // var step = ( ( s/3 ) * 2 ) / 100; 12 | // for( var i = -( s/3 ); i < ( s/3 ); i+= step ){ 13 | // 14 | // ctx.translate( 0, -step * 10 ); 15 | // 16 | // var r = Math.asin( norm( i, -s/3, s/3 ) * Math.PI ); 17 | // ctx.beginPath(); 18 | // ctx.arc( 0, 0, r * s / 3, 0, Math.PI * 2); 19 | // ctx.fill(); 20 | // ctx.stroke(); 21 | // 22 | // } 23 | // ctx.fillStyle = "#000"; 24 | // ctx.restore(); 25 | 26 | ctx.save(); 27 | // ctx.globalAlpha = .5 28 | ctx.fillStyle = "#FFF"; 29 | var step = ( ( s/3 ) * 2 ) / 100; 30 | for( var i = -( s/3 ); i < ( s/3 ); i+= step ){ 31 | 32 | var r = Math.asin( norm( i, -s/3, s/3 ) * Math.PI ); 33 | ctx.beginPath(); 34 | ctx.ellipse( s/2, s / 3 + s / 6 - i , r * s / 3 , r * s / 3 * .1, 0, Math.PI * 2, false); 35 | ctx.fill(); 36 | ctx.stroke(); 37 | 38 | } 39 | ctx.fillStyle = "#000"; 40 | ctx.restore(); 41 | 42 | return PORTRAIT; 43 | 44 | } 45 | -------------------------------------------------------------------------------- /badges/save.js: -------------------------------------------------------------------------------- 1 | 2 | var dl = document.createElement( 'a' ); 3 | function save( ctx, id, cb ){ 4 | 5 | ctx.canvas.toBlob(function(blob) { 6 | // dl.href = ctx.canvas.toDataURL('image/png'); 7 | 8 | dl.href = URL.createObjectURL(blob); 9 | dl.download = id + ".png"; 10 | dl.click(); 11 | 12 | id++; 13 | if( cb )setTimeout( cb, 1, id ); 14 | }); 15 | 16 | } -------------------------------------------------------------------------------- /badges/trash/grow_badges_0.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 |