本文转自知乎:http://www.zhihu.com/question/20187195                Milo Yip大神的回答

#include <stdio.h>int main() {for (float y = 1.5f; y > -1.5f; y -= 0.1f) {for (float x = -1.5f; x < 1.5f; x += 0.05f) {float a = x * x + y * y - 1;putchar(a * a * a - x * x * y * y * y <= 0.0f ? '*' : ' ');}putchar('\n');}
}

再来个有花纹的。(这其实是该函数的Level set)

#include <stdio.h>int main() {for (float y = 1.5f; y > -1.5f; y -= 0.1f) {for (float x = -1.5f; x < 1.5f; x += 0.05f) {float z = x * x + y * y - 1;float f = z * z * z - x * x * y * y * y;putchar(f <= 0.0f ? ".:-=+*#%@"[(int)(f * -8.0f)] : ' ');}putchar('\n');}
}

简单使用迭代法求解,用Finite difference求法矢量,用wrapped diffuse着色。

#include <stdio.h>
#include <math.h>float f(float x, float y, float z) {float a = x * x + 9.0f / 4.0f * y * y + z * z - 1;return a * a * a - x * x * z * z * z - 9.0f / 80.0f * y * y * z * z * z;
}float h(float x, float z) {for (float y = 1.0f; y >= 0.0f; y -= 0.001f)if (f(x, y, z) <= 0.0f)return y;return 0.0f;
}int main() {for (float z = 1.5f; z > -1.5f; z -= 0.05f) {for (float x = -1.5f; x < 1.5f; x += 0.025f) {float v = f(x, 0.0f, z);if (v <= 0.0f) {float y0 = h(x, z);float ny = 0.01f;float nx = h(x + ny, z) - y0;float nz = h(x, z + ny) - y0;float nd = 1.0f / sqrtf(nx * nx + ny * ny + nz * nz);float d = (nx + ny - nz) * nd * 0.5f + 0.5f;putchar(".:-=+*#%@"[(int)(d * 5.0f)]);}elseputchar(' ');}putchar('\n');}
}

「3D」版,简单使用迭代法求解,用Finite difference求法矢量,用wrapped diffuse着色。

#include <stdio.h>
#include <math.h>float f(float x, float y, float z) {float a = x * x + 9.0f / 4.0f * y * y + z * z - 1;return a * a * a - x * x * z * z * z - 9.0f / 80.0f * y * y * z * z * z;
}float h(float x, float z) {for (float y = 1.0f; y >= 0.0f; y -= 0.001f)if (f(x, y, z) <= 0.0f)return y;return 0.0f;
}int main() {for (float z = 1.5f; z > -1.5f; z -= 0.05f) {for (float x = -1.5f; x < 1.5f; x += 0.025f) {float v = f(x, 0.0f, z);if (v <= 0.0f) {float y0 = h(x, z);float ny = 0.01f;float nx = h(x + ny, z) - y0;float nz = h(x, z + ny) - y0;float nd = 1.0f / sqrtf(nx * nx + ny * ny + nz * nz);float d = (nx + ny - nz) * nd * 0.5f + 0.5f;putchar(".:-=+*#%@"[(int)(d * 5.0f)]);}elseputchar(' ');}putchar('\n');}
}

把「3D版」输出至PPM文件,可以用Photoshop打开。另外降低了ny的值导致有超有趣的pattern,就保留下来吧。

#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif
#include <stdio.h>
#include <math.h>float f(float x, float y, float z) {float a = x * x + 9.0f / 4.0f * y * y + z * z - 1;return a * a * a - x * x * z * z * z - 9.0f / 80.0f * y * y * z * z * z;
}float h(float x, float z) {for (float y = 1.0f; y >= 0.0f; y -= 0.001f)if (f(x, y, z) <= 0.0f)return y;return 0.0f;
}int main() {FILE* fp = fopen("heart.ppm", "w");int sw = 512, sh = 512;fprintf(fp, "P3\n%d %d\n255\n", sw, sh);for (int sy = 0; sy < sh; sy++) {float z = 1.5f - sy * 3.0f / sh;for (int sx = 0; sx < sw; sx++) {float x = sx * 3.0f / sw - 1.5f;float v = f(x, 0.0f, z);int r = 0;if (v <= 0.0f) {float y0 = h(x, z);float ny = 0.001f;float nx = h(x + ny, z) - y0;float nz = h(x, z + ny) - y0;float nd = 1.0f / sqrtf(nx * nx + ny * ny + nz * nz);float d = (nx + ny - nz) / sqrtf(3) * nd * 0.5f + 0.5f;r = (int)(d * 255.0f);}fprintf(fp, "%d 0 0 ", r);}fputc('\n', fp);}fclose(fp);
}原文出处:http://www.zhihu.com/question/20187195

