范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

圆生成算法

  圆是图形中经常使用的元素,大部分图形学库中都提供画圆的api,本文介绍不使用任何图形库直接使用TypeScript语言实现在浏览器中画圆的方法。概述
  html页面使用canvas元素进行绘制,TypeScript对canvas操作进行了简单的封装,这里主要用到设置单个像素点的颜色,代码如下
  app.tsclass WebGL {     canvas: HTMLCanvasElement;     ctx: CanvasRenderingContext2D;     // 构造函数     constructor(canvas: HTMLCanvasElement) {         this.canvas = canvas;         this.ctx = canvas.getContext("2d");             this.vertices = []         }     // 设置颜色值      glColor3f(r: number, g: number, b: number) {         this.ctx.fillStyle = "rgba(" + r*255 +  "," +  g*255 + "," +  b*255 + "," + 1.0 + ")";     }     // 填充1x1像素的矩形(即一个像素大小)来实现单个像素颜色设置     setPixel(x: number, y: number) {         this.ctx.fillRect(x, y, 1, 1);     }     // rgba指定的颜色清空整个canvas实现刷新canvas背景     glClearColor(r: number, g: number, b: number, a:number) {         this.ctx.fillStyle = "rgba(" + r*255 +  "," +  g*255 + "," +  b*255 + "," + a + ")";         this.ctx.fillRect(0, 0, this.canvas.clientWidth, this.canvas.clientHeight);     } } var canvas = document.getElementById("canvas001"); var webgl = new WebGL(canvas); // 设置为黑色背景 webgl.glClearColor(0, 0, 0, 1);
  注:为了突出重点,这里没有列出完整代码,稍有基础完全可以参考自行实现。勾股定理法画圆
  圆上的点到圆心的距离相等,已知圆心坐标(xc,yc)和半径r,根据勾股定理可以得出
  x的坐标范围为[xc-r xc+r],可以遍历x,根据上面的公式求出y值(有两个值y1, y2),逐个设置像素坐标(x, y1)、(x,y2)的颜色值就可以绘制出圆了。
  代码参考如下// 续app.ts let start = Date.now(); webgl.glColor3f(1.0, 0, 0); let [xc, yc, r] = [110, 110, 100]; for (let x = yc - r; x < yc + r; x++) {     let tmp = Math.sqrt(r ** 2 - (x - xc) ** 2);     let y1 = yc + tmp;     let y2 = yc - tmp;     webgl.setPixel(x, y1);     webgl.setPixel(x, y2); } let end = Date.now(); console.log("1-勾股定理法画圆耗时: " + (end - start) + "ms");
  绘制效果见下图,可以明显看出在圆的左右两侧出现了明显的断点(由于斜率两侧较大,y值的变化较大),显然是不理想的,另外该方法中涉及平方、平方根运算,计算量相对是比较大的。
  极坐标法画圆
  解决圆出现断点的问题可以使用极坐标法,可以根据角度计算圆上的坐标点,这样就可以利用沿圆周的等距点来绘制出圆了。
  代码如下// 续app.ts start = Date.now(); webgl.glColor3f(1.0, 0, 0); [xc, yc, r] = [400, 110, 100]; //把一个圆周分成360份,也就是用360个点来画圆 for (let i = 0; i < 360; i++) {     let x = xc + r * Math.cos(i);     let y = yc + r * Math.sin(i);     webgl.setPixel(x, y); } end = Date.now(); console.log("2-极坐标法画圆耗时: " + (end - start) + "ms");
  绘制效果见下图,可以看出还是有一些零散的断点,但分布是均匀的,可以通过把一个圆周分成更多的份数来解决这个问题,这个算法需要三角运算,同样存在运算量相对较大的问题。
  Bresenham中点画圆算法
  之前的文章《Bresenham画线算法及实践》介绍了Bresenham中点算法进行线段的绘制,该算法还适合圆和其他曲线,关键是该算法以决策参数增量为依据,可以做到仅涉简单的整数处理,具有非常高的性能,下面介绍该算法实现的原理。
  根据圆的对称性,可以把圆分成八份,只要计算其中一段圆弧坐标,根据对称性无需计算就可以得出其他7段圆弧的坐标,参见上图所示,先考虑圆心在坐标原点的圆,如果圆心不在原点的情况绘制时只需要增加圆心坐标xc、yc的距离就可以了;以编号为1的那一段圆弧(x=0到x=y段)为例,假如已经确定了(xk,yk)的坐标,那么针对xk+1,通过判断yk、yk-1的中点yk-1/2在圆内还是圆外来决定下一个像素坐标,如果中点在圆内则坐标(xk+1, yk)更接近圆曲线,如果中点在圆外则坐标(xk+1, yk-1)更接近圆曲线,根据圆的方程可以构造如下的圆函数,通过求函数值进行判定。
  为进一步减少算法的计算量,我们定义一个决策参数pk,假如已经确定了像素(xk,yk),那么pk就是将中点(xk+1, yk-1/2)代入圆函数的值,pk<0则(xk+1,yk)更接近圆,否则(xk+1,yk-1)更接近圆。
  后续的决策参数pk+1可以通过增量计算获得,pk+1的值因pk的正负而有不同的增量。
  最后,需要确定pk的初始值p0,选取第一象限x=0到x=y分段的圆弧,首个像素坐标为(0,r),则p0=f(0+1,r-1/2)。假如将半径r指定为整数,则将5/4直接简化为1并不会影响p0的正负性,则p0=1-r也是一个整数,那么后续的增量pk也将都是整数,整个Bresenham中点画圆算法就只需要进行整数处理,大大节省了计算量。
  根据上面的思路实现的代码参考如下// 续app.ts // circlePlot为自定义WebGL类中的方法,实现了Bresenham画圆算法,(x_c, y_c)为圆心坐标,r为半径 circlePlot(x_c: number, y_c: number, r: number) { 	let [x0, y0] = [0, r]; 	let p = 1 - r; 	let y = y0; 	for (let x = x0; x < y; x++) { 		if (p < 0) { 			// 中点在园内 			p += 2 * x + 1; 		} else { 			// 中点在圆外或圆上 			y -= 1; 			p += 2 * (x - y) + 1;  		} 		this.setPixel(x_c + x, y_c + y); 		// 利用对称性绘制其他圆弧 		this.setPixel(x_c + y, y_c + x); 		this.setPixel(x_c + y, y_c - x); 		this.setPixel(x_c + x, y_c - y); 		this.setPixel(x_c - x, y_c + y); 		this.setPixel(x_c - y, y_c + x); 		this.setPixel(x_c - x, y_c - y); 		this.setPixel(x_c - y, y_c - x); 	} }  // Bresenham算法绘制圆 start = Date.now(); webgl.glColor3f(1.0, 0, 0); webgl.circlePlot(690, 110, 100); end = Date.now(); console.log("3-Bresenham中点画圆耗时: " + (end - start) + "ms");
  下图是将三种方法绘制在一起的三个圆的效果,最右边的为Bresenham算法绘制的圆,效果更好些,根据记录的时间来看其算法耗时也是最小的(勾股定理法、极坐标法也可以利用对称性仅计算1/8圆弧就可以了,画一个圆性能上比较估计并不明显,当大量进行绘制时才能体现出Bresenham算法的优势)。
  参考文献
  [1]. 《计算机图形学》(第三版)Donald Hearn、M.PaulineBaker著,3.9 圆生成算法,P80

中国电影淫魔教父,性剥削100名未成年女学生我在浴室洗衣服,大晚上听到杜英哲的砸门声让我开门,我怕他听到门锁关上的声音非常轻地锁上了浴室门,拿着剪刀在里面哭。他突然一把抱住我,把我压在了床上。他一边扒掉我的衣服,一边说别害怕智慧医疗飞速发展数据显示,2020年我国智慧医疗行业规模已突破千亿元大关,2021年市场规模进一步增长,智慧医疗行业将进入智能化高效化规模化发展的高速增长期。在数字经济飞速发展下,中国智慧医疗市场工信部就华为鸿蒙系统问题郑重发声文科技君工信部就华为鸿蒙系统问题郑重发声!看似是开源,所有手机厂商都可以免费适配使用的安卓系统,实际上却暗藏玄机。在安卓系统最核心的GMS移动服务上,美国的谷歌公司一直牢牢把持着,大学生假期怎么选笔记本?纵览全能本市场,这三款都是佼佼者十一小长假马上就要来了,最近看到网上不少大一新生们也准备在假期选购一台笔记本电脑,以往每年十一期间都会有不少笔记本做活动,今年也不例外,像华硕联想等一线品牌不仅备足了热门新品,还附简便操作让你把Windows装进口袋,随时随地体验不一样的系统WinToGo是微软推出的一款可以将windows系统安装在外置存储设备的一款软件,也就是说通过连接U盘移动硬盘等就可以进入一个额外的系统,对于windows电脑用户来说可能不以为为何美国媒体很少拿科比对比乔丹?看乔丹40岁数据秒懂,科比尴尬乔丹,NBA历史最伟大的球员,没有之一,科比,NBA历史上最好的球员之一,两者都曾经是所在年代的NBA现役第一人,但是有趣的是,相比如今媒体和球迷喜欢拿詹姆斯和乔丹相比较,为何美国吉国的抢婚习俗三分之一的妻子是男人在外面抢来的全球之旅我在吉尔吉斯斯坦大家好,我是申典启,一个实地走访世界各地,关注全球华人的旅行者。来到吉尔吉斯之前,我就了解过这个国家有一个非常有名的习俗抢婚,我在吉国也采访了很多当地人,那探访元氏县国保单位封龙山石窟静卧封龙山千载独悠然封龙山早在唐代就被列为河北名山,这里自然风光秀丽,以沟深林茂清泉碧溪奇峰怪石为胜。此处还拥有璀璨的历史文化,汉碑书院石窟道观吸引着许多人前往,去探古寻幽。仲秋时节,我们前往山中,探东北有一条最美高铁,沿途风景迷人,却少有人知提到最美高铁,你会想到哪一条高铁呢?许多人想到的,往往是合福高铁。合福高速铁路由合肥北城站至福州站,全长850千米,途经美丽的皖南,沿途风景确实很漂亮!但是,你知道吗?在东北,其实生吃水果嫌凉可以试试这样做很多人喜欢吃水果。但是由于天气逐渐转凉,一些人担心水果寒凉,不敢多吃。营养师刘艳君提示,一些水果除了生吃以外,还可以做熟后再吃,对身体也有不少益处。炖柚子柚子是秋季成熟的水果,含有血液循环不好是造成舌苔厚腻的主要原因之一细心的朋友会发现,早上起床的时候舌苔很厚,起来活动后慢慢舌苔变薄了,为什么就是睡觉的时候血液循环不好,起床活动后循环好些了,就变薄了,所以,治疗舌苔厚腻就注意活血化瘀,哪里厚腻活哪
2022年再去投资几万块的共享自习室,还能赚钱吗?提起共享自习室,相信已经是被大众认可的一个投资项目,那么现在2022再去投资开一家共享自习室,是否还有盈利的空间?相信很多人都会说共享自习室在我国已经饱和了,疫情断断续续,还有不少织篢天后宫织篢天后宫相传始建于宋代,占地面积1830平方米。资料图片梁愈箭阳西县织篢镇山海兼优,景色秀丽,历史悠久。织篢镇临河而建,有上千年开埠设市的商贸文明,人文积淀深厚,文化源远流长。织人类简史追溯历史演化的轨迹生物学把有一样DNA库的物种称为同一物种,从同一个祖先演化而来的不同物种,称为同一个属,许多不同的属再追溯到更古老的同一祖先的集合称为科。大约在250万年前,人属开始演化,并形成了枇杷的挑选好处农谚说五月末,枇杷落,此时枇杷成熟,果皮橙红明亮,果实大,果核小,酸甜适中,皮薄多汁,能润五脏,滋心肺,有着黄金果之称。枇杷可以说全身都是宝,果味甘酸,供生食蜜饯和酿酒用叶晒干去毛耳鸣,嗡嗡响,如蝉叫,中医补肝肾耳鸣为止中医认为,耳鸣可分外因和内因,内因多由恼怒惊恐,肝胆风火上逆,以致少阳经气闭阻,或因肝肾亏虚,精气不能上濡于耳而成外因多由风邪侵袭壅遏清窍或突然暴响震伤耳窍引起。耳鸣有虚实之分,实注意!这三种食物吃多了会加速衰老,第三种你一定经常吃油炸类食物因为油炸食物里有很多的的脂肪酸膨松剂以及色素,这些对人体有害的物质被我们身体吸收后,会干扰人体正常的代谢机能。所以,吃太多的油炸食品会加速衰老。并且油炸的东西吃多了过后,亚马逊被迫退货转租,拯救高额成本空仓太多,亚马逊也撑不住了?通货膨胀供应链问题消费需求锐减,三大杀手锏下,亚马逊也撑不住了。线上网购热潮正在消退,非必需购买减少,消费转移到线下超市商店,各大巨头劳动力过剩显现,还满大街自动驾驶,为什么还要升级LCC?这几年全球汽车产业经历了颠覆性的风云变幻,你和我都有幸见证历史书写的过程。自从特斯拉用过硬的综合产品力营销和服务力超越大众丰田等汽车大厂,成为市值冠军之后,同时特斯拉也带货了不少启全球仅存的9株野生绒毛皂荚进入盛花期5月是美丽的季节,这几日,在南岳衡山国家级自然保护区内,全球仅存的9株野生绒毛皂荚进入盛花期。一簇簇绿色的绒毛皂荚花朵沐浴着初夏的阳光,静悄悄地绽放在枝头,在微风中绰约摇曳。绒毛皂陈芋汐逆袭第一,全红婵首次意外落败,身高突破160CM比赛受影响最新消息来自中国跳水队。在球队测试中,奥运冠军陈芋汐表现出色,在女子10米台比赛中击败全红婵,获得第一名。这也是陈芋汐自东京奥运会以来首次击败全红婵,表现出不屈不挠的拼搏精神。陈芋NBA抱团已成过去式现在NBA的现状已经形成了普遍的抱团夺冠,但是从目前篮网湖人的抱团结果来看,抱团已经不如此前的热火勇士的抱团效果好,篮网三个赛季季后赛都未能走多远就被淘汰,反观湖人虽然第一个赛季夺