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);
};
猜你喜欢
- asp函数实现把数字格式化为每3个数字时以逗号间隔的数字见下:<%Function Comma(str)If No
- 在Windows环境下,经常遇到系统Over的情况,如果你在新装了系统和SQL Server 2005后,需要把SQL Server2000
- 研究编码,得知GB2312编码与区位码的关系,尝试之后,得此程序。搜索,似乎没人写,故发此地。1.简述(1)GB2312标准的定义,其实就是
- 代码如下:function HTMLEncode(fString) fString=Replace(fString,&q
- 看到这篇文章的人,如果我没有估计错的话,八成是从事互联网的人,其中又有八成是做设计的。如果真是这样,可以一起庆幸一下。首先,庆幸从事着一个没
- 4个不常用HTML标签optgroup、sub、sup和bdo运行代码框:<title>4个不常用HTML标签optgroup、
- 前后端分离的开发模式,原本觉得没什么稀奇的玩艺,在最近参与的一个大型项目中,让我有了更深的理解。前后端分离的开发模式:系统分析阶段,系分和前
- 虽然说表单验证在客户端使用javascript来验证已经可以了,但是我们为了防止访客绕过客户端验证也为了数据安全最好还是在服务器端加上必要的
- 下面是一些有助于更有效地使用 SQL 事件探查器的提示和技巧。运行的跟踪过多如果 Microsoft? SQL Server? 实例运行得过
- Q. How can I restrict access to my SQL Server so that it only allows c
- 通过HTTP_USER_AGENT判断用户是从手机上访问,还是电脑IE上访问。 asp代码片段:主要使用了正则匹配手机环境,大家可以补充手机
- 传统来说,大家在CSS中使用的颜色要么是16进制格式,要么是rgb格式,就像rgb(171,205,239)。CSS3带来了一些新的处理颜色
- 关于SQL Server数据库的一切信息都保存在它的系统表格里。我怀疑你是否花过比较多的时间来检查系统表格,因为你总是忙于用户表格。但是,你
- [Q]怎么样查询特殊字符,如通配符%与_ [Q]如何插入单引号到数据库表中 [Q]怎样设置事务一致性 [Q]怎么样利用光标更新数据 [Q]怎
- 很简单的方法,但很实用。用过新浪邮箱的朋友应该会知道此脚本的效果。如果您提交的数据处理时间很长,用这个做为提示很不错的.将下面的代码复制到&
- 原文地址:http://ilovetypography.com/2007/10/22/so-you-want-to-create-a-fon
- 在网站或软件的策划和设计过程中,我们经常听到这样的讨论:“这个功能设计得太重了”又或“我们希望能够处理得轻一些”。似乎轻设计是时下炙手可热的
- 1.触发器概述触发器是SQL Server数据库应用中一个重要工具,是一种特殊类型的存储过程,应用非常广泛。一般存储过程主要通过存储过程名而
- 一般上电子商务网站买东西的用户分三种:随便看看,就是不买先看看,买不买再说就是来买东西的这样的需求反应到产品页的购买按钮上,我们一般会看到购
- ASPJPEG组件是Persits出品的共享软件,试用期为30天,您可以在这里下载:http://www.persits.com/aspjp