记录打印一个椭圆的有趣过程
记得大一刚学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++ ,