三角形C语言函数程序怎么写,C语言不调用库函数画一个三角形

这个是知乎上面的一个题目,非常有意思,晚上打球回来就下决心要写代码实现下,再加上自己剖析,让大家明白一个三角形在坐标系中如何用C语言画出来的。https://www.zhihu.com/question/53832071/answer/1625616415

4edb8d8030114bd33ef48fb3d6ac2da7.png

第一步就是要先构建一个坐标系,构建坐标系的方法我也是看了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.

—— 程序输出.................................................................................

.................................................................................

.................................................................................

.................................................................................

.................................................................................

.................................................................................

.................................................................................

.................................................................................

.................................................................................

.................................................................................

.................................................................................

.................................................................................

.................................................................................

.................................................................................

.................................................................................

.................................................................................

.................................................................................

.................................................................................

.................................................................................

.................................................................................

.................................................................................

.................................................................................

.................................................................................

.................................................................................

.................................................................................

.................................................................................

.................................................................................

.................................................................................

.................................................................................

.................................................................................

.................................................................................

.................................................................................

.................................................................................

.................................................................................

.................................................................................

.................................................................................

.................................................................................

.................................................................................

.................................................................................

.................................................................................

.................................................................................

再把上面的图放出来

4edb8d8030114bd33ef48fb3d6ac2da7.png

通过各种查资料和计算,我发现了这样的一个特点。

—— 他们的斜率

如果对这个规则不懂的,可以去自行查找资料

在坐标系里面,如何计算斜率呢?

—— 好了,有了这些之后,我们就开始写代码了#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)) 

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)) 

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)) 

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)) 

return 0;

程序=数据结构+算法

上面的代码体现出来的就是算法了。其实就是上面我说的斜率换算出来的,因为使用除法可能会有精度丢失,所以最后用乘法来判断。putchar(".@"[judge(p,v)]);

这个代码我之前在文章里面提到过,putchar输出字符的函数,".@" 是字符串数组,".@"[0]和".@"[1] 可以获取字符串中的字符。

就酱。

来自公众号:嵌入式Linux

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值