C语言不调用库函数画一个三角形
這個是知乎上面的一個題目,非常有意思,晚上打球回來就下決心要寫代碼實現下,再加上自己剖析,讓大家明白一個三角形在坐標系中如何用C語言畫出來的。
https://www.zhihu.com/question/53832071/answer/1625616415
第一步就是要先構建一個坐標系,構建坐標系的方法我也是看了Yip的代碼受到的啟發,后面在畫圓等問題上屢試不爽。
—— 構建坐標系代碼
include?"stdio.h" int?main(){Vec?p,v[]?=?{{-20,-20},{-20,30},{20,20}};for(p.y?=?40;p.y>=?-40;p.y?-=2,putchar('\n'))for(p.x?=?-40;p.x?<=?40;p.x++)putchar('.'); }C語言字符的高度是寬度的兩倍,故此,我們y的范圍要是x的范圍1/2.
—— 程序輸出
................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. .................................................................................再把上面的圖放出來
通過各種查資料和計算,我發現了這樣的一個特點。
—— 他們的斜率
如果對這個規則不懂的,可以去自行查找資料
在坐標系里面,如何計算斜率呢?
—— 好了,有了這些之后,我們就開始寫代碼了
#include?"stdio.h"typedef?struct?{double?x,y; }?Vec;int?judge(Vec?p,Vec?v[3]){if(((p.y-v[0].y)*(v[1].x-v[0].x)?-?(p.x-v[0].x)*(v[1].y-v[0].y))?>?0?)?return?0;if(((p.y-v[2].y)*(v[1].x-v[2].x)?-?(p.x-v[2].x)*(v[1].y-v[2].y))?<?0?)return?0;if(((p.y-v[0].y)*(v[2].x-v[0].x)?-?(p.x-v[0].x)*(v[2].y-v[0].y))?<?0?)return?0;return?1; }int?main(){Vec?p,v[]?=?{{-20,-20},{-20,30},{20,20}};for(p.y?=?40;p.y>=?-40;p.y?-=2,putchar('\n'))for(p.x?=?-40;p.x?<=?40;p.x++)putchar(".@"[judge(p,v)]); }程序輸出
weiqifa@bsp-ubuntu1804:~/c$?gcc?elsfk.c?&&?./a.out ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ....................@............................................................ ....................@@@@@@@@@.................................................... ....................@@@@@@@@@@@@@@@@@............................................ ....................@@@@@@@@@@@@@@@@@@@@@@@@@.................................... ....................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@............................ ....................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.................... ....................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...................... ....................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@........................ ....................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.......................... ....................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@............................ ....................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.............................. ....................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................ ....................@@@@@@@@@@@@@@@@@@@@@@@@@@@.................................. ....................@@@@@@@@@@@@@@@@@@@@@@@@@.................................... ....................@@@@@@@@@@@@@@@@@@@@@@@...................................... ....................@@@@@@@@@@@@@@@@@@@@@........................................ ....................@@@@@@@@@@@@@@@@@@@.......................................... ....................@@@@@@@@@@@@@@@@@............................................ ....................@@@@@@@@@@@@@@@.............................................. ....................@@@@@@@@@@@@@................................................ ....................@@@@@@@@@@@.................................................. ....................@@@@@@@@@.................................................... ....................@@@@@@@...................................................... ....................@@@@@........................................................ ....................@@@.......................................................... ....................@............................................................ ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. .................................................................................做個簡單的解釋
typedef?struct?{double?x,y; }?Vec; Vec?p,v[]?=?{{-20,-20},{-20,30},{20,20}};我們很多時候說數據結構數據結構,這里就是在寫代碼的時候用到數據結構的時候了,結構體數組是非常常見的數據結構,通過數組把同類的數據柔和在一起。
我之前看的一個嵌入式溫控代碼,用RTOS實現的LED控制,也用這樣的方式控制邏輯。
????if(((p.y-v[0].y)*(v[1].x-v[0].x)?-?(p.x-v[0].x)*(v[1].y-v[0].y))?>?0?)?return?0;if(((p.y-v[2].y)*(v[1].x-v[2].x)?-?(p.x-v[2].x)*(v[1].y-v[2].y))?<?0?)return?0;if(((p.y-v[0].y)*(v[2].x-v[0].x)?-?(p.x-v[0].x)*(v[2].y-v[0].y))?<?0?)return?0;程序=數據結構+算法
上面的代碼體現出來的就是算法了。其實就是上面我說的斜率換算出來的,因為使用除法可能會有精度丟失,所以最后用乘法來判斷。
putchar(".@"[judge(p,v)]);這個代碼我之前在文章里面提到過,putchar輸出字符的函數,".@" 是字符串數組,".@"[0]和".@"[1] 可以獲取字符串中的字符。
就醬。
如果覺得文章有意思,請幫忙轉發在看,讓更多的人看到有意思的代碼,還可以認識有意思的我。
推薦閱讀:
專輯|Linux文章匯總
專輯|程序人生
專輯|C語言
我的知識小密圈
總結
以上是生活随笔為你收集整理的C语言不调用库函数画一个三角形的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安装IAR ewarm
- 下一篇: SQL插入数据时让ID从指定值自增