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

  1. C语言不调用库函数画直线

    昨天写了一个代码,使用C语言画三角形,既然写了那个,那就继续画一条直线,这个也很有意思. C语言不调用库函数画一个三角形 直线的方程是 如下图所示 - - 斜率的范围 (-∞,+∞) 既然知道公式了, ...

  2. c语言内置画直线函数库,C语言不调用库函数画直线

    昨天写了一个代码,使用C语言画三角形,既然写了那个,那就继续画一条直线,这个也很有意思. C语言不调用库函数画一个三角形 直线的方程是 如下图所示 - - 斜率的范围 (-∞,+∞) 既然知道公式了, ...

  3. D3D11_Chili_Tutorial(2):画一个三角形

    文章目录 11:D3D初始化篇-- COM(Component Object Model) 12:D3D架构 / 交换链 13:初始化设备 14:调试层 15:智能指针 16:画一个三角形(上集) 1 ...

  4. 【Vulkan学习记录-基础篇-1】用Vulkan画一个三角形

    好久没有更新过博客了,上半年一直忙着找实习的事情,不过现在已经入职一段时间了,也可以抽出时间来继续整理一些内容,所以最近会尽量变得勤快一点来写博客. Vulkan是新一代的图形API,具有跨平台.高性 ...

  5. [html] 使用svg画一个三角形

    [html] 使用svg画一个三角形 效果 Screen Shot 2020-11-13 at 14 39 20 说明 svg 定义svg元素 viewBox 定义svg的画布大小,0 0 100 1 ...

  6. python画长方形的代码_python使用turtle画一个三角形、正方形(矩形或四边形)

    今天我们用python使用turtle库画一个三角形.一个正方形. 1.画一个三角形. 实现方法是先画一个直线,然后旋转120度,然后继续画直线.这样反复画三条直线后,就形成一个等边三角形.先看效果: ...

  7. 使用CSS画一个三角形

    效果图 全部代码 <!DOCTYPE html> <html> <head><title></title><style type=&q ...

  8. [css] CSS画一个三角形,CSS绘制空心三角形

    1.不同理解的边框 <div class="border"></div> .border {width: 50px;height: 50px;border: ...

  9. python使用turtle画一个三角形、正方形(矩形或四边形)

    今天我们用python使用turtle库画一个三角形.一个正方形. 1.画一个三角形. 实现方法是先画一个直线,然后旋转120度,然后继续画直线.这样反复画三条直线后,就形成一个等边三角形.先看效果: ...

最新文章

  1. 计算机技术在本专业方面的论文,计算机技术专业论文
  2. java spark persist,hadoop – 我的sparkDF.persist(DISK_ONLY)数据存储在哪里?
  3. Linux动态链接库的使用
  4. QT的QSignalTransition类的使用
  5. skywalking使用方法_SkyWalking 源码分析—— Collector Server Component 服务器组件
  6. php 修改excel内容吗,php更新修改excel中的内容例子
  7. 六:SpringCloud-Config
  8. php后台代码自动生成程序,Thinkphp自定义代码生成工具及用法说明(附下载地址)...
  9. JQuery jsonp使用小记
  10. UVA10603Fill题解--BFS
  11. 《Redis开发与运维》读书笔记三
  12. 【Tools】常用PDF转Word工具
  13. Java与完成端口IOCP
  14. 计算机重启是什么原因,电脑自动重启是什么原因以及如何解决【图文教程】
  15. 安卓逆向学习 之 KGB Messenger的writeup(2)
  16. 【LM】windows7 内部版本7601,此windows副本不是正版——已解决
  17. 如何用计算机计算概率,概率计算器与阶乘方程
  18. python基于PHP+MySQL的志愿者管理系统
  19. 计算机二级的Word知识点,计算机二级word知识点
  20. 搭建和设计框架robotframework,重点说明:(https://blog.csdn.net/nich2008/article/details/81296529)

热门文章

  1. 游戏提高性能 游戏降帧处理
  2. SQL Server CLR全功略之一---CLR介绍和配置
  3. 【记忆化搜索】bzoj3208 花神的秒题计划Ⅰ
  4. 避免Castle Windsor引起的内存泄露
  5. 【 2013华为杯编程大赛成都第三组前两题试题及答案】
  6. 【笔试记录】2021/3/10阿里
  7. python与android交互,Android客户端与Python服务器端的简单通信
  8. gitlab修改用户密码_CRM用户模块(用户密码修改)
  9. 【自动化测试】整理各种测试开发工具!持续更新
  10. Storm的通信机制