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);
};
猜你喜欢
- 下面,小编将通过一组实例演示,让大家更直观,更清楚明白的了解要设置中文这一内容的操作步骤。首先展示实例代码:import pygamefro
- 今天想说的是内容和容器的关系,顺便把之前设计中碰到的问题和大家一起探讨下。我们从软件的设置说起。(这里以QQ的设置举例)一个软件的设置(常称
- Django View官方文档一个视图函数(类),简称视图,是一个简单的 Python 函数(类),它接受Web请求并且返回Web响应。响应
- df.sort_index()实现按索引排序,默认以从小到大的升序方式排列,如希望按降序排列,传入ascending = Falseimpo
- 前言最近开始使用 robot framework 测试c++的动态库,robot framework 是跑在 windows 上面,c++动
- 摘要:现代网站和web应用程序趋向于依赖客户端的大量的javascript来提供丰富的交互。特别是通过不刷新页面的异步请求来返回数据或从服务
- 关于英文的写作有一本十分著名的书,The Elements of Style(风格要素),编写程序也有一本The Elements of P
- 前言日常使用python经常要对文本进行处理,无论是爬虫的数据解析,还是大数据的文本清洗,还是普通文件的处理,都是要用到字符串. Pytho
- 在python中我们可以使用openCV给图片添加水印,这里注意openCV无法添加汉字水印,添加汉字水印上可使用PIL库给图片添加水印一:
- 在vue-router控制前端权限是常见需求:有一种做法是直接在后端完成判断,提供页面列表和操作列表,在前端进行渲染,但这个方案并不优雅,前
- 本文实例分析了php中Ctype函数用法。分享给大家供大家参考。具体分析如下:Ctype函数是Php的Ctype扩展函数提供了一组函数用于校
- 单继承时super()和__init__()实现的功能是类似的class Base(object):def __init__(self):p
- 生产者消费者模型具体来讲,就是在一个系统中,存在生产者和消费者两种角色,他们通过内存缓冲区进行通信,生产者生产消费者需要的资料,消费者把资料
- 电脑安装git客户端、注册github账号并登陆到本地项目文件夹右键选择git bash here输入个人信息(代码提交者)git conf
- 学习前言最近在学目标检测……SSD的源码好复杂……看
- 一. Python 的类和实例在面向对象中,最重要的概念就是类(class)和实例(instance),类是抽象的模板,而实例是根据类创建出
- 用过jQuery的朋友一定对jQuery中方法的链式调用印象深刻,最近发布的YUI3也支持了方法的链式调用。这是一个非常不错的语法特性,能让
- 如果你已经理解了block formatting contexts那么请继续,否则请先看看这篇文章。Overflow能够做一些很牛掰的事情,
- python可以简单优美,也很有趣,下面是收集的例子:1.一句话开始一个http的文件服务器:$ python -m SimpleHTTPS
- 在日常的工作中,有时候会有这样的需求,需要一个常驻任务,持续的监听一个目录下文件的变化,对此作出回应.pyinotify就是这样的一个pyt