哈哈,就是喜欢这些有意思的C语言
上篇文章是这样写的
c语言画谢宾斯基三角形
那篇文章写的有点不直接,然后再查了下资料,看到了下面这些,我觉得解释更加好,这里主要是运用了光栅法,至于光栅法,可以百度看看,后面我会再写文章理理。
我知道这样的原创文章,没有多少人会喜欢,但是我觉得很有意思,如果你也有意思,帮忙支持下。
如果我们想画一个正方形,要怎么画呢?
看代码
#include "stdio.h"#define h 20
#define w 40int main()
{int x,y;for(y=0;y<h;y++,putchar('\n'))for(x=0;x<w;x++)putchar('*');getchar();return 0;
}
程序输出
如果我要画一个三角形呢?
我们首先要知道的是三角形在坐标轴中的公式
先搞定一个直角三角形
我们使用c 语言字符的画,x ,y 轴和上面情况不同,实际如下图
直角三角形在坐标轴中的公式
所以,我们代码这样写
#include "stdio.h"#define h 20
#define w 40int f(int x,int y)
{return x <= y;
}int main()
{int x,y;for(y=0;y<h;y++,putchar('\n'))for(x=0;x<w;x++)putchar("* "[f(x,y)?0:1]);getchar();return 0;
}
但是如果要画一个普通的三角形呢?
很简单,还是看看数学的公式
要画出题目中的大三角形,我们可以使用绝对值
xc 表示x 轴坐标
#include "stdio.h"#define h 20
#define w 40int f(int x,int y)
{return abs(x - 20) <= y;
}int main()
{int x,y;for(y=0;y<h;y++,putchar('\n'))for(x=0;x<w;x++)putchar("* "[f(x,y)?0:1]);getchar();return 0;
}
程序输出:
如果我们想在坐标轴上画很多个三角形呢?
把上面的代码修改一下
#include "stdio.h"#define h 20
#define w 20/*画直角三角形的函数*/
int s(int x, int y) {return abs(x) <= y;
}/*直角三角形的坐标系 - 2,是为了偏移x坐标*/
int f(int x,int y)
{return s(x%6 -2,y%3);
}int main()
{int x,y;for(y=0;y<h;y++,putchar('\n'))for(x=0;x<w;x++){putchar("* "[f(x,y)?0:1]);putchar(' ');}getchar();return 0;
}
程序输出
但是这个三角形和之前说的谢宾斯基不一样
所以我们代码需要还修改下
#include "stdio.h"#define h 20
#define w 40/*画直角三角形的函数*/
int s(int x, int y) {return abs(x) <= y;
}/*y / 3 是三角形的行数,y / 3 * 3 是对每行三角形偏移半个三角形
(包括一个空白后三角形总宽是6),然后再偏移半个三角形 Mip大神写的*/
int f(int x,int y)
{return s((x + y / 3 * 3 + 3) % 6 - 2, y % 3);
}int main()
{int x,y;for(y=0;y<h;y++,putchar('\n'))for(x=0;x<w;x++){putchar("* "[f(x,y)?0:1]);putchar(' ');}getchar();return 0;
}
代码输出
现在就还差最后一步,就是怎么把一些多余的三角形给干掉?
使用 && 符号迎刃而解
#include "stdio.h"#define h 18
#define w 38/*画直角三角形的函数*/
int s(int x, int y) {return abs(x) <= y;
}/*y / 3 是三角形的行数,y / 3 * 3 是对每行三角形偏移半个三角形
(包括一个空白后三角形总宽是6),然后再偏移半个三角形 Mip大神写的*/
int f(int x,int y)
{return s(x-17,y)&&s((x + y / 3 * 3 + 3) % 6 - 2, y % 3);
}int main()
{int x,y;for(y=0;y<h;y++,putchar('\n')){for(x=0;x<w;x++){putchar("* "[f(x,y)?0:1]);putchar(' ');}}getchar();return 0;
}
代码输出
推荐阅读:
专辑|Linux文章汇总
专辑|程序人生
专辑|C语言
我的知识小密圈