网络编程
位置:首页>> 网络编程>> JavaScript>> Bresenham图形算法JavaScript版本

Bresenham图形算法JavaScript版本

作者:dh20156 来源:w3cgroup 发布时间:2010-01-25 12:09:00 

标签:算法,圆,椭圆,JavaScript

/*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);
};

 

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com