在屏幕上绘制圆的时候实际上就是在画一个正多边形,只是边非常多而已。
这篇文章来水一个画多少边合适的问题。(注:我并不是不知道canvas2d有圆弧绘制函数,这是为下一篇文章准备的内容)
要一个圆的边看起来平滑,就需要边数足够多,直到在屏幕上看不出它有棱角就够了,这里摆一幅图。
只需要让这个limit(随便起的名字)线段尽量短就行了,这条线表示的是圆心到相邻顶点中垂线延伸出去到目标圆弧的长度。
一般来说设为1像素是肯定够用的,在圆半径越大时,这个limit也就可以跟着一起变大,因为半径越大,同样的突出程度(limit)看起来就不会那么尖锐。
这里放一个演示
这是这里面根据半径和limit求出所需边数的方法
function CircleData(R){//R:圆的半径 let limit=1*ctrlLimit.value; let minR=R-limit;//最小半径(随便起的名字,圆心到圆边相邻两点间连线的中垂线长度) let avgRad=Math.acos(minR/R);//边缘两点间的弧度 let pointC=Math.ceil(Math.PI*2/avgRad);//边缘点数,上舍入到整数 avgRad=Math.PI*2/pointC;//根据点数重算顶点间的弧度 return [pointC,avgRad];//返回顶点数量和两点间的弧度 }
得到圆的绘制信息后,循环跑一遍所有顶点然后连成线就行了
function cond(rad,r){//返回对应弧度和半径下对应点的坐标 return [Math.sin(rad)*r,Math.cos(rad)*r]; } function draw(){ canvas.width+=0;//重置画布 ctx.translate(canvas.width/2,canvas.height/2);//绘制原点移动到画布中间 let R=ctrlR.value;//取一个半径值 let [pc,avgRad]=CircleData(R);//算出边缘点数和点间弧度 let rad=0;//起始弧度 for(var i = pc;pc--;){ ctx.lineTo(...cond(rad,R));//连线成圆 rad+=avgRad; } ctx.closePath();//从最后一个点连到第一个点 ctx.stroke(); }
本文发布于 https://luojia.me
本站文章未经文下加注授权不得拷贝发布。