4.2.1_如果是圆?(上):八分法画圆
圆的扫描转换算法
圆心位于原点的扫描转换
![](https://i-blog.csdnimg.cn/blog_migrate/e9930189195f8b0726e164b47915c90f.png)
圆心在任意一点
圆具有非常良好的对称性
![](https://i-blog.csdnimg.cn/blog_migrate/4953d0c3853c4a5bafe2d95602b2fb4e.png)
如果我们得到了其中一段圆弧的上面的像素点,就可以通过对称的方法,得到另外的7个点
于是要得到整个圆的扫描转换的像素集,只需要扫描转换1/8段圆弧即可,这就是
八分法画圆
![](https://i-blog.csdnimg.cn/blog_migrate/03659caae8d4eb15e921a2231fa00268.png)
用简单的方程生成圆弧,利用函数方程,直接离散计算
![](https://i-blog.csdnimg.cn/blog_migrate/e2b3ca9bcffd945a9748dd9adeb69436.png)
X是最大位移方向
![](https://i-blog.csdnimg.cn/blog_migrate/59293a057d2ec008ce994d27390d194d.png)
在绘制这1/8圆弧的时候,X每次走一步,而Y方向上怎么走步,需要靠公式来计算
![](https://i-blog.csdnimg.cn/blog_migrate/13b9618a54f64cb035015cb3e94e54ca.png)
利用极坐标方程,直接离散计算
![](https://i-blog.csdnimg.cn/blog_migrate/e2903b556eb6c37188d2eece4c7659d9.png)
这里的δθ为一个固定角度的步长,可以灵活的进行设定
使用这个方法,以固定角度为步长的时候,就可以沿着圆周等距把这个圆弧的上面的点绘制出来,这个时候θ的步长的选择就可以根据应用和显示的需要来灵活的选择
![](https://i-blog.csdnimg.cn/blog_migrate/c737b4e7baf649f7e6c6651b52776d2c.png)
当然步长选的很小的时候,它这个圆弧看起就圆滑一些
![](https://i-blog.csdnimg.cn/blog_migrate/ed8fe38045762f3e67d52e37061435b1.png)
两种计算方法
![](https://i-blog.csdnimg.cn/blog_migrate/cde19b2ab6fab20b89b08b3eb895f8e7.png)
4.2.2_如果是圆?(上):中点画圆法
中点画圆法画法思想分析
问题描述:绘制x
^2+y
^2 = R
^2
![](https://i-blog.csdnimg.cn/blog_migrate/a580ba29c11d8e767947d25c1f54f2b8.png)
对直线中点Bresenham画法的联想
![](https://i-blog.csdnimg.cn/blog_migrate/0a4d15ecbaa4920b3e1ee5fa90180342.png)
圆的隐式方程F(X,y) = x^2 + y^2 - R^2
![](https://i-blog.csdnimg.cn/blog_migrate/0817b12f5119281ed699bff86211ba56.png)
问题的简化:只考虑这1/8段圆弧
![](https://i-blog.csdnimg.cn/blog_migrate/10b0b0d6b6f2b5450a7a957bd3e69b29.png)
中点Bresenham画圆法
X每次增加1,y减少1或者不变
![](https://i-blog.csdnimg.cn/blog_migrate/13400821981018ee9bed8072f56097a6.png)
仍然把中点拿出来
![](https://i-blog.csdnimg.cn/blog_migrate/ba0e734f4cce6991eadb267234bf070b.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c8019b032b9c60cd874c30f80832f8f8.png)
在这里约定取
Pu
![](https://i-blog.csdnimg.cn/blog_migrate/476019765446954f6894c80d5b2a9753.png)
构造出判别式
这个判别式其实就是把中点的坐标带入这个圆的隐式方程F中
![](https://i-blog.csdnimg.cn/blog_migrate/2a7d2dc3476ebacffe6728e051503a80.png)
进行误差项的递推
第一种情况d<=0,取
Pu
![](https://i-blog.csdnimg.cn/blog_migrate/8811f3976460d7619bfbd05589c6b5e9.png)
第二种情况d>0,取
Pd
![](https://i-blog.csdnimg.cn/blog_migrate/1d291c4e85a2c9f721820cc78a440abc.png)
d的初值 判别式的初值是1.25-R
![](https://i-blog.csdnimg.cn/blog_migrate/3ead6682c8f8756444711c0b18be756f.png)
由于使用的只是d的符号,这里可以有一个巧妙的替代,用d-0.25来代替d,这样来摆脱小数
![](https://i-blog.csdnimg.cn/blog_migrate/603864b9b4e356ac8f878b94167e96c8.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1d50dd32bc85b808bdf85423b20518c6.png)
直接改为d和0的比较,也就是判断d的符号
![](https://i-blog.csdnimg.cn/blog_migrate/a27b161c393d7495af0470e5e30fd9ec.png)
得到中点Bresenham算法画圆的步骤
![](https://i-blog.csdnimg.cn/blog_migrate/4324b9ffb34f17ec930e9b28fd29dcce.png)
![](https://i-blog.csdnimg.cn/blog_migrate/29368c16cd4425ae7a814e218d6bacbd.png)
![](https://i-blog.csdnimg.cn/blog_migrate/2685ce342af7c2bb45a77236a58072c9.png)
中点Bresenham算法画圆的程序
![](https://i-blog.csdnimg.cn/blog_migrate/dddc525d3315758cf640b2921cd6c718.png)
4.3_椭圆又如何?:椭圆的重点Bresenham算法
提纲
![](https://i-blog.csdnimg.cn/blog_migrate/ac63a9b56239ca921f20f5dc98f47400.png)
椭圆中点画法思想分析
通常定义椭圆是到两个定点距离之和等于常数点的集合
为了简化起见,中心落在坐标原点的标准椭圆
![](https://i-blog.csdnimg.cn/blog_migrate/f123125edff72199e7a0821629373c7c.png)
得到一个椭圆的函数
![](https://i-blog.csdnimg.cn/blog_migrate/1014155884c978ad8deb33eff98122c0.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ba6258cf717a93368f0b92f917456c07.png)
椭圆的对称性
椭圆不具备圆形这么好的对称性,但是也是关于x,y轴对称的
![](https://i-blog.csdnimg.cn/blog_migrate/b494b546e45f56cb5bb4618449c47132.png)
![](https://i-blog.csdnimg.cn/blog_migrate/a3b1ea75bda783bae6a441cce6aa2bd2.png)
![](https://i-blog.csdnimg.cn/blog_migrate/9128724720d5c53e4e04fa5497046221.png)
由微分的知识,我们可以得到椭圆上一个点X,Y处法向量的表示
![](https://i-blog.csdnimg.cn/blog_migrate/7eb24df0dfabe27ed377f7cc9c5f697a.png)
![](https://i-blog.csdnimg.cn/blog_migrate/63e4989aeb272a0707747aa5b9dc730f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/8cced8639c04ca8ece5598f1e2daa688.png)
对上下两个部分进行公式推导
![](https://i-blog.csdnimg.cn/blog_migrate/a08ce996a986ac53421ef04e53cfb8ba.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ed80d91e7d7a7407728b6a3e762b71ff.png)
![](https://i-blog.csdnimg.cn/blog_migrate/163a8df815bb273944f9582c7badeedf.png)
![](https://i-blog.csdnimg.cn/blog_migrate/92a360c69145932032a3c37c7069c7ff.png)
有了递推还是要回到d1的初值
![](https://i-blog.csdnimg.cn/blog_migrate/50026cf95ca7c2b592b8c0b5810e42d9.png)
![](https://i-blog.csdnimg.cn/blog_migrate/505686f97914b88f3cf1c20528fa0a41.png)
![](https://i-blog.csdnimg.cn/blog_migrate/60a95fa8ac5e53905d65c1f5440128cc.png)
椭圆中点Breseham算法
![](https://i-blog.csdnimg.cn/blog_migrate/c98c80590b522d8df69db601cb19287a.png)
![](https://i-blog.csdnimg.cn/blog_migrate/df10fc978c58084b01b3322d87b01bdb.png)
在椭圆弧的绘制中,还有两个问题需要注意
![](https://i-blog.csdnimg.cn/blog_migrate/8be6d0d0f703388bdaa6fff5b8c4452d.png)
从上半部分转入下半部分
![](https://i-blog.csdnimg.cn/blog_migrate/cb3a9124b2c65d548e11de7d3d5af014.png)
刚转入下半部分的时候,需要对下半部分的中点的初值来进行计算
![](https://i-blog.csdnimg.cn/blog_migrate/51d5550e46e87b211dd9df409298ea29.png)
算法步骤
![](https://i-blog.csdnimg.cn/blog_migrate/9673b50176b88776d8095c004903cd4f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/80f57d5a7005c32420e259e798d807dc.png)
![](https://i-blog.csdnimg.cn/blog_migrate/25e09319858ae8599e2648450db96e3c.png)
步骤6进行了下半部分
![](https://i-blog.csdnimg.cn/blog_migrate/c3ba1656aebfbf60a987e0d53e981184.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ba7979ec1896d423596d79e9038d683b.png)
仍然要根据d的符号来判断该怎么取点,以及d本身该怎样进行增量计算
![](https://i-blog.csdnimg.cn/blog_migrate/d15160588258ff2dd5831bbb686585e4.png)
![](https://i-blog.csdnimg.cn/blog_migrate/8a628c37abf6d43f7b2339acc9480b7a.png)
最后实例
![](https://i-blog.csdnimg.cn/blog_migrate/a558cb4c33eb6235d8105e9359105063.png)