剖析C语言是如何画出这样的三角形的

哈哈,就是喜欢这些有意思的C语言

上篇文章是这样写的

c语言画谢宾斯基三角形

那篇文章写的有点不直接,然后再查了下资料,看到了下面这些,我觉得解释更加好,这里主要是运用了光栅法,至于光栅法,可以百度看看,后面我会再写文章理理。

我知道这样的原创文章,没有多少人会喜欢,但是我觉得很有意思,如果你也有意思,帮忙支持下。

如果我们想画一个正方形,要怎么画呢?

看代码

#include "stdio.h"

#define h 20
#define w 40

int main()
{
 int x,y;
 for(y=0;y<h;y++,putchar('\n'))
  for(x=0;x<w;x++)
   putchar('*');
 
 getchar();
 return 0;
}

程序输出

img

如果我要画一个三角形呢?

我们首先要知道的是三角形在坐标轴中的公式

先搞定一个直角三角形

我们使用c 语言字符的画,x ,y 轴和上面情况不同,实际如下图

直角三角形在坐标轴中的公式

所以,我们代码这样写

#include "stdio.h"

#define h 20
#define w 40

int 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 40

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

我的知识小密圈

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值