首页 文章详情

C语言不调用库函数画一个三角形

嵌入式Linux | 337 2020-12-17 21:14 0 0 0
UniSMS (合一短信)

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

good-icon 0
favorite-icon 0
收藏
回复数量: 0
    暂无评论~~
    Ctrl+Enter