記錄列印一個橢圓的有趣過程

來源:互聯網
上載者:User

記得大一剛學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

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.