如何用C语言画一个高逼格的心形?相关推荐

  1. 如何用C语言画一个高逼格的“心形“?

    本文转自知乎:http://www.zhihu.com/question/20187195 Milo Yip大神的回答 ​​​​​​ #include <stdio.h>int main( ...

  2. c语言字母圣诞树,如何用C语言画一个“圣诞树”.pdf

    如如何何用用C语语言言画画一一个个"圣圣诞诞树树" 如何用C语言画一个"圣诞树",我使用了左右镜像的Sierpinski triangle,每层减去上方一小块, ...

  3. 用C语言制作爱心,如何用C语言画一个“心形”

    程序yuan眼中的浪漫如何用C语言画一个"心形"? 在你们的世界里,是不是觉得程序员一点浪漫都不懂?其实不是的,程序yuan的世界也是很浪漫滴. 看 这个图片是不是很浪漫,有木有很 ...

  4. 画个五角星的方法c语言,急!请问,如何用C语言画一个五角星(用*组成)?

    满意答案 lucifer457 推荐于 2017.11.22 采纳率:51%    等级:12 已帮助:6951人 我自己弄出来了,不好意思,我自己来回答了. 程序如下: #include void ...

  5. python训练营 朋友圈_教你如何用python来弄一个高逼格的朋友圈

    小编今天要给大家介绍一个Python库: PIL(Python Image Library) 下面我们用一个实际的例子 看看50行python代码可以做什么神奇的事情 这是小编发的一个朋友圈 切图前是 ...

  6. c语言画爱心 带字,如何用C语言画一个心形

    摘要:#include int main() { for (float y = 1.5f; y > -1.5f; y -= 0.1f) { &nb #include int main() ...

  7. python月亮_如何用python代码画一个月亮

    如何用python代码画一个月亮 发布时间:2020-06-17 15:52:21 来源:亿速云 阅读:181 作者:元一 Python简介 Python是一种跨平台的计算机程序设计语言. 是一个高层 ...

  8. wps画流程图交叉弧形_WPS3分钟画出高逼格的流程图

    今天小迪想和大家唠唠WPS两个独特的办公工具:[WPS流程图]和[WPS脑图] 可能很多人潜意识里觉得流程图和脑图比较麻烦很难画,甚至还有一些盆友从来没有听过流程图和脑图.实际上无论工作还是学习还是日 ...

  9. 干货!用C语言画一个小猪佩奇(附源码),针不戳!

    分享下如何用 C 语言画小猪佩奇使用带符号距离场(signed distance field, SDF)表示圆形:file:///C:\Users\Administrator.WIN- STED6B9 ...

最新文章

  1. 软件工程技术基础-(软件复用技术)
  2. memcached 扩展安装(windows)
  3. 【指标统计】删除错误遥信
  4. JavaSE(二十三)——JVM
  5. JAVA——GZIP压缩与解压缩
  6. 实现了某一个接口的匿名类的例子_java中的内部类内部接口详解,一文搞定
  7. 理想化的 Redis 集群
  8. AIX7.1环境打补丁缺少bash OPATCHAUTO-72049
  9. insert into 多条数据_最全总结 | 聊聊 Python 数据处理全家桶(MongoDB 篇)
  10. 保温杯市场前景分析及行业研究报告
  11. 那些年,Linus torvalds大神喷过的技术
  12. iOS 第四天之ViewController
  13. 利用SHA-1算法和RSA秘钥进行签名验签(带注释)
  14. Java实现 kiosk模式,適用於Linux Java Swing應用程序的Kiosk模式
  15. ConvE:Convolutional 2D Knowledge Graph Embeddings
  16. linux文件操作学习3
  17. 滴滴收购Uber中国 Uber创始人加入滴滴董事会
  18. 【Python游戏】Python基于pygame实现的人机大战的斗兽棋小游戏 | 附源码
  19. ROS wiki系列|在ROSwiki中查找特定内容(以launch为例)
  20. 《A More Fine-Grained Aspect-Sentiment-Opinion Triplet Extraction Task》论文阅读

热门文章

  1. 美团23年春招技术笔试
  2. 换个角度,智能硬件也能这样玩
  3. DLIN(三):增删改
  4. 解决Caused by: sun.security.krb5.KrbException: Cannot locate KDC问题
  5. 在CNNs中通过引导注意力进行遮挡行人检测(论文翻译)
  6. UWB技术的使用场景
  7. 单点登录原理和java实现简单的单点登录
  8. Python打印图形
  9. C语言实现半波全宽算法,VC++:无限细半波振子的辐射阻抗(感应电动势法)
  10. domino 8.51安装全步骤(图文教程)