利用直角三角形画圆的算法.docx
- 文档编号:25343448
- 上传时间:2023-06-07
- 格式:DOCX
- 页数:8
- 大小:169.75KB
利用直角三角形画圆的算法.docx
《利用直角三角形画圆的算法.docx》由会员分享,可在线阅读,更多相关《利用直角三角形画圆的算法.docx(8页珍藏版)》请在冰豆网上搜索。
利用直角三角形画圆的算法
利用直角三角形画圆的算法
另外一种画圆的算法:
算法的数学原理:
我们知道圆的内接三角形中,如果有一条边是直径,那么该边所对应的角度是直角。
而在解析几何中,对任意两条斜率存在的直线,如果它们相互垂直,那么它们的斜率相乘为-1,
而倘若是在园外(稍微在圆外一点),则夹角变小,斜率相乘小于-1(待会儿给出证明),倘若在园内一点,则夹角变大,斜率相乘大于-1,如图:
证明:
(由于只需要画出1/8圆即能画出整个圆,因此以下以第二个八分圆证明)
对于B点
设
(r为圆的半径)
则
,
。
对于B’点
设
其中
则
同理可得,对于B”点
以上是对该数学方法的证明
下面我们讨论一下具体的描点,如图:
设我们已经画出了P点(P在第二个八分圆的圆弧上),则我们设P(x,y),则下一个应该描的点应该是P1或P2,我们取P1和P2的中点Pmid,我们只需要判断出Pmid与圆的关系即可判断应取P1还是P2了,如图:
按照前面的论证方法,我们分别算出了
,
因为是否在圆上是以斜率相乘是否为-1为分界线的,所以我们令
,则
只需判断出
是否大于0即可
我们观察到,对于第二个八分圆,分母
恒成立,则我们只需要判断分子是否大于0即可,当分子
时,则Pmid在圆外,取P2
当分子
时,则Pmid在圆内,取P1
如果相等,则我们约定取P2
这样就可以画出圆来了,但是效率太低了,我们可以稍加改进,将其改变成增量的形式
因为我们已经取了P点,则我们可以分情况讨论在P点之前一次的取点情况,共有两种情况,一是P’点,二是P”点,则对应这两种情况:
如果是P’点,则计算的是P’mid点的斜率相乘的结果
如果是P”点,则计算的是P”mid点的斜率相乘的结果
我们设a为每一次的斜率相乘加1后的分子的值,则对应于P’mid
而对应于P”mid
而我们所需要求的Pmid点的
由此,我们便将a的值表示成了增量的形式,通过判断a的正负来判断该点是在圆内还是圆外,具体的c代码算法部分如下所示:
floata,x,y,r,espinon=0.00001;
inttag;//tag是用来判别前一个点是P’还是P”的
x=0;//tag==1,表示取的是P’,tag==0,表示取得是P”
r=100;
y=r;
pDC->SetPixel(0,y,RGB(x,y,((x+y)/2)));
a=(y-0.5)*(y-0.5)+(x+1)*(x+1)-r*r;
if(a>espinon)
{
pDC->SetPixel(x+1,y-1,RGB(x,y,((x+y)/2)));
x++,y--;
tag=1;
}
else
{
pDC->SetPixel(x+1,y,RGB(x,y,((x+y)/2)));
x++;
tag=0;
}
while(x<=y)
{
switch(tag)
{
case0:
a+=2*x+1;
break;
case1:
a+=2*x-2*y+1;
}
if(a>espinon)
{
pDC->SetPixel(x+1,y-1,RGB(x,y,((x+y)/2)));
x++,y--;
tag=1;
}
else
{
pDC->SetPixel(x+1,y,RGB(x,y,((x+y)/2)));
x++;
tag=0;
}
}
下图为用该算法画出的圆(圆心坐标是(100,,100),半径是100):
算法的分析到此为止
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 利用 直角三角形 算法