今天我们来用C语言画一只小猪佩奇---社会、社会....
在画小猪佩奇之前,我们先使用带符号的距离长 (signed distance field,SDF) 来画一个圆形。

使用这个方法表示形状,但是这次我们使用 ASCⅡ 字符 \/=\ 画出形状的外框,并填充内部,类似这样:

  =====

//.....\\

||.....||

\\....//    

  =====

SDF 的梯度(gradient)代表 SDF 变化最大的方向,可用这个方向去决定用哪一个字符。

我们通过差分求 SDF 的梯度近似值,然后用 atan2() 求出梯度的角度:

用 C 语言简单实现,在 [-1, 1] x [-1, 1] 画布中画一个半径 0.8 并带有 0.1 宽度外框的圆形: 
#include <math.h>
#include <stdio.h>
#define T double

T f(T x, T y)
{
  return sqrt(x x + y y) - 0.8f;
}

char outline(T x, T y)
{

   T delta = 0.001;
  if (fabs(f(x, y)) < 0.05)
  {
    T dx = f(x + delta, y) - f(x - delta, y);
    T dy = f(x, y + delta) - f(x, y - delta);
    return "|/=\|/=\|"[(int)((atan2(dy, dx) / 6.2831853072 + 0.5) * 8 + 0.5)];
  }
  else if (f(x, y) < 0)
  {
    return '.';
  }
  else
  {
  return ' ';

  }
}

int main()
{
  for (T i = -1; i < 1; i += 0.05, putchar('\n'))
  {
    for (T j = -1; j < 1; j += 0.025)
    {
      putchar(outline(j, i));
    } 

  }
  getchar();
  return 0;
}

然后,我们就可以通过画多个圆形,把它们适当地旋转和缩放,用构造实体几何比它们组合起来,从而就可以画出小猪佩奇了:

#include <math.h> #include <stdio.h> #include <stdlib.h> #define T double

T c(T x, T y, T r)
{
  return sqrt(x x + y y) - r;
}

T u(T x, T y, T t)
{
  return x cos(t) + y sin(t);
}

T v(T x, T y, T t)
{
  return y cos(t) - x sin(t);

}

T fa(T x, T y)

{

   return fmin(c(x, y, 0.5), c(x * 0.47 + 0.15, y + 0.25, 0.3));

}

T no(T x, T y)
{
  return c(x * 1.2 + 0.97, y + 0.25, 0.2);
}

T nh(T x, T y)

{   

   return fmin(c(x + 0.9, y + 0.25, 0.03), c(x + 0.75, y + 0.25, 0.03));

}

T ea(T x, T y)
{
  return fmin(c(x 1.7 + 0.3, y + 0.7, 0.15), c(u(x, y, 0.25) 1.7, v(x, y, 0.25) + 0.65, 0.15));
}

T ey(T x, T y)
{
  return fmin(c(x + 0.4, y + 0.35, 0.1), c(x + 0.15, y + 0.35, 0.1));
}

T pu(T x, T y)
{
  return fmin(c(x + 0.38, y + 0.33, 0.03), c(x + 0.13, y + 0.33, 0.03));
}

T fr(T x, T y)
{
  return c(x * 1.1 - 0.3, y + 0.1, 0.15);
}

T mo(T x, T y)
{
  return fmax(c(x + 0.15, y - 0.05, 0.2), -c(x + 0.15, y, 0.25));
}

T o(T x, T y, T(f)(T, T), T i)
{
  
T r =f(x, y);

  return fabs(r) < 0.02 ? (atan2(f(x, y + 1e-3) - r, f(x + 1e-3, y) - r) + 0.3) 1.273 + 6.5 : r < 0 ? i : 0;
}

T s(T x, T y, T(*f)(T, T), T i)
{
  return f(x, y) < 0 ? i : 0;
}

T f(T x, T y)
{
  return o(x, y, no, 1) ? fmax(o(x, y, no, 1), s(x, y, nh, 12)) : fmax(o(x, y, fa, 1), fmax(o(x, y, ey, 11), fmax(o(x, y, ea, 1), fmax(o(x, y, mo, 1), fmax(s(x, y, fr, 13), s(x, y, pu, 12))))));
}

int main(int a, char **b)
{
  for (T y = -1, s = a > 1 ? strtod(b[1], 0) : 1; y < 0.6; y += 0.05 / s, putchar('\n'))
  {
    for (T x = -1; x < 0.6; x += 0.025 / s)
    {
      putchar(" .|/=\|/=\| @!"[(int)f(u(x, y, 0.3), v(x, y, 0.3))]);
    }  
  }
  getchar();
  return 0;
}

两倍:

四倍:

参考:

知乎Milo Yip

转载于:https://www.cnblogs.com/momoowo/p/9192488.html

