#define A 15
void MidpointCircle(a,b,color)
float a,b;
int color;
{
int x,y;
float k;
float d1,d2;
x=a*A;
y=0;
k=b/a; /* xie liu */
d1=((x+0.5)*(x+0.5)/a/a-(y+1)*(y+1)/b/b)/A/A-1;
setcolor(WHITE);
line(getmaxx()/2-300,getmaxy()/2,getmaxx()/2+300,getmaxy()/2);
line(getmaxx()/2,getmaxy()/2-220,getmaxx()/2,getmaxy()/2+220); /* heng zuo biao, zong zuo biao */
line(getmaxx()/2,getmaxy()/2-220,getmaxx()/2+10,getmaxy()/2-210);
line(getmaxx()/2,getmaxy()/2-220,getmaxx()/2-10,getmaxy()/2-210);
line(getmaxx()/2+300,getmaxy()/2,getmaxx()/2+290,getmaxy()/2+10);
line(getmaxx()/2+300,getmaxy()/2,getmaxx()/2+290,getmaxy()/2-10); /* jian tou fu hao */
line(getmaxx()/2+a*5,getmaxy()/2,getmaxx()/2+a*5,getmaxy()/2-10); /* ke du */
line(getmaxx()/2+a*10,getmaxy()/2,getmaxx()/2+a*10,getmaxy()/2-10);
line(getmaxx()/2+a*15,getmaxy()/2,getmaxx()/2+a*15,getmaxy()/2-10);
line(getmaxx()/2+a*20,getmaxy()/2,getmaxx()/2+a*20,getmaxy()/2-10);
line(getmaxx()/2+a*25,getmaxy()/2,getmaxx()/2+a*25,getmaxy()/2-10);
line(getmaxx()/2+a*30,getmaxy()/2,getmaxx()/2+a*30,getmaxy()/2-10);
line(getmaxx()/2+a*35,getmaxy()/2,getmaxx()/2+a*35,getmaxy()/2-10);
line(getmaxx()/2+a*40,getmaxy()/2,getmaxx()/2+a*40,getmaxy()/2-10);
setviewport(getmaxx()/2,getmaxy()/2,getmaxx(),getmaxy(),0);
while((x+1)/a/a>(y-0.5)/b/b)
{
if(d1<0)
{
d1+=(2+2*x)/(a*a)/A/A-(3+2*y)/(b*b)/A/A;
x++;
y++;
}
else
{
d1-=((3+2*y)/(b*b))/A/A;
y++;
}
putpixel(x,y,color);
putpixel(-x,-y,color);
putpixel(-x,y,color);
putpixel(x,-y,color);
}
d2=((x+1)*(x+1)/a/a-(y+0.5)*(y+0.5)/b/b)/A/A-1;
while(b*b*x/a/a/y>=k)
{
if(d2<0)
{
d2+=((3+2*x)/a*a)/A/A;
x++;
}
else
{
d2+=((3+2*x)/a/a-(2+2*y)/b/b)/A/A;
x++;
y++;
}
putpixel(x,y,color);
putpixel(-x,-y,color);
putpixel(-x,y,color);
putpixel(x,-y,color);
}
}
void main()
{
float a,b; /* this program belongs to charlie wong,
int driver;
int mode; any kinds of or ways of copy in the form of Vidio,
int color;
TV,book are illegal,the copyright owner reserves the
driver=DETECT;
mode=0; right for the next step!!! */
initgraph(&driver,&mode,"c:\\tc\\bgi");
printf("Please input the data:\n");
printf("a=");
scanf("%f",&a);
printf("\nb=");
scanf("%f",&b);
setcolor(BLUE);
MidpointCircle(a,b,BLUE);
getch();
closegraph();
}
7 个解决方案
#1
你想问什么?
#2
我想知道有没有更好的方法画双曲线
#3
你是用的什么算法画的,能谈谈你的思路吗?
#4
如果仅仅是在屏幕上画双曲线,可以尝试Warnock算法(我没试过,不一定比你的方法快)
#5
中点算法么?
太长了,不想看
太长了,不想看
#6
我用的是中点画圆法,先画第一象限的,在第一象限中,把弧分为上下部分,
以斜率来分,请各位介绍更好的方法
请问,什么是warnock算法,能详细介绍一下吗?
以斜率来分,请各位介绍更好的方法
请问,什么是warnock算法,能详细介绍一下吗?
#7
你的程序罗嗦了一点,思路还是满清晰的。对正则圆锥曲线,可以用Bressenham算法,但我没有查到有关的论文。Warnock算法对非正则的任意曲线更有效。实际就是二叉剖分:把整个屏幕视为一个矩形,判断曲线是否经过这个矩形,如果经过,就分成四个小矩形再分别递归判断,直到矩形大小缩到1×1象素为止。这个算法对正则的二次曲线不一定比直接画更快,我没有推导过它的复杂度。不过最近在研究画任意倾斜的双曲线,想用这种方法画画看,所以就提了一下。如果有兴趣就试试吧。
#1
你想问什么?
#2
我想知道有没有更好的方法画双曲线
#3
你是用的什么算法画的,能谈谈你的思路吗?
#4
如果仅仅是在屏幕上画双曲线,可以尝试Warnock算法(我没试过,不一定比你的方法快)
#5
中点算法么?
太长了,不想看
太长了,不想看
#6
我用的是中点画圆法,先画第一象限的,在第一象限中,把弧分为上下部分,
以斜率来分,请各位介绍更好的方法
请问,什么是warnock算法,能详细介绍一下吗?
以斜率来分,请各位介绍更好的方法
请问,什么是warnock算法,能详细介绍一下吗?
#7
你的程序罗嗦了一点,思路还是满清晰的。对正则圆锥曲线,可以用Bressenham算法,但我没有查到有关的论文。Warnock算法对非正则的任意曲线更有效。实际就是二叉剖分:把整个屏幕视为一个矩形,判断曲线是否经过这个矩形,如果经过,就分成四个小矩形再分别递归判断,直到矩形大小缩到1×1象素为止。这个算法对正则的二次曲线不一定比直接画更快,我没有推导过它的复杂度。不过最近在研究画任意倾斜的双曲线,想用这种方法画画看,所以就提了一下。如果有兴趣就试试吧。