利用直角三角形画圆的算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
利用直角三角形画圆的算法
————————————————————————————————作者:————————————————————————————————日期:
另外一种画圆的算法:
算法的数学原理:
我们知道圆的内接三角形中,如果有一条边是直径,那么该边所对应的角度是直角。而在解析几何中,对任意两条斜率存在的直线,如果它们相互垂直,那么它们的斜率相乘为-1,
而倘若是在园外(稍微在圆外一点),则夹角变小,斜率相乘小于-1(待会儿给出证明),倘若在园内一点,则夹角变大,斜率相乘大于-1,如图:
证明:
(由于只需要画出1/8圆即能画出整个圆,因此以下以第二个八分圆证明)
对于B 点
设cos ,sin x r y r θθ==(r 为圆的半径) 则sin sin ,cos cos BC BA r r k k r r r r
θθθθ==+-,
2222sin *
1(cos 1)
BC BA r k k r θθ==--。 对于B ’点
设cos ,sin x r dx y r θθ=+=
其中(0,cos )dx r r θ∈-
则''sin sin ,cos cos B C B A r r k k r dx r r dx r
θθθθ==+++- 22''22''sin *(cos )0*1
B C B A B C B A r k k r dx r dx k k θθ=+->∴<-
同理可得,对于B ”点
""*1B C B A k k >-
以上是对该数学方法的证明
下面我们讨论一下具体的描点,如图:
设我们已经画出了P点(P 在第二个八分圆的圆弧上),则我们设P (x,y),则下一个应该描的点应该是P 1或P2,我们取P 1和P 2的中点Pmid,我们只需要判断出Pmi d与圆的关系即可判断应取P1还是P2了,如图:
按照前面的论证方法,我们分别算出了
121PmidA y k x r -
=+-,121PmidC y k x r -=++ 2
221()2*(1)PmidA PmidC
y k k x r -=+- 因为是否在圆上是以斜率相乘是否为-1为分界线的,所以我们令*1PmidA PmidC k k +,则 222221()(1)2*1(1)PmidA PmidC y x r k k x r
-++-+=+- 只需判断出*1PmidA PmidC k k +是否大于0即可
我们观察到,对于第二个八分圆,分母22(1)0x r +-<恒成立,则我们只需要判断分子是否大于0即可,当分子2221()(1)02y x r -++->时,则Pmid 在圆外,取P2 当分子222
1()(1)02y x r -++-<时,则P mid 在圆内,取P 1
如果相等,则我们约定取P2
这样就可以画出圆来了,但是效率太低了,我们可以稍加改进,将其改变成增量的形式
因为我们已经取了P点,则我们可以分情况讨论在P 点之前一次的取点情况,共有两种情况,一是P ’点,二是P ”点,则对应这两种情况:
如果是P ’点,则计算的是P ’mid 点的斜率相乘的结果
如果是P ”点,则计算的是P”m id 点的斜率相乘的结果
我们设a 为每一次的斜率相乘加1后的分子的值,则对应于P’m id
222'1()2
P mid a y x r =++- 而对应于P”mid
222"1()2
P mid a y x r =-+- 而我们所需要求的Pm id 点的
222222'11()(1)()(221)(221)22
Pmid P mid a y x r y x r x y a x y =-++-=++-+-+=+-+ 222222"11()(1)()(21)(21)22
Pmid P mid a y x r y x r x a x =-++-=-+-++=++ 由此,我们便将a 的值表示成了增量的形式,通过判断a 的正负来判断该点是在圆内还是圆外,具体的c 代码算法部分如下所示:
f lo at a,x,y,r,esp in on =0.00001;
ﻩint t ag; ﻩﻩ ﻩ//tag 是用来判别前一个点是P’还是P ”的
ﻩx =0;ﻩﻩﻩﻩ //tag==1,表示取的是P ’,tag==0,表示取得是P ”
r=100;
y=r ;
ﻩpDC->SetP ixel(0,y,R GB(x,y,((x+y)/2)));
a=(y-0.5)*(y-0.5)+(x+1)*(x+1)-r*r;
if(a>e spinon )
ﻩ{
pD C->Se tPixel(x+1,y-1,R GB(x,y ,((x+y)/2)));
ﻩx ++,y--;
ﻩﻩta g=1;
ﻩ}
ﻩels e
ﻩ{
ﻩ pD C->S etPixel(x+1,y,RGB(x ,y,((x+y)/2)));
ﻩﻩx ++;
ﻩﻩt ag=0;
}
ﻩwh ile (x<=y)
{
ﻩ sw itch(ta g)
ﻩ {
ﻩﻩcase 0:
ﻩﻩ a+=2*x+1;
ﻩbreak;
ﻩ cas e 1:
ﻩﻩ a+=2*x -2*y+1;
ﻩ }
ﻩ if (a>esp inon)
ﻩ {
ﻩ pD C->SetPi xel (x+1,y-1,RG B(x,y,((x+y)/2)));