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语言

我的知识小密圈

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/466820.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JS高级——变量提升

JS执行过程 1、首先是预解析&#xff1a;预解析过程最重要的是提升&#xff0c;在JavaScript代码在预解析阶段&#xff0c;会对以var声明的变量名&#xff0c;和function开头的语句块&#xff0c;进行提升操作 2、执行操作 全局中解析和执行过程 <script>console.log(a);…

图像多分类——卷积神经网络

例子参考&#xff1a;https://www.jiqizhixin.com/articles/2019-05-15-2 数据集&#xff1a;https://www.cs.ccu.edu.tw/~wtchu/projects/MoviePoster/index.html 将获取到原始数据集&#xff0c;其中&#xff0c;有三个文件&#xff0c; Movie Poster Dataset是1980-2015年…

学习C++,知识点太多记不住怎么办?

学习一门新的编程语言之前&#xff0c;你首先会做什么&#xff1f;先熟悉变量、运算符、函数、类和结构、测试等工具&#xff0c;随后按照指导按部就班进行操作&#xff1f;这样的流程对于学习其他语言如Python、Java来说或许行得通&#xff0c;但C的话&#xff0c;够呛。想要真…

C语言编程规范 clean code

目的规则并不是完美的&#xff0c;通过禁止在特定情况下有用的特性&#xff0c;可能会对代码实现造成影响。但是我们制定规则的目的“为了大多数程序员可以得到更多的好处”&#xff0c; 如果在团队运作中认为某个规则无法遵循&#xff0c;希望可以共同改进该规则。参考该规范之…

DataWhale组队-Pandas(下)缺失数据(打卡)

1.缺失值概要 数据的缺失主要包括记录的缺失和记录中某个字段信息的缺失&#xff0c;两者都会造成分析结果的不准确&#xff0c;以下从缺失值产生的原因及影响扥方面展开分析。 &#xff08;1&#xff09;缺失值产生的原因 1&#xff09;有些信息暂时无法获取&#xff0c;或…

南橘北枳

春秋战国时期&#xff0c;智者晏子曾经说过一句话&#xff1a;“桔生淮南为橘&#xff0c;生于淮北为枳”&#xff0c;说的是淮南香甜的橘子移植到淮北就变成苦涩难吃的枳。因为事物的条件和环境等变了&#xff0c;所以才会这样。这句话现在大多是针对人品说的&#xff0c;大概…

用C语言字符画圆

用C语言画圆&#xff0c;这是一是算法的问题&#xff0c;我们知道&#xff0c;程序是由数据结构加算法组成的&#xff0c;研究这类东西&#xff0c;其实也是研究算法的问题&#xff0c;是比较有意思的。圆心为0的时候&#xff0c;圆的公式公式&#xff1a;那我们要如何写代码呢…

Linux C目标文件

LinuxC目标文件 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 一、目标文件格式&#xff08;ELF格式&#xff09; 编译器编译源代码后生成的文件叫做目标文件。目标文件是已经编译后的可执行文件&#xff0c;只是还没有经过链接的过程。 PC平台流行…

Win2003下Exchange2003部署图解之七

Exchange 2003 基本配置在邮件服务器SERVERVM下打开“第一个存储组”&#xff0c;&#xff08;这里我们只看到一个缺省的存储组&#xff0c;在Exchange2003标准版中我们只能建立一个存储组&#xff0c;而企业版中我们可以建立4个存储组&#xff09;选择“邮箱存储”&#xff0c…

嵌入式Linux操作UART实例

1引言串口是我们实际工作中经常使用的一个接口&#xff0c;比如我们在Linux下使用的debug串口&#xff0c;它用来登录Linux系统&#xff0c;输出log。另外我们也会使用串口和外部的一些模块通信&#xff0c;比如GPS模块、RS485等。这里对Linux下串口使用做个总结&#xff0c;希…

Datawhale组队-Pandas(下)文本数据(打卡)

