程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 記錄打印一個橢圓的有趣過程

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

編輯:C++入門知識

記得大一剛學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;   }   打印結果: 大功告成!\( ̄) ̄)>   大家也可用同樣的原理,打印出雙曲線,拋物線甚至正態分布等函數,感興趣的可以試試。   福利:這是高手的代碼打印出的心形圖案     上圖代碼如下:     [cpp]  #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;   }    

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved