利用直角三角形画圆的算法

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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)));

相关文档
最新文档