├── .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 | badges 6 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 84 | 85 | 86 | -------------------------------------------------------------------------------- /badges/trash/grow_badges_1.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | badges 6 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 103 | 104 | 105 | -------------------------------------------------------------------------------- /badges/trash/grow_badges_12.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | badges 6 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 111 | 112 | 113 | -------------------------------------------------------------------------------- /badges/trash/grow_badges_2.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | badges 6 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 113 | 114 | 115 | -------------------------------------------------------------------------------- /badges/trash/grow_badges_4.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | badges 6 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 85 | 86 | 87 | -------------------------------------------------------------------------------- /badges/trash/grow_badges_5.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | badges 6 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 117 | 118 | 119 | -------------------------------------------------------------------------------- /badges/trash/grow_badges_6.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | badges 6 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 121 | 122 | 123 | -------------------------------------------------------------------------------- /slides/css/theme/README.md: -------------------------------------------------------------------------------- 1 | ## Dependencies 2 | 3 | Themes are written using Sass to keep things modular and reduce the need for repeated selectors across files. Make sure that you have the reveal.js development environment including the Grunt dependencies installed before proceding: https://github.com/hakimel/reveal.js#full-setup 4 | 5 | ## Creating a Theme 6 | 7 | To create your own theme, start by duplicating a ```.scss``` file in [/css/theme/source](https://github.com/hakimel/reveal.js/blob/master/css/theme/source). It will be automatically compiled by Grunt from Sass to CSS (see the [Gruntfile](https://github.com/hakimel/reveal.js/blob/master/Gruntfile.js)) when you run `grunt css-themes`. 8 | 9 | Each theme file does four things in the following order: 10 | 11 | 1. **Include [/css/theme/template/mixins.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/mixins.scss)** 12 | Shared utility functions. 13 | 14 | 2. **Include [/css/theme/template/settings.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/settings.scss)** 15 | Declares a set of custom variables that the template file (step 4) expects. Can be overridden in step 3. 16 | 17 | 3. **Override** 18 | This is where you override the default theme. Either by specifying variables (see [settings.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/settings.scss) for reference) or by adding any selectors and styles you please. 19 | 20 | 4. **Include [/css/theme/template/theme.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/theme.scss)** 21 | The template theme file which will generate final CSS output based on the currently defined variables. 22 | -------------------------------------------------------------------------------- /slides/css/theme/source/beige.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * Beige theme for reveal.js. 3 | * 4 | * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se 5 | */ 6 | 7 | 8 | // Default mixins and settings ----------------- 9 | @import "../template/mixins"; 10 | @import "../template/settings"; 11 | // --------------------------------------------- 12 | 13 | 14 | 15 | // Include theme-specific fonts 16 | @import url(../../lib/font/league-gothic/league-gothic.css); 17 | @import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); 18 | 19 | 20 | // Override theme settings (see ../template/settings.scss) 21 | $mainColor: #333; 22 | $headingColor: #333; 23 | $headingTextShadow: none; 24 | $backgroundColor: #f7f3de; 25 | $linkColor: #8b743d; 26 | $linkColorHover: lighten( $linkColor, 20% ); 27 | $selectionBackgroundColor: rgba(79, 64, 28, 0.99); 28 | $heading1TextShadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0,0,0,.1), 0 0 5px rgba(0,0,0,.1), 0 1px 3px rgba(0,0,0,.3), 0 3px 5px rgba(0,0,0,.2), 0 5px 10px rgba(0,0,0,.25), 0 20px 20px rgba(0,0,0,.15); 29 | 30 | // Background generator 31 | @mixin bodyBackground() { 32 | @include radial-gradient( rgba(247,242,211,1), rgba(255,255,255,1) ); 33 | } 34 | 35 | 36 | 37 | // Theme template ------------------------------ 38 | @import "../template/theme"; 39 | // --------------------------------------------- -------------------------------------------------------------------------------- /slides/css/theme/source/black.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * Black theme for reveal.js. This is the opposite of the 'white' theme. 3 | * 4 | * By Hakim El Hattab, http://hakim.se 5 | */ 6 | 7 | 8 | // Default mixins and settings ----------------- 9 | @import "../template/mixins"; 10 | @import "../template/settings"; 11 | // --------------------------------------------- 12 | 13 | 14 | // Include theme-specific fonts 15 | @import url(../../lib/font/source-sans-pro/source-sans-pro.css); 16 | 17 | 18 | // Override theme settings (see ../template/settings.scss) 19 | $backgroundColor: #222; 20 | 21 | $mainColor: #fff; 22 | $headingColor: #fff; 23 | 24 | $mainFontSize: 42px; 25 | $mainFont: 'Source Sans Pro', Helvetica, sans-serif; 26 | $headingFont: 'Source Sans Pro', Helvetica, sans-serif; 27 | $headingTextShadow: none; 28 | $headingLetterSpacing: normal; 29 | $headingTextTransform: uppercase; 30 | $headingFontWeight: 600; 31 | $linkColor: #42affa; 32 | $linkColorHover: lighten( $linkColor, 15% ); 33 | $selectionBackgroundColor: lighten( $linkColor, 25% ); 34 | 35 | $heading1Size: 2.5em; 36 | $heading2Size: 1.6em; 37 | $heading3Size: 1.3em; 38 | $heading4Size: 1.0em; 39 | 40 | section.has-light-background { 41 | &, h1, h2, h3, h4, h5, h6 { 42 | color: #222; 43 | } 44 | } 45 | 46 | 47 | // Theme template ------------------------------ 48 | @import "../template/theme"; 49 | // --------------------------------------------- -------------------------------------------------------------------------------- /slides/css/theme/source/blood.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * Blood theme for reveal.js 3 | * Author: Walther http://github.com/Walther 4 | * 5 | * Designed to be used with highlight.js theme 6 | * "monokai_sublime.css" available from 7 | * https://github.com/isagalaev/highlight.js/ 8 | * 9 | * For other themes, change $codeBackground accordingly. 10 | * 11 | */ 12 | 13 | // Default mixins and settings ----------------- 14 | @import "../template/mixins"; 15 | @import "../template/settings"; 16 | // --------------------------------------------- 17 | 18 | // Include theme-specific fonts 19 | 20 | @import url(https://fonts.googleapis.com/css?family=Ubuntu:300,700,300italic,700italic); 21 | 22 | // Colors used in the theme 23 | $blood: #a23; 24 | $coal: #222; 25 | $codeBackground: #23241f; 26 | 27 | $backgroundColor: $coal; 28 | 29 | // Main text 30 | $mainFont: Ubuntu, 'sans-serif'; 31 | $mainColor: #eee; 32 | 33 | // Headings 34 | $headingFont: Ubuntu, 'sans-serif'; 35 | $headingTextShadow: 2px 2px 2px $coal; 36 | 37 | // h1 shadow, borrowed humbly from 38 | // (c) Default theme by Hakim El Hattab 39 | $heading1TextShadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0,0,0,.1), 0 0 5px rgba(0,0,0,.1), 0 1px 3px rgba(0,0,0,.3), 0 3px 5px rgba(0,0,0,.2), 0 5px 10px rgba(0,0,0,.25), 0 20px 20px rgba(0,0,0,.15); 40 | 41 | // Links 42 | $linkColor: $blood; 43 | $linkColorHover: lighten( $linkColor, 20% ); 44 | 45 | // Text selection 46 | $selectionBackgroundColor: $blood; 47 | $selectionColor: #fff; 48 | 49 | 50 | // Theme template ------------------------------ 51 | @import "../template/theme"; 52 | // --------------------------------------------- 53 | 54 | // some overrides after theme template import 55 | 56 | .reveal p { 57 | font-weight: 300; 58 | text-shadow: 1px 1px $coal; 59 | } 60 | 61 | .reveal h1, 62 | .reveal h2, 63 | .reveal h3, 64 | .reveal h4, 65 | .reveal h5, 66 | .reveal h6 { 67 | font-weight: 700; 68 | } 69 | 70 | .reveal p code { 71 | background-color: $codeBackground; 72 | display: inline-block; 73 | border-radius: 7px; 74 | } 75 | 76 | .reveal small code { 77 | vertical-align: baseline; 78 | } -------------------------------------------------------------------------------- /slides/css/theme/source/league.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * League theme for reveal.js. 3 | * 4 | * This was the default theme pre-3.0.0. 5 | * 6 | * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se 7 | */ 8 | 9 | 10 | // Default mixins and settings ----------------- 11 | @import "../template/mixins"; 12 | @import "../template/settings"; 13 | // --------------------------------------------- 14 | 15 | 16 | 17 | // Include theme-specific fonts 18 | @import url(../../lib/font/league-gothic/league-gothic.css); 19 | @import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); 20 | 21 | // Override theme settings (see ../template/settings.scss) 22 | $headingTextShadow: 0px 0px 6px rgba(0,0,0,0.2); 23 | $heading1TextShadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0,0,0,.1), 0 0 5px rgba(0,0,0,.1), 0 1px 3px rgba(0,0,0,.3), 0 3px 5px rgba(0,0,0,.2), 0 5px 10px rgba(0,0,0,.25), 0 20px 20px rgba(0,0,0,.15); 24 | 25 | // Background generator 26 | @mixin bodyBackground() { 27 | @include radial-gradient( rgba(28,30,32,1), rgba(85,90,95,1) ); 28 | } 29 | 30 | 31 | 32 | // Theme template ------------------------------ 33 | @import "../template/theme"; 34 | // --------------------------------------------- -------------------------------------------------------------------------------- /slides/css/theme/source/moon.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * Solarized Dark theme for reveal.js. 3 | * Author: Achim Staebler 4 | */ 5 | 6 | 7 | // Default mixins and settings ----------------- 8 | @import "../template/mixins"; 9 | @import "../template/settings"; 10 | // --------------------------------------------- 11 | 12 | 13 | 14 | // Include theme-specific fonts 15 | @import url(../../lib/font/league-gothic/league-gothic.css); 16 | @import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); 17 | 18 | /** 19 | * Solarized colors by Ethan Schoonover 20 | */ 21 | html * { 22 | color-profile: sRGB; 23 | rendering-intent: auto; 24 | } 25 | 26 | // Solarized colors 27 | $base03: #002b36; 28 | $base02: #073642; 29 | $base01: #586e75; 30 | $base00: #657b83; 31 | $base0: #839496; 32 | $base1: #93a1a1; 33 | $base2: #eee8d5; 34 | $base3: #fdf6e3; 35 | $yellow: #b58900; 36 | $orange: #cb4b16; 37 | $red: #dc322f; 38 | $magenta: #d33682; 39 | $violet: #6c71c4; 40 | $blue: #268bd2; 41 | $cyan: #2aa198; 42 | $green: #859900; 43 | 44 | // Override theme settings (see ../template/settings.scss) 45 | $mainColor: $base1; 46 | $headingColor: $base2; 47 | $headingTextShadow: none; 48 | $backgroundColor: $base03; 49 | $linkColor: $blue; 50 | $linkColorHover: lighten( $linkColor, 20% ); 51 | $selectionBackgroundColor: $magenta; 52 | 53 | 54 | 55 | // Theme template ------------------------------ 56 | @import "../template/theme"; 57 | // --------------------------------------------- 58 | -------------------------------------------------------------------------------- /slides/css/theme/source/night.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * Black theme for reveal.js. 3 | * 4 | * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se 5 | */ 6 | 7 | 8 | // Default mixins and settings ----------------- 9 | @import "../template/mixins"; 10 | @import "../template/settings"; 11 | // --------------------------------------------- 12 | 13 | 14 | // Include theme-specific fonts 15 | @import url(https://fonts.googleapis.com/css?family=Montserrat:700); 16 | @import url(https://fonts.googleapis.com/css?family=Open+Sans:400,700,400italic,700italic); 17 | 18 | 19 | // Override theme settings (see ../template/settings.scss) 20 | $backgroundColor: #111; 21 | 22 | $mainFont: 'Open Sans', sans-serif; 23 | $linkColor: #e7ad52; 24 | $linkColorHover: lighten( $linkColor, 20% ); 25 | $headingFont: 'Montserrat', Impact, sans-serif; 26 | $headingTextShadow: none; 27 | $headingLetterSpacing: -0.03em; 28 | $headingTextTransform: none; 29 | $selectionBackgroundColor: #e7ad52; 30 | 31 | 32 | // Theme template ------------------------------ 33 | @import "../template/theme"; 34 | // --------------------------------------------- -------------------------------------------------------------------------------- /slides/css/theme/source/serif.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * A simple theme for reveal.js presentations, similar 3 | * to the default theme. The accent color is brown. 4 | * 5 | * This theme is Copyright (C) 2012-2013 Owen Versteeg, http://owenversteeg.com - it is MIT licensed. 6 | */ 7 | 8 | 9 | // Default mixins and settings ----------------- 10 | @import "../template/mixins"; 11 | @import "../template/settings"; 12 | // --------------------------------------------- 13 | 14 | 15 | 16 | // Override theme settings (see ../template/settings.scss) 17 | $mainFont: 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif; 18 | $mainColor: #000; 19 | $headingFont: 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif; 20 | $headingColor: #383D3D; 21 | $headingTextShadow: none; 22 | $headingTextTransform: none; 23 | $backgroundColor: #F0F1EB; 24 | $linkColor: #51483D; 25 | $linkColorHover: lighten( $linkColor, 20% ); 26 | $selectionBackgroundColor: #26351C; 27 | 28 | .reveal a { 29 | line-height: 1.3em; 30 | } 31 | 32 | 33 | // Theme template ------------------------------ 34 | @import "../template/theme"; 35 | // --------------------------------------------- 36 | -------------------------------------------------------------------------------- /slides/css/theme/source/simple.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * A simple theme for reveal.js presentations, similar 3 | * to the default theme. The accent color is darkblue. 4 | * 5 | * This theme is Copyright (C) 2012 Owen Versteeg, https://github.com/StereotypicalApps. It is MIT licensed. 6 | * reveal.js is Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se 7 | */ 8 | 9 | 10 | // Default mixins and settings ----------------- 11 | @import "../template/mixins"; 12 | @import "../template/settings"; 13 | // --------------------------------------------- 14 | 15 | 16 | 17 | // Include theme-specific fonts 18 | @import url(https://fonts.googleapis.com/css?family=News+Cycle:400,700); 19 | @import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); 20 | 21 | 22 | // Override theme settings (see ../template/settings.scss) 23 | $mainFont: 'Lato', sans-serif; 24 | $mainColor: #000; 25 | $headingFont: 'News Cycle', Impact, sans-serif; 26 | $headingColor: #000; 27 | $headingTextShadow: none; 28 | $headingTextTransform: none; 29 | $backgroundColor: #fff; 30 | $linkColor: #00008B; 31 | $linkColorHover: lighten( $linkColor, 20% ); 32 | $selectionBackgroundColor: rgba(0, 0, 0, 0.99); 33 | 34 | section.has-dark-background { 35 | &, h1, h2, h3, h4, h5, h6 { 36 | color: #fff; 37 | } 38 | } 39 | 40 | 41 | // Theme template ------------------------------ 42 | @import "../template/theme"; 43 | // --------------------------------------------- -------------------------------------------------------------------------------- /slides/css/theme/source/sky.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * Sky theme for reveal.js. 3 | * 4 | * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se 5 | */ 6 | 7 | 8 | // Default mixins and settings ----------------- 9 | @import "../template/mixins"; 10 | @import "../template/settings"; 11 | // --------------------------------------------- 12 | 13 | 14 | 15 | // Include theme-specific fonts 16 | @import url(https://fonts.googleapis.com/css?family=Quicksand:400,700,400italic,700italic); 17 | @import url(https://fonts.googleapis.com/css?family=Open+Sans:400italic,700italic,400,700); 18 | 19 | 20 | // Override theme settings (see ../template/settings.scss) 21 | $mainFont: 'Open Sans', sans-serif; 22 | $mainColor: #333; 23 | $headingFont: 'Quicksand', sans-serif; 24 | $headingColor: #333; 25 | $headingLetterSpacing: -0.08em; 26 | $headingTextShadow: none; 27 | $backgroundColor: #f7fbfc; 28 | $linkColor: #3b759e; 29 | $linkColorHover: lighten( $linkColor, 20% ); 30 | $selectionBackgroundColor: #134674; 31 | 32 | // Fix links so they are not cut off 33 | .reveal a { 34 | line-height: 1.3em; 35 | } 36 | 37 | // Background generator 38 | @mixin bodyBackground() { 39 | @include radial-gradient( #add9e4, #f7fbfc ); 40 | } 41 | 42 | 43 | 44 | // Theme template ------------------------------ 45 | @import "../template/theme"; 46 | // --------------------------------------------- 47 | -------------------------------------------------------------------------------- /slides/css/theme/source/solarized.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * Solarized Light theme for reveal.js. 3 | * Author: Achim Staebler 4 | */ 5 | 6 | 7 | // Default mixins and settings ----------------- 8 | @import "../template/mixins"; 9 | @import "../template/settings"; 10 | // --------------------------------------------- 11 | 12 | 13 | 14 | // Include theme-specific fonts 15 | @import url(../../lib/font/league-gothic/league-gothic.css); 16 | @import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); 17 | 18 | 19 | /** 20 | * Solarized colors by Ethan Schoonover 21 | */ 22 | html * { 23 | color-profile: sRGB; 24 | rendering-intent: auto; 25 | } 26 | 27 | // Solarized colors 28 | $base03: #002b36; 29 | $base02: #073642; 30 | $base01: #586e75; 31 | $base00: #657b83; 32 | $base0: #839496; 33 | $base1: #93a1a1; 34 | $base2: #eee8d5; 35 | $base3: #fdf6e3; 36 | $yellow: #b58900; 37 | $orange: #cb4b16; 38 | $red: #dc322f; 39 | $magenta: #d33682; 40 | $violet: #6c71c4; 41 | $blue: #268bd2; 42 | $cyan: #2aa198; 43 | $green: #859900; 44 | 45 | // Override theme settings (see ../template/settings.scss) 46 | $mainColor: $base00; 47 | $headingColor: $base01; 48 | $headingTextShadow: none; 49 | $backgroundColor: $base3; 50 | $linkColor: $blue; 51 | $linkColorHover: lighten( $linkColor, 20% ); 52 | $selectionBackgroundColor: $magenta; 53 | 54 | // Background generator 55 | // @mixin bodyBackground() { 56 | // @include radial-gradient( rgba($base3,1), rgba(lighten($base3, 20%),1) ); 57 | // } 58 | 59 | 60 | 61 | // Theme template ------------------------------ 62 | @import "../template/theme"; 63 | // --------------------------------------------- 64 | -------------------------------------------------------------------------------- /slides/css/theme/source/white.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * White theme for reveal.js. This is the opposite of the 'black' theme. 3 | * 4 | * By Hakim El Hattab, http://hakim.se 5 | */ 6 | 7 | 8 | // Default mixins and settings ----------------- 9 | @import "../template/mixins"; 10 | @import "../template/settings"; 11 | // --------------------------------------------- 12 | 13 | 14 | // Include theme-specific fonts 15 | @import url(../../lib/font/source-sans-pro/source-sans-pro.css); 16 | 17 | 18 | // Override theme settings (see ../template/settings.scss) 19 | $backgroundColor: #fff; 20 | 21 | $mainColor: #222; 22 | $headingColor: #222; 23 | 24 | $mainFontSize: 42px; 25 | $mainFont: 'Source Sans Pro', Helvetica, sans-serif; 26 | $headingFont: 'Source Sans Pro', Helvetica, sans-serif; 27 | $headingTextShadow: none; 28 | $headingLetterSpacing: normal; 29 | $headingTextTransform: uppercase; 30 | $headingFontWeight: 600; 31 | $linkColor: #2a76dd; 32 | $linkColorHover: lighten( $linkColor, 15% ); 33 | $selectionBackgroundColor: lighten( $linkColor, 25% ); 34 | 35 | $heading1Size: 2.5em; 36 | $heading2Size: 1.6em; 37 | $heading3Size: 1.3em; 38 | $heading4Size: 1.0em; 39 | 40 | section.has-dark-background { 41 | &, h1, h2, h3, h4, h5, h6 { 42 | color: #fff; 43 | } 44 | } 45 | 46 | 47 | // Theme template ------------------------------ 48 | @import "../template/theme"; 49 | // --------------------------------------------- -------------------------------------------------------------------------------- /slides/css/theme/template/mixins.scss: -------------------------------------------------------------------------------- 1 | @mixin vertical-gradient( $top, $bottom ) { 2 | background: $top; 3 | background: -moz-linear-gradient( top, $top 0%, $bottom 100% ); 4 | background: -webkit-gradient( linear, left top, left bottom, color-stop(0%,$top), color-stop(100%,$bottom) ); 5 | background: -webkit-linear-gradient( top, $top 0%, $bottom 100% ); 6 | background: -o-linear-gradient( top, $top 0%, $bottom 100% ); 7 | background: -ms-linear-gradient( top, $top 0%, $bottom 100% ); 8 | background: linear-gradient( top, $top 0%, $bottom 100% ); 9 | } 10 | 11 | @mixin horizontal-gradient( $top, $bottom ) { 12 | background: $top; 13 | background: -moz-linear-gradient( left, $top 0%, $bottom 100% ); 14 | background: -webkit-gradient( linear, left top, right top, color-stop(0%,$top), color-stop(100%,$bottom) ); 15 | background: -webkit-linear-gradient( left, $top 0%, $bottom 100% ); 16 | background: -o-linear-gradient( left, $top 0%, $bottom 100% ); 17 | background: -ms-linear-gradient( left, $top 0%, $bottom 100% ); 18 | background: linear-gradient( left, $top 0%, $bottom 100% ); 19 | } 20 | 21 | @mixin radial-gradient( $outer, $inner, $type: circle ) { 22 | background: $outer; 23 | background: -moz-radial-gradient( center, $type cover, $inner 0%, $outer 100% ); 24 | background: -webkit-gradient( radial, center center, 0px, center center, 100%, color-stop(0%,$inner), color-stop(100%,$outer) ); 25 | background: -webkit-radial-gradient( center, $type cover, $inner 0%, $outer 100% ); 26 | background: -o-radial-gradient( center, $type cover, $inner 0%, $outer 100% ); 27 | background: -ms-radial-gradient( center, $type cover, $inner 0%, $outer 100% ); 28 | background: radial-gradient( center, $type cover, $inner 0%, $outer 100% ); 29 | } -------------------------------------------------------------------------------- /slides/css/theme/template/settings.scss: -------------------------------------------------------------------------------- 1 | // Base settings for all themes that can optionally be 2 | // overridden by the super-theme 3 | 4 | // Background of the presentation 5 | $backgroundColor: #2b2b2b; 6 | 7 | // Primary/body text 8 | $mainFont: 'Lato', sans-serif; 9 | $mainFontSize: 40px; 10 | $mainColor: #eee; 11 | 12 | // Vertical spacing between blocks of text 13 | $blockMargin: 20px; 14 | 15 | // Headings 16 | $headingMargin: 0 0 $blockMargin 0; 17 | $headingFont: 'League Gothic', Impact, sans-serif; 18 | $headingColor: #eee; 19 | $headingLineHeight: 1.2; 20 | $headingLetterSpacing: normal; 21 | $headingTextTransform: uppercase; 22 | $headingTextShadow: none; 23 | $headingFontWeight: normal; 24 | $heading1TextShadow: $headingTextShadow; 25 | 26 | $heading1Size: 3.77em; 27 | $heading2Size: 2.11em; 28 | $heading3Size: 1.55em; 29 | $heading4Size: 1.00em; 30 | 31 | // Links and actions 32 | $linkColor: #13DAEC; 33 | $linkColorHover: lighten( $linkColor, 20% ); 34 | 35 | // Text selection 36 | $selectionBackgroundColor: #FF5E99; 37 | $selectionColor: #fff; 38 | 39 | // Generates the presentation background, can be overridden 40 | // to return a background image or gradient 41 | @mixin bodyBackground() { 42 | background: $backgroundColor; 43 | } -------------------------------------------------------------------------------- /slides/img/GROW_RS_Banner02@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nicoptere/GROW/e5982d590440caca5a2ace64ca449ec719823c0a/slides/img/GROW_RS_Banner02@2x.png -------------------------------------------------------------------------------- /slides/img/flashettes/2017-12-01 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nicoptere/GROW/e5982d590440caca5a2ace64ca449ec719823c0a/slides/img/flashettes/2017-12-01 (1).png -------------------------------------------------------------------------------- /slides/img/flashettes/2017-12-01 (2).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nicoptere/GROW/e5982d590440caca5a2ace64ca449ec719823c0a/slides/img/flashettes/2017-12-01 (2).png -------------------------------------------------------------------------------- /slides/img/flashettes/2017-12-01 (3).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nicoptere/GROW/e5982d590440caca5a2ace64ca449ec719823c0a/slides/img/flashettes/2017-12-01 (3).png -------------------------------------------------------------------------------- /slides/img/flashettes/2017-12-01 (4).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nicoptere/GROW/e5982d590440caca5a2ace64ca449ec719823c0a/slides/img/flashettes/2017-12-01 (4).png -------------------------------------------------------------------------------- /slides/img/flashettes/2017-12-01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nicoptere/GROW/e5982d590440caca5a2ace64ca449ec719823c0a/slides/img/flashettes/2017-12-01.png -------------------------------------------------------------------------------- /slides/img/flashettes/flashette.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nicoptere/GROW/e5982d590440caca5a2ace64ca449ec719823c0a/slides/img/flashettes/flashette.psd -------------------------------------------------------------------------------- /slides/img/flashettes/liste.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nicoptere/GROW/e5982d590440caca5a2ace64ca449ec719823c0a/slides/img/flashettes/liste.png -------------------------------------------------------------------------------- /slides/img/flashettes/selection.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nicoptere/GROW/e5982d590440caca5a2ace64ca449ec719823c0a/slides/img/flashettes/selection.png -------------------------------------------------------------------------------- /slides/lib/font/league-gothic/LICENSE: -------------------------------------------------------------------------------- 1 | SIL Open Font License (OFL) 2 | http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL 3 | -------------------------------------------------------------------------------- /slides/lib/font/league-gothic/league-gothic.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'League Gothic'; 3 | src: url('league-gothic.eot'); 4 | src: url('league-gothic.eot?#iefix') format('embedded-opentype'), 5 | url('league-gothic.woff') format('woff'), 6 | url('league-gothic.ttf') format('truetype'); 7 | 8 | font-weight: normal; 9 | font-style: normal; 10 | } -------------------------------------------------------------------------------- /slides/lib/font/league-gothic/league-gothic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nicoptere/GROW/e5982d590440caca5a2ace64ca449ec719823c0a/slides/lib/font/league-gothic/league-gothic.eot -------------------------------------------------------------------------------- /slides/lib/font/league-gothic/league-gothic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nicoptere/GROW/e5982d590440caca5a2ace64ca449ec719823c0a/slides/lib/font/league-gothic/league-gothic.ttf -------------------------------------------------------------------------------- /slides/lib/font/league-gothic/league-gothic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nicoptere/GROW/e5982d590440caca5a2ace64ca449ec719823c0a/slides/lib/font/league-gothic/league-gothic.woff -------------------------------------------------------------------------------- /slides/lib/font/source-sans-pro/source-sans-pro-italic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nicoptere/GROW/e5982d590440caca5a2ace64ca449ec719823c0a/slides/lib/font/source-sans-pro/source-sans-pro-italic.eot -------------------------------------------------------------------------------- /slides/lib/font/source-sans-pro/source-sans-pro-italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nicoptere/GROW/e5982d590440caca5a2ace64ca449ec719823c0a/slides/lib/font/source-sans-pro/source-sans-pro-italic.ttf -------------------------------------------------------------------------------- /slides/lib/font/source-sans-pro/source-sans-pro-italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nicoptere/GROW/e5982d590440caca5a2ace64ca449ec719823c0a/slides/lib/font/source-sans-pro/source-sans-pro-italic.woff -------------------------------------------------------------------------------- /slides/lib/font/source-sans-pro/source-sans-pro-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nicoptere/GROW/e5982d590440caca5a2ace64ca449ec719823c0a/slides/lib/font/source-sans-pro/source-sans-pro-regular.eot -------------------------------------------------------------------------------- /slides/lib/font/source-sans-pro/source-sans-pro-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nicoptere/GROW/e5982d590440caca5a2ace64ca449ec719823c0a/slides/lib/font/source-sans-pro/source-sans-pro-regular.ttf -------------------------------------------------------------------------------- /slides/lib/font/source-sans-pro/source-sans-pro-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nicoptere/GROW/e5982d590440caca5a2ace64ca449ec719823c0a/slides/lib/font/source-sans-pro/source-sans-pro-regular.woff -------------------------------------------------------------------------------- /slides/lib/font/source-sans-pro/source-sans-pro-semibold.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nicoptere/GROW/e5982d590440caca5a2ace64ca449ec719823c0a/slides/lib/font/source-sans-pro/source-sans-pro-semibold.eot -------------------------------------------------------------------------------- /slides/lib/font/source-sans-pro/source-sans-pro-semibold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nicoptere/GROW/e5982d590440caca5a2ace64ca449ec719823c0a/slides/lib/font/source-sans-pro/source-sans-pro-semibold.ttf -------------------------------------------------------------------------------- /slides/lib/font/source-sans-pro/source-sans-pro-semibold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nicoptere/GROW/e5982d590440caca5a2ace64ca449ec719823c0a/slides/lib/font/source-sans-pro/source-sans-pro-semibold.woff -------------------------------------------------------------------------------- /slides/lib/font/source-sans-pro/source-sans-pro-semibolditalic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nicoptere/GROW/e5982d590440caca5a2ace64ca449ec719823c0a/slides/lib/font/source-sans-pro/source-sans-pro-semibolditalic.eot -------------------------------------------------------------------------------- /slides/lib/font/source-sans-pro/source-sans-pro-semibolditalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nicoptere/GROW/e5982d590440caca5a2ace64ca449ec719823c0a/slides/lib/font/source-sans-pro/source-sans-pro-semibolditalic.ttf -------------------------------------------------------------------------------- /slides/lib/font/source-sans-pro/source-sans-pro-semibolditalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nicoptere/GROW/e5982d590440caca5a2ace64ca449ec719823c0a/slides/lib/font/source-sans-pro/source-sans-pro-semibolditalic.woff -------------------------------------------------------------------------------- /slides/lib/font/source-sans-pro/source-sans-pro.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Source Sans Pro'; 3 | src: url('source-sans-pro-regular.eot'); 4 | src: url('source-sans-pro-regular.eot?#iefix') format('embedded-opentype'), 5 | url('source-sans-pro-regular.woff') format('woff'), 6 | url('source-sans-pro-regular.ttf') format('truetype'); 7 | font-weight: normal; 8 | font-style: normal; 9 | } 10 | 11 | @font-face { 12 | font-family: 'Source Sans Pro'; 13 | src: url('source-sans-pro-italic.eot'); 14 | src: url('source-sans-pro-italic.eot?#iefix') format('embedded-opentype'), 15 | url('source-sans-pro-italic.woff') format('woff'), 16 | url('source-sans-pro-italic.ttf') format('truetype'); 17 | font-weight: normal; 18 | font-style: italic; 19 | } 20 | 21 | @font-face { 22 | font-family: 'Source Sans Pro'; 23 | src: url('source-sans-pro-semibold.eot'); 24 | src: url('source-sans-pro-semibold.eot?#iefix') format('embedded-opentype'), 25 | url('source-sans-pro-semibold.woff') format('woff'), 26 | url('source-sans-pro-semibold.ttf') format('truetype'); 27 | font-weight: 600; 28 | font-style: normal; 29 | } 30 | 31 | @font-face { 32 | font-family: 'Source Sans Pro'; 33 | src: url('source-sans-pro-semibolditalic.eot'); 34 | src: url('source-sans-pro-semibolditalic.eot?#iefix') format('embedded-opentype'), 35 | url('source-sans-pro-semibolditalic.woff') format('woff'), 36 | url('source-sans-pro-semibolditalic.ttf') format('truetype'); 37 | font-weight: 600; 38 | font-style: italic; 39 | } -------------------------------------------------------------------------------- /sources/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 nicolas barradeau 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /sources/csv/extras.csv: -------------------------------------------------------------------------------- 1 | "N° de commande","Prénom","Nom","E-mail","Quantité","Type de billet","Ville de facturation","État de facturation","Code postal de facturation","Pays de facturation" 2 | ,"Marine","Serre",,1,"extra",,,, 3 | ,"Alexandre","Fine",,1,"extra",,,, 4 | ,"Guillaume ","Morisseau",,1,"extra",,,, 5 | ,"Jonas","Deprund",,1,"extra",,,, 6 | ,"Romain","NIENAJADLO",,1,"extra",,,, 7 | ,"Yiching","Lin",,1,"extra",,,, -------------------------------------------------------------------------------- /sources/csv/intervenants_plus_one.csv: -------------------------------------------------------------------------------- 1 | "N° de commande","Prénom","Nom","E-mail","Quantité","Type de billet","Ville de facturation","État de facturation","Code postal de facturation","Pays de facturation" 2 | ,"David","Ronai",,1,"speaker",,,, 3 | ,"Efflam","Daniel",,1,"speaker",,,, 4 | ,"Florian","Zumbrunn",,1,"speaker",,,, 5 | ,"Arnaud","Nicolas",,1,"extra",,,, 6 | ,"Nicolas ","Barradeau",,1,"speaker",,,, 7 | ,"Anne","Rouquette",,1,"extra",,,, 8 | ,"Antoine","Ménard",,1,"speaker",,,, 9 | ,"Emilien","François",,1,"extra",,,, 10 | ,"Gil","Polguère",,1,"speaker",,,, 11 | ,"Maxime","Montegnies",,1,"speaker",,,, 12 | ,"Grégoire","Divaret-Chauveau",,1,"speaker",,,, 13 | ,"Nicolas ","Riciotti",,1,"speaker",,,, 14 | ,"Servane","Durand",,1,"extra",,,, 15 | ,"Léon","Denise",,1,"speaker",,,, 16 | ,"William","Mapan",,1,"speaker",,,, 17 | ,"Julie","Schadt",,1,"extra",,,, 18 | ,"christophe","massolin",,1,"speaker",,,, 19 | ,"florentin","monteil",,1,"speaker",,,, -------------------------------------------------------------------------------- /sources/csv/new_kids.csv: -------------------------------------------------------------------------------- 1 | "N° de commande","Prénom","Nom","E-mail","Quantité","Type de billet","Ville de facturation","État de facturation","Code postal de facturation","Pays de facturation" 2 | ,"Fred ","Briolet",,1,"new kid",,,, 3 | ,"Charlie ","Le Maignan",,1,"new kid",,,, 4 | ,"Thomas ","Van Glabeke",,1,"new kid",,,, 5 | ,"Dorian ","Lods",,1,"new kid",,,, 6 | ,"Patrick ","Heng",,1,"new kid",,,, 7 | ,"Fabien ","Motte",,1,"new kid",,,, 8 | ,"Corentin"," Fardeau",,1,"new kid",,,, 9 | ,"Arnaud ","Juracek",,1,"new kid",,,, 10 | ,"Hugo ","Piquemal",,1,"new kid",,,, 11 | ,"Léo ","Ternoir",,1,"new kid",,,, 12 | ,"Antoine ","Puel",,1,"new kid",,,, -------------------------------------------------------------------------------- /sources/csv/sandbox.csv: -------------------------------------------------------------------------------- 1 | "N° de commande","Prénom","Nom","E-mail","Quantité","Type de billet","Ville de facturation","État de facturation","Code postal de facturation","Pays de facturation" 2 | ,"Julien","Espagnon",,1,"sandbox",,,, 3 | ,"Arnaud","Pinot",,1,"sandbox",,,, 4 | ,"","",,1,"sandbox","Geoffrey Legenty",,, 5 | ,"","",,1,"sandbox","Florent Chau",,, 6 | ,"","",,1,"sandbox","Bettina Comte",,, 7 | ,"","",,1,"sandbox","Elise Wojnarowski",,, -------------------------------------------------------------------------------- /sources/csv/staff.csv: -------------------------------------------------------------------------------- 1 | "N° de commande","Prénom","Nom","E-mail","Quantité","Type de billet","Ville de facturation","État de facturation","Code postal de facturation","Pays de facturation" 2 | ,"Damien ","Cahen",,1,"staff",,,, 3 | ,"Baptiste ","Fluzin",,1,"staff",,,, 4 | ,"Clément","Bardon",,1,"staff",,,, 5 | ,"Samy ","Berhouni",,1,"staff",,,, 6 | ,"Sophie ","Koch",,1,"staff",,,, 7 | ,"Edouard","Ducos",,1,"staff",,,, 8 | ,"Guilhem","Bertrand",,1,"staff",,,, 9 | ,"Nicolas","Vanbremeersch",,1,"staff",,,, 10 | ,"Nicolas","Vanbremeersch",,1,"staff",,,, 11 | ,"Maud","Rambaud",,1,"staff",,,, -------------------------------------------------------------------------------- /sources/main.js: -------------------------------------------------------------------------------- 1 | var Canvas = require('canvas') 2 | , Image = Canvas.Image 3 | , canvas = new Canvas(200, 200) 4 | , ctx = canvas.getContext('2d'); 5 | 6 | ctx.font = '30px Impact'; 7 | ctx.rotate(.1); 8 | ctx.fillText("Awesome!", 50, 100); 9 | 10 | var te = ctx.measureText('Awesome!'); 11 | ctx.strokeStyle = 'rgba(0,0,0,0.5)'; 12 | ctx.beginPath(); 13 | ctx.lineTo(50, 102); 14 | ctx.lineTo(50 + te.width, 102); 15 | ctx.stroke(); 16 | 17 | // console.log(''); 18 | 19 | var fs = require('fs') 20 | , out = fs.createWriteStream(__dirname + '/text.png') 21 | , stream = canvas.pngStream(); 22 | 23 | stream.on('data', function(chunk){ 24 | out.write(chunk); 25 | }); 26 | stream.on('end', function(){ 27 | console.log('saved png', __dirname); 28 | }); -------------------------------------------------------------------------------- /sources/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "grow17", 3 | "version": "0.0.1", 4 | "dependencies": { 5 | "canvas" : "^1.6.7" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /sources/parser.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | parser 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /sources/text.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nicoptere/GROW/e5982d590440caca5a2ace64ca449ec719823c0a/sources/text.png -------------------------------------------------------------------------------- /utils/CatmullRom.js: -------------------------------------------------------------------------------- 1 | 2 | 3 | var CatmullRom = function( precision, from, to ) { 4 | this.precision = precision || 0.1; 5 | this.from = from || 0; 6 | this.to = to || 1; 7 | 8 | this.getPointAt = function( t, points, p ){ 9 | if ( points === undefined ) return null; 10 | if( p === undefined ) p = {x:0,y:0}; 11 | var i = Math.floor( points.length * t ); 12 | var delta = 1 / points.length; 13 | t = ( t - ( i * delta ) ) / delta; 14 | p0 = points [ Math.max( 0,(i - 1) ) ]; 15 | p1 = points [ i ]; 16 | p2 = points [ Math.min( i + 1, points.length -1 ) ]; 17 | p3 = points [ Math.min( i + 2, points.length -1 ) ]; 18 | p.x = 0.5 * ((2 * p1.x) + t * (( -p0.x + p2.x) + t * ((2 * p0.x - 5 * p1.x + 4 * p2.x - p3.x) + t * ( -p0.x + 3 * p1.x - 3 * p2.x + p3.x)))); 19 | p.y = 0.5 * ((2 * p1.y) + t * (( -p0.y + p2.y) + t * ((2 * p0.y - 5 * p1.y + 4 * p2.y - p3.y) + t * ( -p0.y + 3 * p1.y - 3 * p2.y + p3.y)))); 20 | return p; 21 | }; 22 | this.compute = function( points, from, to, target ){ 23 | from = this.from || from || 0; 24 | to = this.to || to || 1; 25 | if( target === undefined ) target = []; 26 | 27 | var t = Math.min( from, to ); 28 | var max = Math.max( from, to ); 29 | var increment = precision / points.length; 30 | while ( t < max-( increment/precision )+ increment ) { 31 | target.push( this.getPointAt( t, points ) ); 32 | t += increment; 33 | } 34 | return target; 35 | }; 36 | }; 37 | -------------------------------------------------------------------------------- /utils/CubicPath.js: -------------------------------------------------------------------------------- 1 | var CubicPath = function( anchors, precision, loop ) 2 | { 3 | 4 | this.compute = function( anchors, precision, loop ) 5 | { 6 | 7 | var i, t; 8 | 9 | this.anchors = anchors; 10 | 11 | precision = Math.max( .01, Math.min( 1, precision ) ); 12 | 13 | this.loop = loop; 14 | this.vertices = []; 15 | for ( i = 0; i < anchors.length; i++ ) 16 | { 17 | 18 | for ( t = 0; t < 1; t+= precision ) 19 | { 20 | 21 | this.vertices.push( this.computePointAt( i, t ) ); 22 | 23 | } 24 | 25 | } 26 | return this.vertices; 27 | 28 | }; 29 | 30 | this.computePointAt = function( i, t ) 31 | { 32 | 33 | var p0 = CubicPath.p0 || ( CubicPath.p0 = new Point() ), 34 | p1 = this.anchors[ i ], 35 | p2 = CubicPath.p2 || ( CubicPath.p2 = new Point() ); 36 | 37 | if( i == 0 ) 38 | { 39 | 40 | if ( this.loop == true ) 41 | { 42 | 43 | p0.x = ( this.anchors[ this.anchors.length-1 ].x + this.anchors[ i ].x ) / 2; 44 | p0.y = ( this.anchors[ this.anchors.length-1 ].y + this.anchors[ i ].y ) / 2; 45 | p0.z = ( this.anchors[ this.anchors.length-1 ].z + this.anchors[ i ].z ) / 2; 46 | 47 | }else{ 48 | 49 | p0 = this.anchors[ i ]; 50 | } 51 | 52 | } 53 | else 54 | { 55 | 56 | p0.x = ( this.anchors[ i - 1 ].x + this.anchors[ i ].x ) / 2; 57 | p0.y = ( this.anchors[ i - 1 ].y + this.anchors[ i ].y ) / 2; 58 | p0.z = ( this.anchors[ i - 1 ].z + this.anchors[ i ].z ) / 2; 59 | 60 | } 61 | 62 | 63 | if( i == this.anchors.length - 1 ) 64 | { 65 | 66 | if (loop == true) 67 | { 68 | 69 | p2.x=( this.anchors[ i ].x + this.anchors[0].x ) / 2; 70 | p2.y=( this.anchors[ i ].y + this.anchors[0].y ) / 2; 71 | p2.z=( this.anchors[ i ].z + this.anchors[0].z ) / 2; 72 | 73 | } 74 | else 75 | { 76 | 77 | p2 = this.anchors[ i ]; 78 | } 79 | 80 | } 81 | else 82 | { 83 | 84 | p2.x = ( this.anchors[ i + 1 ].x + this.anchors[ i ].x ) / 2; 85 | p2.y = ( this.anchors[ i + 1 ].y + this.anchors[ i ].y ) / 2; 86 | p2.z = ( this.anchors[ i + 1 ].z + this.anchors[ i ].z ) / 2; 87 | 88 | } 89 | 90 | 91 | var t1 = 1 - t; 92 | var t2 = t1 * t1; 93 | var t3 = 2 * t * t1; 94 | var t4 = t * t; 95 | 96 | return new Point( t2 * p0.x + t3 * p1.x + t4 * p2.x, 97 | t2 * p0.y + t3 * p1.y + t4 * p2.y ); 98 | 99 | 100 | }; 101 | 102 | this.getPositionAt = function( t ) 103 | { 104 | 105 | var length = this.anchors.length; 106 | var i0 = Math.floor( length * t ); 107 | i0 = i0 < length - 1 ? i0 : length - 1; 108 | var delta = 1 / length; 109 | return this.computePointAt( i0, ( t - ( i0 * delta ) ) / delta ); 110 | 111 | }; 112 | 113 | if( anchors != null ) 114 | { 115 | this.compute( anchors , precision || .1, loop || false ); 116 | } 117 | 118 | }; -------------------------------------------------------------------------------- /utils/D3.js: -------------------------------------------------------------------------------- 1 | var D3 = function( exports){ 2 | var projection; 3 | exports.focalDistance = 250; 4 | exports.project = function(v) { 5 | 6 | if( projection === undefined )projection = new Point(); 7 | // Distance between the camera and the plane 8 | var d = exports.focalDistance || 200; 9 | var r = d / v.z; 10 | projection.x = r * v.x; 11 | projection.y = r * v.y; 12 | return projection; 13 | }; 14 | 15 | exports.render = function(objects, ctx ) { 16 | 17 | ctx.restore(); 18 | ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height ); 19 | 20 | ctx.save(); 21 | ctx.translate( ctx.canvas.width / 2, ctx.canvas.height / 2 ); 22 | 23 | // For each object 24 | var v = new Point(), P; 25 | for (var i = 0; i < objects.length; i++ ){ 26 | 27 | var m = objects[i]; 28 | var vs = m.vertices; 29 | // render Ngon 30 | ctx.beginPath(); 31 | 32 | for ( var j = 0; j < m.indices.length; j+= m.indicesPerNGon ) { 33 | 34 | for (var k = 0; k < m.indicesPerNGon; k++ ) { 35 | 36 | var index = m.indices[ j + k ]; 37 | v.copy( vs[ index ] ) .add( m.position ); 38 | P = exports.project( v ); 39 | if( k === 0 ) { 40 | ctx.moveTo( P.x, -P.y ); 41 | }else{ 42 | ctx.lineTo( P.x, -P.y ); 43 | } 44 | 45 | } 46 | 47 | } 48 | 49 | ctx.closePath(); 50 | // ctx.globalAlpha = 1; 51 | ctx.stroke(); 52 | // ctx.globalAlpha = .25; 53 | // ctx.fill(); 54 | 55 | } 56 | }; 57 | 58 | // Rotate a vertice 59 | exports.getRotation = function(x,y) { 60 | 61 | var theta = (evt.clientX - mx) * Math.PI / 360; 62 | var phi = (evt.clientY - my) * Math.PI / 180; 63 | 64 | // for (var i = 0; i < 8; ++i) 65 | // rotate(cube.vertices[i], cube_center, theta, phi); 66 | }; 67 | 68 | exports.rotate = function( mesh, theta, phi ) { 69 | 70 | // Rotation matrix coefficients 71 | var ct = Math.cos(theta); 72 | var st = Math.sin(theta); 73 | var cp = Math.cos(phi); 74 | var sp = Math.sin(phi); 75 | 76 | // Rotation 77 | m.vertices.forEach( function( v ){ 78 | var x = v.x - mesh.position.x; 79 | var y = v.y - mesh.position.y; 80 | var z = v.z - mesh.position.z; 81 | 82 | v.x = ct * x - st * cp * y + st * sp * z + mesh.position.x; 83 | v.y = st * x + ct * cp * y - ct * sp * z + mesh.position.y; 84 | v.z = sp * y + cp * z + mesh.position.z; 85 | }); 86 | }; 87 | 88 | return exports; 89 | 90 | }({}); -------------------------------------------------------------------------------- /utils/PRNG.js: -------------------------------------------------------------------------------- 1 | var PRNG = 2 | { 3 | 4 | a : 16807, /* multiplier */ 5 | m : 0x7FFFFFFF, /* 2**31 - 1 */ 6 | randomnum : 1, 7 | div : ( 1 / 0x7FFFFFFF ), 8 | 9 | nextlongrand : function( seed ) 10 | { 11 | 12 | var lo, 13 | hi; 14 | 15 | lo = this.a * ( seed & 0xFFFF ); 16 | hi = this.a * ( seed >> 16 ); 17 | lo += ( hi & 0x7FFF ) << 16; 18 | 19 | if (lo > this.m) 20 | { 21 | lo &= this.m; 22 | ++lo; 23 | } 24 | 25 | lo += hi >> 15; 26 | if (lo > this.m) 27 | { 28 | lo &= this.m; 29 | ++lo; 30 | } 31 | 32 | return lo; 33 | 34 | }, 35 | 36 | random : function ()/* return next random number */ 37 | { 38 | 39 | this.randomnum = this.nextlongrand( this.randomnum ); 40 | return this.randomnum * this.div; 41 | 42 | }, 43 | 44 | setSeed : function( value ) 45 | { 46 | 47 | this.randomnum = ( value <= 0 ) ? 1 : value; 48 | 49 | }, 50 | 51 | pseudoRandom : function(x, y) { 52 | // return PRNG.random(); 53 | return ( ( Math.sin( x * 12.9898 + y * 78.233) ) * 43758.5453123 ) % 1; 54 | }, 55 | 56 | noise : function (x, y) { 57 | 58 | //gets the integer part 59 | var ix = parseInt(x); 60 | var iy = parseInt(y); 61 | 62 | // 2D cell corners 63 | var a = PRNG.pseudoRandom(ix,iy); 64 | var b = PRNG.pseudoRandom(ix+1, iy); 65 | var c = PRNG.pseudoRandom(ix, iy+1); 66 | var d = PRNG.pseudoRandom(ix+1, iy+1); 67 | 68 | //gets the fractional part 69 | var fx = (x % 1); 70 | var fy = (y % 1); 71 | var ux = fx * fx * (3.0 - 2.0 * fx); 72 | var uy = fy * fy * (3.0 - 2.0 * fy); 73 | 74 | //interpolate the 4 noises with fractional parts 75 | return (a * (1-ux) + b * ux) + (c - a) * uy * (1-ux) + (d - b) * ux * uy; 76 | 77 | }, 78 | 79 | FBM : function ( x, y, octaves ){ 80 | 81 | return noise.FBM( x,y, octaves ); 82 | 83 | }, 84 | centralDifference : function ( x, y, scale, octaves ) { 85 | 86 | var x0 = PRNG.FBM( (x+1) * scale, y * scale, octaves ); 87 | var x1 = PRNG.FBM( (x-1) * scale, y * scale, octaves ); 88 | var y0 = PRNG.FBM( x * scale, ( y + 1 ) * scale, octaves ); 89 | var y1 = PRNG.FBM( x * scale, ( y - 1 ) * scale, octaves ); 90 | 91 | return [ ( x0-x1 ), ( y0-y1 ) ]; 92 | }, 93 | 94 | centralDifference_legacy : function ( x, y, scale, octaves ) { 95 | 96 | var x0 = PRNG.FBM_legacy( (x+1) * scale, y * scale, octaves ); 97 | var x1 = PRNG.FBM_legacy( (x-1) * scale, y * scale, octaves ); 98 | var y0 = PRNG.FBM_legacy( x * scale, ( y + 1 ) * scale, octaves ); 99 | var y1 = PRNG.FBM_legacy( x * scale, ( y - 1 ) * scale, octaves ); 100 | 101 | return [ ( x0-x1 ), ( y0-y1 ) ]; 102 | }, 103 | 104 | FBM_legacy : function ( x, y, octaves ) { 105 | 106 | var value = 0; 107 | var OCTAVES = octaves || 6; 108 | var amplitude = 1; 109 | for (var i = 0; i < OCTAVES; i++) { 110 | value += amplitude * PRNG.noise(x, y); 111 | x *= 2.; 112 | y *= 2.; 113 | amplitude *= .5; 114 | } 115 | return value; 116 | } 117 | 118 | 119 | }; -------------------------------------------------------------------------------- /utils/Point.js: -------------------------------------------------------------------------------- 1 | 2 | var Point = function (x, y, z) { 3 | this.x = x || 0; 4 | this.y = y || 0; 5 | this.z = z || 0; 6 | return this; 7 | }; 8 | Point.prototype = { 9 | add : function(p){ 10 | this.x += p.x; 11 | this.y += p.y; 12 | this.z += p.z; 13 | return this; 14 | }, 15 | sub : function(p){ 16 | this.x -= p.x; 17 | this.y -= p.y; 18 | this.z -= p.z; 19 | return this; 20 | }, 21 | 22 | cross : function(a,b){ 23 | if( b === null )a = this; 24 | var p = new Point(); 25 | p.x = a.y * b.z - a.z * b.y; 26 | p.y = a.z * b.x - a.x * b.z; 27 | p.z = a.x * b.y - a.y * b.x; 28 | return p; 29 | }, 30 | 31 | clone : function(){ 32 | return new Point(this.x, this.y, this.z); 33 | }, 34 | copy : function(p){ 35 | this.x = p.x; 36 | this.y = p.y; 37 | this.z = p.z; 38 | return this; 39 | }, 40 | set : function(x,y,z){ 41 | this.x = x; 42 | this.y = y; 43 | this.z = z||0; 44 | return this; 45 | }, 46 | length : function(){ 47 | return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z ); 48 | }, 49 | normalize : function( value ){ 50 | var l = this.length(); 51 | this.x/=l; 52 | this.y/=l; 53 | this.z/=l; 54 | if( value != null )this.multiplyScalar(value); 55 | return this; 56 | }, 57 | multiplyScalar : function( value ){ 58 | this.x*= value; 59 | this.y*= value; 60 | this.z*= value; 61 | return this; 62 | }, 63 | direction : function( other ){ 64 | return other.clone().sub(this).normalize(); 65 | }, 66 | negate : function(){ 67 | this.x *= -1;this.y *= -1;this.z *= -1;return this; 68 | }, 69 | dot : function ( p ){ 70 | return this.x * p.x + this.y * p.y + this.z * p.z; 71 | }, 72 | equals:function(other){ 73 | return this.x == other.x && this.y == other.y && this.z == other.z; 74 | }, 75 | midpoint:function(other){ 76 | return new Point( (this.x + other.x) / 2, (this.y + other.y) / 2, (this.z + other.z) / 2); 77 | }, 78 | pointAt:function( t, other){ 79 | return new Point( 80 | lerp( t, this.x , other.x), 81 | lerp( t, this.y , other.y), 82 | lerp( t, this.z , other.z) 83 | ); 84 | }, 85 | 86 | sphericalCoords : function( theta, phi, radius ) { 87 | radius = radius || 1; 88 | this.x = radius * Math.sin(phi) * Math.sin(theta); 89 | this.y = radius * Math.cos(phi); 90 | this.z = radius * Math.sin(phi) * Math.cos(theta); 91 | return this; 92 | }, 93 | 94 | toLonLat : function(){ 95 | 96 | var v = this.clone(); 97 | v.normalize(); 98 | var lng = -( Math.atan2( -v.z, -v.x ) ) - Math.PI / 2; 99 | if( lng < - Math.PI )lng += Math.PI * 2; 100 | var p = new Point( v.x, 0, v.z ); 101 | p.normalize(); 102 | var lat = Math.acos( p.dot( v ) ); 103 | if( v.y < 0 ) lat *= -1; 104 | return [ lng,lat ]; 105 | } 106 | 107 | }; 108 | function getAngle(a,b) { 109 | var dx = b.x - a.x; 110 | var dy = b.y - a.y; 111 | return Math.atan2(dy, dx); 112 | } 113 | function cross(a,b){ 114 | var p = new Point(); 115 | p.x = a.y * b.z - a.z * b.y; 116 | p.y = a.z * b.x - a.x * b.z; 117 | p.z = a.x * b.y - a.y * b.x; 118 | return p; 119 | } 120 | function getDistance(a,b) { 121 | var dx = a.x - b.x; 122 | var dy = a.y - b.y; 123 | var dz = a.z - b.z; 124 | return Math.sqrt(dx*dx + dy*dy+ dz*dz); 125 | } 126 | 127 | function pointAtAngleRadius( angle, radius ) 128 | { 129 | return new Point( Math.cos( angle ) * radius, Math.sin( angle ) * radius ); 130 | } 131 | 132 | function midPoint( p0, p1 ) 133 | { 134 | return new Point(p0.x + ( p1.x-p0.x) *.5, p0.y + ( p1.y-p0.y) *.5 ); 135 | } 136 | 137 | function length( p ){ 138 | return Math.sqrt( ( p.x * p.x ) + ( p.y * p.y ) ); 139 | } 140 | -------------------------------------------------------------------------------- /utils/distributions.js: -------------------------------------------------------------------------------- 1 | var distribution = function(exports){ 2 | 3 | exports.sphereUniform = function(howMany, radius) { 4 | var vectors = []; 5 | 6 | var inc = Math.PI * (3 - Math.sqrt(5)); 7 | 8 | var x = 0; 9 | var y = 0; 10 | var z = 0; 11 | var r = 0; 12 | var phi = 0; 13 | 14 | for (var k = 0; k < howMany; k++) { 15 | var off = 2 / howMany; 16 | var vec3 = new Point(); 17 | 18 | y = k * off - 1 + off / 2; 19 | r = Math.sqrt(1 - y * y); 20 | 21 | phi = k * inc; 22 | 23 | x = Math.cos(phi) * r; 24 | 25 | z = (0, Math.sin(phi) * r); 26 | 27 | x *= radius; 28 | y *= radius; 29 | z *= radius; 30 | 31 | vec3.x = x; 32 | vec3.y = y; 33 | vec3.z = z; 34 | 35 | vectors.push(vec3); 36 | } 37 | 38 | return vectors; 39 | }; 40 | 41 | return exports; 42 | }({}); 43 | --------------------------------------------------------------------------------