C语言不调用库函数画一个三角形
這個(gè)是知乎上面的一個(gè)題目,非常有意思,晚上打球回來就下決心要寫代碼實(shí)現(xiàn)下,再加上自己剖析,讓大家明白一個(gè)三角形在坐標(biāo)系中如何用C語言畫出來的。
https://www.zhihu.com/question/53832071/answer/1625616415
第一步就是要先構(gòu)建一個(gè)坐標(biāo)系,構(gòu)建坐標(biāo)系的方法我也是看了Yip的代碼受到的啟發(fā),后面在畫圓等問題上屢試不爽。
—— 構(gòu)建坐標(biāo)系代碼
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.
—— 程序輸出
................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. .................................................................................再把上面的圖放出來
通過各種查資料和計(jì)算,我發(fā)現(xiàn)了這樣的一個(gè)特點(diǎn)。
—— 他們的斜率
如果對(duì)這個(gè)規(guī)則不懂的,可以去自行查找資料
在坐標(biāo)系里面,如何計(jì)算斜率呢?
—— 好了,有了這些之后,我們就開始寫代碼了
#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 ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ....................@............................................................ ....................@@@@@@@@@.................................................... ....................@@@@@@@@@@@@@@@@@............................................ ....................@@@@@@@@@@@@@@@@@@@@@@@@@.................................... ....................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@............................ ....................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.................... ....................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...................... ....................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@........................ ....................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.......................... ....................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@............................ ....................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.............................. ....................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................ ....................@@@@@@@@@@@@@@@@@@@@@@@@@@@.................................. ....................@@@@@@@@@@@@@@@@@@@@@@@@@.................................... ....................@@@@@@@@@@@@@@@@@@@@@@@...................................... ....................@@@@@@@@@@@@@@@@@@@@@........................................ ....................@@@@@@@@@@@@@@@@@@@.......................................... ....................@@@@@@@@@@@@@@@@@............................................ ....................@@@@@@@@@@@@@@@.............................................. ....................@@@@@@@@@@@@@................................................ ....................@@@@@@@@@@@.................................................. ....................@@@@@@@@@.................................................... ....................@@@@@@@...................................................... ....................@@@@@........................................................ ....................@@@.......................................................... ....................@............................................................ ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. ................................................................................. .................................................................................做個(gè)簡(jiǎn)單的解釋
typedef?struct?{double?x,y; }?Vec; Vec?p,v[]?=?{{-20,-20},{-20,30},{20,20}};我們很多時(shí)候說數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu),這里就是在寫代碼的時(shí)候用到數(shù)據(jù)結(jié)構(gòu)的時(shí)候了,結(jié)構(gòu)體數(shù)組是非常常見的數(shù)據(jù)結(jié)構(gòu),通過數(shù)組把同類的數(shù)據(jù)柔和在一起。
我之前看的一個(gè)嵌入式溫控代碼,用RTOS實(shí)現(xiàn)的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;程序=數(shù)據(jù)結(jié)構(gòu)+算法
上面的代碼體現(xiàn)出來的就是算法了。其實(shí)就是上面我說的斜率換算出來的,因?yàn)槭褂贸赡軙?huì)有精度丟失,所以最后用乘法來判斷。
putchar(".@"[judge(p,v)]);這個(gè)代碼我之前在文章里面提到過,putchar輸出字符的函數(shù),".@" 是字符串?dāng)?shù)組,".@"[0]和".@"[1] 可以獲取字符串中的字符。
就醬。
如果覺得文章有意思,請(qǐng)幫忙轉(zhuǎn)發(fā)在看,讓更多的人看到有意思的代碼,還可以認(rèn)識(shí)有意思的我。
推薦閱讀:
專輯|Linux文章匯總
專輯|程序人生
專輯|C語言
我的知識(shí)小密圈
總結(jié)
以上是生活随笔為你收集整理的C语言不调用库函数画一个三角形的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安装IAR ewarm
- 下一篇: 【HarmonyOS】【Json解析】Z