Bresenham图形算法JavaScript版本
作者:dh20156 来源:w3cgroup 时间:2010-01-25 12:09:00
/*Bresenham画圆算法*/
var arc = function(x0,y0,r){/*起点坐标x0,y0,半径*/
var p,x,y,i,ret = [];
p = 3-2*r,x = 0,y = r,i = r;
for(;x<=y;){
ret.push([x+i+x0,y+i+y0]);
ret.push([-x+i+x0,-y+i+y0]);
ret.push([-x+i+x0,y+i+y0]);
ret.push([x+i+x0,-y+i+y0]);
ret.push([y+i+x0,x+i+y0]);
ret.push([-y+i+x0,x+i+y0]);
ret.push([-y+i+x0,-x+i+y0]);
ret.push([y+i+x0,-x+i+y0]);
if(p<0){
p = p+4*x+6;
}else{
y--,p = p+4*(x-y)+10;
}
x++;
}
return ret.slice(0);
};
/*Bresenham画椭圆算法*/
var ellipse = function(px,py,rx,ry){/*起点坐标px,py,x轴半径rx,y轴半径ry*/
px = px+rx,py = py+ry;
var x = 0,y = ry,rx2 = rx*rx,ry2 = ry*ry,ret = [];
var dx = ry2/Math.sqrt(ry2+rx2),p = ry2-rx2*ry;
while(dx<=y){
ret.push([px+x,py+y]);
ret.push([px+x,py-y]);
ret.push([px-x,py+y]);
ret.push([px-x,py-y]);
if(p<=0){
++x;
}else{
++x,--y;
}
p = ry2*(x+1)*(x+1)+rx2*(y*y-y)-rx2*ry2;
}
p = ry2*(x*x+x)+rx2*(y*y-y)-rx2*ry2;
while(y>0){
ret.push([px+x,py+y]);
ret.push([px+x,py-y]);
ret.push([px-x,py+y]);
ret.push([px-x,py-y]);
if(p>=0){
--y,p = p-2*rx2*y-rx2;
}else{
--y,++x,p = p-2*rx2*y-rx2+2*ry2*x+2*ry2;
}
}
ret.push([px+x,py]);
ret.push([px-x,py]);
return ret.slice(0);
};
/*Bresenham画直线算法*/
var line = function(x1,y1,x2,y2){/*起点坐标x1,y1,终点坐标x2,y2*/
var dx,dy,h,x,y,t,ret = [];
if(x1>x2){x1 = [x2,x2=x1][0],y1 = [y2,y2=y1][0];}
dx = x2-x1,dy = y2-y1,x = x1,y = y1;
if(!dx){
t = (y1>y2)?-1:1;
while(y!=y2){ret.push([x,y]);y += t;}
return ret.slice(0);
}
if(!dy){
while(x!=x2){ret.push([x,y]);x++;}
return ret.slice(0);
}
if(dy>0){
if(dy<=dx){
h = 2*dy-dx,ret.push([x,y]);
while(x!=x2){
if(h<0){
h += 2*dy;
}else{
y++,h += 2*(dy-dx);
}
x++,ret.push([x,y]);
}
}else{
h = 2*dx-dy,ret.push([x,y]);
while(y!=y2){
if(h<0){
h += 2*dx;
}else{
++x,h += 2*(dx-dy);
}
y++,ret.push([x,y]);
}
}
}else{
t = -dy;
if(t<=dx){
h = 2*dy+dx,ret.push([x,y]);
while(x!=x2){
if(h<0){
h += 2*(dy+dx),y--;
}else{
h += 2*dy;
}
x++,ret.push([x,y]);
}
}else{
dy = -dy,dx = -dx,y = y2,x = x2,ret.push([x,y]),h = 2*dx+dy;
while(y!=y1){
if(h<0){
h += 2*(dx+dy),x--;
}else{
h += 2*dx;
}
y++,ret.push([x,y]);
}
}
}
return ret.slice(0);
};