如何优雅的使用C语言绘制一只小猪佩奇
今天我们来用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;
} 
两倍:
四倍:
参考:
如何优雅的使用C语言绘制一只小猪佩奇的更多相关文章
- R语言绘制相对性关系图
准备 第一步就是安装R语言环境以及RStudio 图绘制准备 首先安装库文件,敲入指令,回车 install.packages('corrplot') 然后安装excel导入的插件,点击右上角impo ...
- 一幅图解决R语言绘制图例的各种问题
一幅图解决R语言绘制图例的各种问题 用R语言画图的小伙伴们有木有这样的感受,"命令写的很完整,运行没有报错,可图例藏哪去了?""图画的很美,怎么总是图例不协调?" ...
- 实例15_C语言绘制万年历
实例说明:
- 运用python绘制小猪佩奇
用python绘制小猪佩奇 1.打开idle 2.点击File-New Files 3.输入以下代码 1. from turtle import * 2. 3. def nose(x,y):#鼻子 4 ...
- FastDFS是纯C语言实现,只支持Linux,适合以中小文件为载体的在线服务,还可以冗余备份和负载均衡
一.理论基础 FastDFS比较适合以中小文件为载体的在线服务,比如跟NGINX(APACHE)配合搭建图片服务器. 分布式文件系统FastDFS FastDFS是纯C语言实现,只支持Linux.Fr ...
- R语言绘制空间热力图
先上图 R语言的REmap包拥有非常强大的空间热力图以及空间迁移图功能,里面内置了国内外诸多城市坐标数据,使用起来方便快捷. 开始 首先安装相关包 install_packages("dev ...
- R语言绘制花瓣图flower plot
R语言中有很多现成的R包,可以绘制venn图,但是最多支持5组,当组别数大于5时,venn图即使能够画出来,看上去也非常复杂,不够直观: 在实际的数据分析中,组别大于5的情况还是经常遇到的,这是就可以 ...
- R语言绘制沈阳地铁线路图
##使用leaflet绘制地铁线路图,要求 ##(1)图中绘制地铁线路 library(dplyr) library(leaflet) library(data.table) stations< ...
- R语言绘制直方图,
直方图: 核密度函数: 练习题目1: 绘制出15位同学体重的直方图和核密度估计图,并与正态分布的概率密度函数作对比 代码如下: > w <- c(75.0, 64.0, 47.4, 66. ...
随机推荐
- svg拖拽和缩放
需求:做机房平面图,用svg实现拖拽和缩放,刚开始一头雾水,不知所措,好在皇天不负有心人........ 本文重点介绍拖拽,单纯实现很简单,但是由于vue项目,机房图有很多事件,拖拽就成了难点 简单介 ...
- Django—Cookie and Session
一.Cookie Cookie,有时也用其复数形式 Cookies,指某些网站为了辨别用户身份.进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密). 1. 应用 服务器可以利用Co ...
- JavaScript中实现DI的原理(二)
JavaScript中实现DI的原理 在JavaScript中实现DI,看起来难,实际上原理很简单,它的核心技术是Function对象的toString().我们都知道,对一个函数对象执行toStri ...
- Android fastjson
Fastjson介绍 Fastjson是一个Java语言编写的JSON处理器. 1.遵循http://json.org标准,为其官方网站收录的参考实现之一. 2.功能qiang打,支持JDK的各种类型 ...
- 139.00.006 Git学习-标签管理Tag
@(139 - Environment Settings | 环境配置) 一.Why 发布一个版本时,我们通常先在版本库中打一个标签(tag),这样,就唯一确定了打标签时刻的版本.将来无论什么时候,取 ...
- 如何编写自定义hive UDF函数
Hive可以允许用户编写自己定义的函数UDF,来在查询中使用.Hive中有3种UDF: UDF:操作单个数据行,产生单个数据行: UDAF:操作多个数据行,产生一个数据行. UDTF:操作一个数据行, ...
- Build 2016: 发布明天的云创新来服务今天的开发者
每个企业和行业都在被云潜移默化地改变着.随着云计算的速度.规模和灵活性的不断增加,云服务带来的可能性也在不断被拓展.想象一下,通过监测传感器,一位奶农能够将他的奶牛牛奶产量提高:或是一家医院能够自动监 ...
- 【NLP_Stanford课堂】拼写校正
在多种应用比如word中都有拼写检查和校正功能,具体步骤分为: 拼写错误检测 拼写错误校正: 自动校正:hte -> the 建议一个校正 建议多个校正 拼写错误类型: Non-word Err ...
- Redhat5.9安装qt5.5.1出错error while loading shared libraries:libX11-cxb.so.1 标签: qt5 2017-06-02 11
出错原因是缺少了共享库libX11-cxb.so.1,是由于系统版本过低所致:重新安装红帽6.5即可解决该问题.
- January 14 2017 Week 2nd Saturday
Don't try so hard, the best things come when you least expect them to. 不要着急,最好的总会在最不经意时出现. The secon ...