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

来源:互联网 发布:lol老提示网络异常 编辑:程序博客网 时间:2024/05/16 05:30

记得大一刚学C语言的时候,书后有道打印三角形的题,记得当时做了一个多小时才做出来,相信大家初学编程也做过类似的问题,今天突发奇想想打印个特殊曲线,于是把目标锁定为打印一个椭圆,大家都知道编程语言打印输出一个图形,如果它是单调递增或者单调递减是非常容易的,如果非单调的函数就得费一些周折。椭圆不是单调函数应该怎么快速打印呢首先因为圆是特殊的椭圆,所以我们先想想如何打印圆形,我们可以先想把圆分成1/4,一个1/4圆当然是单调的嘛,利用x*x + y*y = r*r这个圆的标准方程打印输出,代码如下:

#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("*");elseprintf(" ");}printf("\n");}}

打印结果:

诶妈呀,咋出个这个畸形?我们仔细看会发现,原因是圆的行间距和列间距不同造成的,解决方法是把打印一个星‘*’,改成打印两个星‘**’就成了,代码如下:

#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("**");elseprintf(" ");}printf("\n");}return 0;}
打印结果:

哈,这次看起来像那么回事,现在我们想想怎么打一个完整的圆?我们打印a quarter of circle是因为圆心在(0,0)处,接下来我们只要把圆心放到(R,R)处,同时把x,y的遍历范围扩大到2R就可以啦。代码如下:

#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("**");elseprintf(" ");}printf("\n");}return 0;}
打印结果:



我去,这个形- -! 我们看看代码,问题出在我们把星号改成两个,空格同时也得打印两个,修改之后代码如下:

#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("**");elseprintf(" ");//打印两个空格 }printf("\n");}return 0;}
打印结果:


这次终于打印完美了(由于精度问题,不可能打印出标准的圆),暗爽^.^


接下来我们来讲我们的主题了,由于有之前的经验,问题时候很好解决椭圆的标准方程为 我们只要把标准方程的圆心改成(a,b),方程为(x-a)*(x-a)/(a*a) + (y-b)*(y-b)/(b*b)=1,并把圆中的变量R换成a,b变量就行了,为了美观我们把前面的俩星俩空格都换成一个代码如下:

#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("*");elseprintf(" ");}printf("\n");}return 0;}
打印结果:



额。。。忘了椭圆方程中有除法,应该把int x,y改成double x,y 代码如下:

#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("*");elseprintf(" ");}printf("\n");}return 0;}
打印结果:


大功告成!\( ̄) ̄)>

大家也可用同样的原理,打印出双曲线,抛物线甚至正态分布等函数,感兴趣的可以试试。

福利:这是高手的代码打印出的心形图案

上图代码如下:

#include <stdio.h>#include <math.h>int main(){  double x,y;  int H = 3;         for(y = -4;y <= 0;y += 0.3)    {    for(x = -4; x <= 4;  x+= 0.2)    if(fabs(sqrt(x*x+y*y) - H*sin(2*atan(y/x))) <= 1 ||fabs(sqrt(x*x+y*y) - H*sin(2*atan(-y/x))) <= 1)    printf("*");    else    printf(" ");    printf("\n");    }    for(y=-1;y<=0;y+=0.2)    {    for(x=-4;x<=4;x+=0.2)    if(fabs(y)-0.65*x*x>=0.2)    printf("*");    else printf(" ");    printf("\n");    };return 0;}



==================================================================================================

  作者:nash_  欢迎转载,与人分享是进步的源泉!

  转载请保留原文地址http://blog.csdn.net/nash_/article/details/8215279

===================================================================================================

原创粉丝点击