当前位置:编程学习 > C/C++ >>

记录打印一个椭圆的有趣过程

记得大一刚学C语言的时候,书后有道打印三角形的题,记得当时做了一个多小时才做出来,相信大家初学编程也做过类似的问题,今天突发奇想想打印个特殊曲线,于是把目标锁定为打印一个椭圆,大家都知道编程语言打印输出一个图形,如果它是单调递增或者单调递减是非常容易的,如果非单调的函数就得费一些周折。椭圆不是单调函数应该怎么快速打印呢首先因为圆是特殊的椭圆,所以我们先想想如何打印圆形,我们可以先想把圆分成1/4,一个1/4圆当然是单调的嘛,利用x*x + y*y = r*r这个圆的标准方程打印输出,代码如下:
 
[cpp 
#include <stdio.h>  
  
int main()  
{  
    int R = 10;  
    int x,y;  
      
      
for(y = 0; y <= R; y++)  
{  
    for(x = 0; x <= R; x++)  
    {  
        if(x*x + y*y < R*R)  
          
            printf("*");  
        else  
            printf(" ");  
    }  
printf("\n");  
}  
}  
打印结果:
 
诶妈呀,咋出个这个畸形?我们仔细看会发现,原因是圆的行间距和列间距不同造成的,解决方法是把打印一个星‘*’,改成打印两个星‘**’就成了,代码如下:
 
[cpp] 
#include <stdio.h>  
  
int main()  
{  
    int R = 15;  
    double x,y;  
      
      
for(y = 0; y <= R; y++)  
{  
    for(x = 0; x <= R; x++)  
    {  
        if(x*x + y*y < R*R)  
          
            printf("**");  
        else  
            printf(" ");  
    }  
printf("\n");  
}  
return 0;  
}  
打印结果:
 
哈,这次看起来像那么回事,现在我们想想怎么打一个完整的圆?我们打印a quarter of circle是因为圆心在(0,0)处,接下来我们只要把圆心放到(R,R)处,同时把x,y的遍历范围扩大到2R就可以啦。代码如下:
 
[cpp] 
#include <stdio.h>  
  
int main()  
{  
    int R = 15;  
    int x,y;  
      
      
for(y = 0; y <= 2*R; y++)  
{  
    for(x = 0; x <= 2*R; x++)  
    {  
        if((x-R)*(x-R) + (y-R)*(y-R) < R*R)  
          
            printf("**");  
        else  
            printf(" ");  
    }  
printf("\n");  
}  
return 0;  
}  
打印结果:
 
我去,这个形- -! 我们看看代码,问题出在我们把星号改成两个,空格同时也得打印两个,修改之后代码如下:
 
[cpp]  
#include <stdio.h>  
  
int main()  
{  
    int R = 15;  
    int x,y;  
      
      
for(y = 0; y <= 2*R; y++)  
{  
    for(x = 0; x <= 2*R; x++)  
    {  
        if((x-R)*(x-R) + (y-R)*(y-R) < R*R)  
          
            printf("**");  
        else  
            printf(" ");//打印两个空格   
    }  
printf("\n");  
}  
return 0;  
}  
打印结果:
这次终于打印完美了(由于精度问题,不可能打印出标准的圆),暗爽^.^
 
 
接下来我们来讲我们的主题了,由于有之前的经验,问题时候很好解决椭圆的标准方程为 我们只要把标准方程的圆心改成(a,b),方程为(x-a)*(x-a)/(a*a) + (y-b)*(y-b)/(b*b)=1,并把圆中的变量R换成a,b变量就行了,为了美观我们把前面的俩星俩空格都换成一个代码如下:
 
[cpp] 
#include <stdio.h>  
  
int main()  
{  
    int a,b;  
    int x,y;  
    a = 5;  
    b= 8;  
      
for(y = 0; y <= 4*a; y++)  
{  
    for(x = 0; x <= 2*b; x++)  
    {  
        if((x-a)*(x-a)/(a*a) + (y-b)*(y-b)/(b*b)< 1)  
            printf("*");  
        else  
            printf(" ");  
    }  
printf("\n");  
}  
return 0;  
}  
打印结果:
 
额。。。忘了椭圆方程中有除法,应该把int x,y改成double x,y 代码如下:
 
[cpp]  
#include <stdio.h>  
  
int main()  
{  
    int a,b;  
    double x,y;  
    a = 5;  
    b= 8;  
      
for(y = 0; y <= 4*a; y++)  
{  
    for(x = 0; x <=  2*b; x++)  
    {  
        if((x-a)*(x-a)/(a*a) + (y-b)*(y-b)/(b*b)< 1)  
            printf("*");  
        else  
            printf(" ");  
    }  
printf("\n");  
}  
return 0;  
}  
打印结果:
大功告成!\( ̄) ̄)>
 
大家也可用同样的原理,打印出双曲线,抛物线
补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,