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

记得大一刚学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("*");
		else
			printf(" ");
	}
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("**");
		else
			printf(" ");
	}
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("**");
		else
			printf(" ");
	}
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("**");
		else
			printf(" ");//打印两个空格 
	}
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("*");
		else
			printf(" ");
	}
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("*");
		else
			printf(" ");
	}
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

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

猜你喜欢

转载自blog.csdn.net/nash_/article/details/8215279