如何优雅的使用C语言绘制一只小猪佩奇相关推荐

  1. c语言画猪程序,C/C++知识点之如何优雅的使用C语言绘制一只小猪佩奇

    本文主要向大家介绍了C/C++知识点之如何优雅的使用C语言绘制一只小猪佩奇,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助. 今天我们来用C语言画一只小猪佩奇---社会.社会.... ...

  2. 用c语言编程画一只猪,如何优雅的使用C语言绘制一只小猪佩奇

    今天我们来用C语言画一只小猪佩奇---社会.社会.... 在画小猪佩奇之前,我们先使用带符号的距离长 (signed distance field,SDF) 来画一个圆形. 使用这个方法表示形状,但是 ...

  3. python绘制小猪佩奇程序设计大作业_代码绘制一只小猪佩奇---python篇

    今天教大家用python的pillow包来绘制小猪佩奇,python的安装就不用多说了,直接上代码吧 0.首先当然是安装pillow包啦. 关于pillow库的安装有几种方式 最常使用的是pip安装 ...

  4. python小猪代码_代码绘制一只小猪佩奇---python篇

    今天教大家用python的pillow包来绘制小猪佩奇,python的安装就不用多说了,直接上代码吧 0.首先当然是安装pillow包啦. 关于pillow库的安装有几种方式 最常使用的是pip安装 ...

  5. c语言画一只小猪佩奇

    /* 小猪佩奇 */ #include <math.h> #include <stdio.h> #include <stdlib.h> #define T doub ...

  6. C语言/C++基础之小猪佩奇

    C语言/C++基础之小猪佩奇 程序之美 前言 主体 运行结果一 代码示例一 运行结果二 代码示例二 运行结果三 代码示例三 结束语 程序之美 前言 <小猪佩奇>,又译作<粉红猪小妹& ...

  7. 惊呆了!C语言也能画小猪佩奇?【附源码】社会我佩奇哥!

    社会我佩奇兄那么火,那么我们接下来就分享下如何用 C语言 画小猪佩奇 使用带符号距离场(signed distance field, SDF)表示圆形: 沿用这个方法表示形状,但这次我们想利用 ASC ...

  8. c语言三只小猪 程序框图,语言教案:三只小猪盖房子

    三只小猪盖房子_300字从前有三只小猪,它们各在一片空地上盖房子.第一只小猪盖的是草房,第二只小猪盖的是木房,第三只小猪盖的是砖房.有一天,大灰狼来了,大灰狼来到三只小猪门前说:"小猪们,你 ...

  9. 学习笔记(2):Python解析器的安装以及通过python绘制玫瑰花和小猪佩奇-python语言的重点介绍+酷炫案例的展示

    立即学习:https://edu.csdn.net/course/play/29172/409836?utm_source=blogtoedu 以案列为驱动去进行学习 python第一部分基础 pyt ...

最新文章

  1. 修改android studio中的avd sdk路径、avd sdk找不到的解决方案
  2. Redis 的各项功能解决了哪些问题?
  3. 取代java_为什么C++没有被java取代
  4. 第四十三期:Wireshark网络分析就这么简单,你一定会喜欢的技巧
  5. Python 数据分析三剑客之 Matplotlib(一):初识 Matplotlib 与其 matplotibrc 配置文件
  6. 在线生成艺术字_生成艺术:如何修改绘画
  7. python写入excel表格数据绘制图表_(原创)xlsxwriter,python excel 写入数据\图表等操作_图表操作(二)...
  8. 案例1_公司简介(修改)
  9. 前轮转向最大角度设计原来_转向不足是怎么回事?我们怎么去改变这种特性
  10. 用 Graphviz+pvtrace 可视化函数调用
  11. 74LS138设计一位二进制全减器
  12. c语言编写矩阵逆置乘法,200个c语言实例的源码
  13. Legion 一款网络渗透工具
  14. [ERROR] Error executing Maven.
  15. Wireshark抓包详细分析
  16. Android指南针代码示例
  17. Google Earth上划定矢量范围并导出为KMZ文件
  18. 互斥锁(mutex lock)
  19. QT 管理win系统服务
  20. 五、Zabbix — 监控报警那点事儿

热门文章

  1. ZJM 与霍格沃兹(字符串哈希)
  2. oracle apex 日志,Oracle Apex 实用笔记系列 1 - Oracle Apex 调试技巧
  3. html盒子里的内容溢出,[经验] HTML页面中子盒子溢出了怎么办
  4. 戴尔硬件服务器参数,戴尔_PowerEdge R540_机架式服务器参数_服务器推荐购买 | Dell 中国大陆...
  5. 《web开发: 数据可视化(Echarts)介绍》
  6. 201621123030《Java程序设计》第5周学习总结
  7. 产品思维训练 | 为什么很多家喻户晓的品牌还要继续投广告?
  8. linux环境下如何重装系统,linux 怎么重装系统?
  9. PMP——第3章 项目经理的角色
  10. 数据库建模工具Aquarius Orm Studio发布正式版本