这个是知乎上面的一个题目,非常有意思,晚上打球回来就下决心要写代码实现下,再加上自己剖析,让大家明白一个三角形在坐标系中如何用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语言
我的知识小密圈