C语言不调用库函数画一个三角形
这个是知乎上面的一个题目,非常有意思,晚上打球回来就下决心要写代码实现下,再加上自己剖析,让大家明白一个三角形在坐标系中如何用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语言不调用库函数画一个三角形相关推荐
- C语言不调用库函数画直线
昨天写了一个代码,使用C语言画三角形,既然写了那个,那就继续画一条直线,这个也很有意思. C语言不调用库函数画一个三角形 直线的方程是 如下图所示 - - 斜率的范围 (-∞,+∞) 既然知道公式了, ...
- c语言内置画直线函数库,C语言不调用库函数画直线
昨天写了一个代码,使用C语言画三角形,既然写了那个,那就继续画一条直线,这个也很有意思. C语言不调用库函数画一个三角形 直线的方程是 如下图所示 - - 斜率的范围 (-∞,+∞) 既然知道公式了, ...
- D3D11_Chili_Tutorial(2):画一个三角形
文章目录 11:D3D初始化篇-- COM(Component Object Model) 12:D3D架构 / 交换链 13:初始化设备 14:调试层 15:智能指针 16:画一个三角形(上集) 1 ...
- 【Vulkan学习记录-基础篇-1】用Vulkan画一个三角形
好久没有更新过博客了,上半年一直忙着找实习的事情,不过现在已经入职一段时间了,也可以抽出时间来继续整理一些内容,所以最近会尽量变得勤快一点来写博客. Vulkan是新一代的图形API,具有跨平台.高性 ...
- [html] 使用svg画一个三角形
[html] 使用svg画一个三角形 效果 Screen Shot 2020-11-13 at 14 39 20 说明 svg 定义svg元素 viewBox 定义svg的画布大小,0 0 100 1 ...
- python画长方形的代码_python使用turtle画一个三角形、正方形(矩形或四边形)
今天我们用python使用turtle库画一个三角形.一个正方形. 1.画一个三角形. 实现方法是先画一个直线,然后旋转120度,然后继续画直线.这样反复画三条直线后,就形成一个等边三角形.先看效果: ...
- 使用CSS画一个三角形
效果图 全部代码 <!DOCTYPE html> <html> <head><title></title><style type=&q ...
- [css] CSS画一个三角形,CSS绘制空心三角形
1.不同理解的边框 <div class="border"></div> .border {width: 50px;height: 50px;border: ...
- python使用turtle画一个三角形、正方形(矩形或四边形)
今天我们用python使用turtle库画一个三角形.一个正方形. 1.画一个三角形. 实现方法是先画一个直线,然后旋转120度,然后继续画直线.这样反复画三条直线后,就形成一个等边三角形.先看效果: ...
最新文章
- 计算机技术在本专业方面的论文,计算机技术专业论文
- java spark persist,hadoop – 我的sparkDF.persist(DISK_ONLY)数据存储在哪里?
- Linux动态链接库的使用
- QT的QSignalTransition类的使用
- skywalking使用方法_SkyWalking 源码分析—— Collector Server Component 服务器组件
- php 修改excel内容吗,php更新修改excel中的内容例子
- 六:SpringCloud-Config
- php后台代码自动生成程序,Thinkphp自定义代码生成工具及用法说明(附下载地址)...
- JQuery jsonp使用小记
- UVA10603Fill题解--BFS
- 《Redis开发与运维》读书笔记三
- 【Tools】常用PDF转Word工具
- Java与完成端口IOCP
- 计算机重启是什么原因,电脑自动重启是什么原因以及如何解决【图文教程】
- 安卓逆向学习 之 KGB Messenger的writeup(2)
- 【LM】windows7 内部版本7601,此windows副本不是正版——已解决
- 如何用计算机计算概率,概率计算器与阶乘方程
- python基于PHP+MySQL的志愿者管理系统
- 计算机二级的Word知识点,计算机二级word知识点
- 搭建和设计框架robotframework,重点说明:(https://blog.csdn.net/nich2008/article/details/81296529)