记录打印一个椭圆的有趣过程
来源:互联网 发布: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
===================================================================================================
- 记录打印一个椭圆的有趣过程
- 一个有趣的打印菱形的程序
- C中一个有趣的打印
- 关于打印一个有趣的数字图形的问题
- 记录: 看thinkphp源码,发现一个有趣的除法 计算
- 有趣的调试过程
- 有趣的3D打印
- 有趣的图形打印1
- 有趣的图形打印2
- 一个有趣的游戏
- 一个有趣的故事
- 看到一个有趣的
- 一个有趣的故事
- 一个有趣的现象
- 一个有趣的数学公式
- 一个有趣的javascript
- 一个有趣的程序
- 一个有趣的学习方法
- JS的Document属性和方法
- java逐行读取txt文本中文乱码解决方案
- 使用Dev-Cpp/MinGW来生成wxWidget SDL是一组包含若干媒体操作的工具库
- Linux内核内存分配函数
- 在VBA中设置单元格的对齐方式
- 记录打印一个椭圆的有趣过程
- java中list数据拆分为sublist实现分页的简单代码
- sql server2012 远程访问设置
- Windows忘记mysql密码的解决方案
- MKMapView
- 新建android项目gen目录下未生成R文件解决方案
- ORACLE 官方下载地址
- 本地开发博客搬家啦
- View中的setTag/getTag