Math.dotProduct2=function(ax,ay,bx,by){return ax*bx+ay*by;}
function FlockController(canvas,options){var defaults={alignmentPriority:2,cohesionPriority:1,frameRate:34,maxRotation:30*Math.PI/180,minSpeed:3,maxSpeed:5,numBoids:30,rotationSpeed:0.1,separationDistance:35,separationPriority:3,targetPriority:3,visualField:Math.PI*270/180,visualRange:50,};var boids=new Array();var cosVisualFieldDiv2;var redrawInterval;var settings={};var targetX=440;var targetY=200;var imgwidth=30;var imgheight=15;var timer;var visualRangeSqr;var img=new Image();img.src='data:image/png;base64,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';var img3=new Image();img3.src='data:image/png;base64,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';if(!canvas.getContext)
throw new Error('Canvas is not supported by your browser.');var ctx=canvas.getContext('2d');var drawBoid=function(boid){ctx.drawImage(img,boid.x,boid.y,imgwidth,imgheight);}
var getVisualStats=function(boid){var stats={x:0,y:0,vx:0,vy:0,closestDistance:999999999};var count=0;for(var i in boids){if(boids[i]==boid)
continue;var dx=boids[i].x-boid.x;var dy=boids[i].y-boid.y;var distance=Math.sqrt(dx*dx+dy*dy);if(distance<stats.closestDistance){stats.closestDistance=distance;stats.closestBoid=boids[i];}
var ndx=dx/distance;var ndy=dy/distance;var cosθ=Math.dotProduct2(Math.cos(boid.θ),Math.sin(boid.θ),ndx,ndy);if(dx*dx+dy*dy<=visualRangeSqr&&cosθ>=cosVisualFieldDiv2){stats.x+=boids[i].x;stats.y+=boids[i].y;stats.vx+=boids[i].vx;stats.vy+=boids[i].vy;stats.count++;}}
stats.x/=count;stats.y/=count;stats.θ=Math.atan2(stats.vy,stats.vx);return stats;}
this.animateFrame=function(){img1=new Image();img1.src="slogan.jpg";ctx.drawImage(img1,0,0,1024,500);ctx.drawImage(img3,targetX,targetY,180,91);for(var i in boids)
drawBoid(boids[i]);for(i in boids){var boid=boids[i];var avg=getVisualStats(boid);var tx=boid.vx;var ty=boid.vy;if(avg.closestBoid){var dx=avg.closestBoid.x-boid.x;var dy=avg.closestBoid.y-boid.y;if(avg.closestDistance<settings.separationDistance){tx-=dx/avg.closestDistance*settings.separationPriority;ty-=dy/avg.closestDistance*settings.separationPriority;}}
tx+=Math.cos(avg.θ)*settings.alignmentPriority;ty+=Math.sin(avg.θ)*settings.alignmentPriority;if(avg.count>0){var dx=avg.x-boid.x;var dy=avg.y-boid.y;var distance=Math.sqrt(dx*dx+dy*dy);var ndx=dx/distance;var ndy=dy/distance;tx+=ndx*settings.cohesionPriority;ty+=ndy*settings.cohesionPriority;}
var dx=targetX-boid.x;var dy=targetY-boid.y;var distance=Math.max(Math.sqrt(dx*dx+dy*dy),50);var ndx=dx/distance;var ndy=dy/distance;tx+=ndx*settings.targetPriority;ty+=ndy*settings.targetPriority;var tθ=Math.atan2(ty,tx);var cw=(tθ-boid.θ+Math.PI*4)%(Math.PI*2);var acw=(boid.θ-tθ+Math.PI*4)%(Math.PI*2);var rotation=Math.abs(cw)<Math.abs(acw)?cw:-acw;rotation*=settings.rotationSpeed;rotation=Math.min(Math.max(rotation,-settings.maxRotation),settings.maxRotation);boid.θ+=rotation;boid.updateVelocity();boid.updatePosition();}};this.setTarget=function(x,y){targetX=x;targetY=y;}
this.startAnimation=function(){timer=window.setInterval(this.animateFrame,redrawInterval);};this.stopAnimation=function(){window.clearInterval(timer);};this.updateOptions=function(options){$.extend(settings,options);var newRedrawInterval=1000/settings.frameRate;if(redrawInterval!=newRedrawInterval){if(timer)
this.stopAnimation();redrawInterval=newRedrawInterval;this.startAnimation();}
cosVisualFieldDiv2=Math.cos(settings.visualField/2);visualRangeSqr=settings.visualRange*settings.visualRange;while(boids.length<settings.numBoids)
boids.push(new Boid(Math.random()*canvas.width,Math.random()*canvas.height,Math.random()*Math.PI*2,settings.minSpeed+Math.random(settings.maxSpeed-settings.minSpeed)));while(boids.length>settings.numBoids)
boids.pop();};this.updateOptions(defaults);this.updateOptions(options);}
function Boid(x,y,θ,speed){this.x=x;this.y=y;this.θ=θ;this.speed=speed;this.updatePosition=function(){this.x+=this.vx*this.speed;this.y+=this.vy*this.speed;};this.updateVelocity=function(){this.vx=Math.cos(this.θ);this.vy=Math.sin(this.θ);};this.updateVelocity();}
