我的程序,欢迎指点,关于双曲线,图形学

时间:2021-04-11 16:30:42
#include <graphics.h>
    #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算法,能详细介绍一下吗?

#7


你的程序罗嗦了一点,思路还是满清晰的。对正则圆锥曲线,可以用Bressenham算法,但我没有查到有关的论文。Warnock算法对非正则的任意曲线更有效。实际就是二叉剖分:把整个屏幕视为一个矩形,判断曲线是否经过这个矩形,如果经过,就分成四个小矩形再分别递归判断,直到矩形大小缩到1×1象素为止。这个算法对正则的二次曲线不一定比直接画更快,我没有推导过它的复杂度。不过最近在研究画任意倾斜的双曲线,想用这种方法画画看,所以就提了一下。如果有兴趣就试试吧。

#1


你想问什么?

#2


我想知道有没有更好的方法画双曲线

#3


你是用的什么算法画的,能谈谈你的思路吗?

#4


如果仅仅是在屏幕上画双曲线,可以尝试Warnock算法(我没试过,不一定比你的方法快)

#5


中点算法么?
太长了,不想看

#6


我用的是中点画圆法,先画第一象限的,在第一象限中,把弧分为上下部分,
以斜率来分,请各位介绍更好的方法
请问,什么是warnock算法,能详细介绍一下吗?

#7


你的程序罗嗦了一点,思路还是满清晰的。对正则圆锥曲线,可以用Bressenham算法,但我没有查到有关的论文。Warnock算法对非正则的任意曲线更有效。实际就是二叉剖分:把整个屏幕视为一个矩形,判断曲线是否经过这个矩形,如果经过,就分成四个小矩形再分别递归判断,直到矩形大小缩到1×1象素为止。这个算法对正则的二次曲线不一定比直接画更快,我没有推导过它的复杂度。不过最近在研究画任意倾斜的双曲线,想用这种方法画画看,所以就提了一下。如果有兴趣就试试吧。