optimizes horizontalLine

This commit is contained in:
Francisco Dans 2015-02-25 18:01:38 +01:00
parent 7f72ae01af
commit 171a5b6e0c

View File

@ -15,26 +15,28 @@ function BallRenderer(thecanvas){
this.drawnTemp = {};
this.prof = 0;
this.gradient = {};
this.ballsSoFar = 0;
this.balls = 0;
this.cumulative = true;
}
BallRenderer.prototype = {
addBall: function(x0, y0){
var orad = this.radius;
var increment = this.map_range(1, 0, orad,0,255);
var x = this.radius;
var y = 0;
var radiusError = 1 - x;
while (x >= y){
// Try not to touch the following, it's a pain in the ass to write
this.horizontalLine(-x + x0, y + y0, x + x0, y + y0, x0,y0);
this.horizontalLine(-y + x0, -x + y0, y + x0, -x + y0, x0,y0);
this.horizontalLine(-x + x0, -y + y0, x + x0, -y + y0, x0,y0);
this.horizontalLine(-y + x0, x + y0, y + x0, x + y0, x0,y0);
y++;
this.horizontalLine(-x + x0, x + x0, y + y0, x0,y0);
this.horizontalLine(-y + x0, y + x0, -x + y0, x0,y0);
this.horizontalLine(-x + x0, x + x0, -y + y0, x0,y0);
this.horizontalLine(-y + x0, y + x0, x + y0, x0,y0);
++y;
if (radiusError<0){
radiusError += 2 * y + 1;
}
else{
x--;
--x;
radiusError += 2 * (y - x) + 1;
}
}
@ -44,18 +46,20 @@ BallRenderer.prototype = {
var indexPos = this.getRIndexPos(x, y);
this.pointLayer[indexPos + 3] = this.pointLayer[indexPos + 3] + alpha;
},
horizontalLine: function(xi, yi, xf, yf, x0, y0){
function lineDistance(x,y){
map_range: function(value, low1, high1, low2, high2) {
return low2 + (high2 - low2) * (value - low1) / (high1 - low1);
},
lineDistance: function(x,y,x0,y0){
var xs = Math.pow(x - x0, 2);
var ys = Math.pow(y - y0, 2);
return Math.sqrt( xs + ys );
}
},
horizontalLine: function(xi, xf, yi, x0, y0){
// Assumes xi is on the left and xf is on the right
if(typeof this.drawnTemp[yi] === "undefined"){
while (xi <= xf){
var alpha = this.map_range(lineDistance(xi, yi), 0, this.radius, 30, 0);
this.addPoint(xi, yi, alpha);
xi ++;
this.addPoint(xi, yi, 30 - ((30 * this.lineDistance(xi, yi,x0,y0)) / this.radius));
++xi;
}
this.drawnTemp[yi]=true;
}