一、string类型的性质 1.string和object的区别 string类型和object不同之处有三&#xff1a; 字符存取方法&#xff08;string accessor methods&#xff0c;如str.count&#xff09;会返回相应数据的Nullable类型&#xff0c;而object会随缺失值的存在而改变返回类型某些Se…

sql语句遇到的问题

分别统计所有男同学的平均分&#xff0c;所有女同学的平均分及总平均分 //SELECT AVG(score),name,(SELECT AVG(score) FROM student) as 总平均分 from student GROUP BY sex; 按照分数从小到大的顺序打印分数大于总平均分的学员信息(id-name-sex-score),并将分数大于总平均分…

新唐单片机代码评审总结

昨晚上&#xff0c;我们一个同事组织了一个小会议&#xff0c;大家一起讨论了一个项目的单片机代码&#xff0c;这个单片机用的是新唐单片机&#xff0c;期间大家也讨论了一些问题&#xff0c;总结一下&#xff0c;希望对写单片机的同学们有帮助。我这个同事写的代码非常优秀&a…

Datawhale组队-Pandas(下)分类数据(打卡)

Categoricals是pandas的一种数据类型&#xff0c;对应于统计学中的Categorical variables&#xff08;分类变量&#xff09;&#xff0c;分类变量是有限且固定的可能值&#xff0c;例如&#xff1a;gender&#xff08;性别&#xff09;、血型、国籍等&#xff0c;与统计学的Cat…

【分享】一个集成tracert和ping的网络监测工具

最近接到一个需求&#xff0c;需求背景是这样的&#xff1a;目前Windows平台下本身都有tracert和ping的实现&#xff0c;而且可以直接在cmd下使用。 需求中有两个要求&#xff1a; 1. Windows平台中的tracert执行速度太慢&#xff0c;一次tracert可能要花十几分钟。所以&#x…

秀操作 | 函数宏的三种封装方式

作者&#xff1a;☆星轨★ 链接&#xff1a;https://blog.csdn.net/qq_35692077/article/details/1029949591. 函数宏介绍函数宏&#xff0c;即包含多条语句的宏定义&#xff0c;其通常为某一被频繁调用的功能的语句封装&#xff0c;且不想通过函数方式封装来降低额外的弹栈压…

Datawhale组队-Pandas(下)时序数据(打卡)

Pandas可以处理任何领域的时序数据&#xff08;time series&#xff09;&#xff0c;使用Numpy的datetime64 和timedelta64 类型&#xff0c;Pandas整合了来自其他Python库的大量功能&#xff0c;如Scikits.TimeSeries&#xff0c;并为处理时间序列数据创建了大量新功能。 一、…

解析一个C语言俄罗斯方块游戏,包你看了就会

最近在看俄罗斯方块的游戏&#xff0c;看到一个大神写的俄罗斯方块代码&#xff0c;非常非常优秀&#xff0c;拿出来解析给大家看看&#xff0c;也希望大家自己尝试运行试试&#xff0c;从中能得到一些启发。#先了解下俄罗斯方块的几个形状一共分成 7 形状&#xff0c;有的形状…

认识星座、八大行星的观察

1. 北斗七星 北斗七星属于大熊座&#xff0c;春夏可见&#xff1b;2. 八大行星 太阳系的八大行星基本位于同一轨道面&#xff0c;如以地球轨道面为基准&#xff0c;相互间轨道倾角的差距甚至不到5度&#xff08;不包括水星&#xff09;。太阳系各大行星公转平面与地球黄道平面的…

Datawha组队——Pandas(下)综合练习(打卡)

import pandas as pd import numpy as np import missingno as msno import matplotlib.pyplot as plt plt.rcParams[font.sans-serif][SimHei] #用来正常显示中文标签 plt.rcParams[axes.unicode_minus]False #用来正常显示负号#读取数据 df pd.read_csv(端午粽子数据.csv) d…