摘要:#include int main() {

for (float y = 1.5f; y > -1.5f; y -= 0.1f) {

&nb

#include int main() {

for (float y = 1.5f; y > -1.5f; y -= 0.1f) {

for (float x = -1.5f; x

float a = x * x + y * y - 1;

putchar(a * a * a - x * x * y * y * y <= 0.0f ? '*' : ' ');

}

putchar('\n');

}}

参考:Heart Curve -- from Wolfram MathWorld

---

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

#include int main() {

for (float y = 1.5f; y > -1.5f; y -= 0.1f) {

for (float x = -1.5f; x

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');

}}

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

#include #include 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

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)]);

}

else

putchar(' ');

}

putchar('\n');

}}

参考:Heart Surface -- from Wolfram MathWorld

--

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

#ifdef _MSC_VER#define _CRT_SECURE_NO_WARNINGS#endif#include #include 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

float z = 1.5f - sy * 3.0f / sh;

for (int sx = 0; 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);}

--

更新5:通过空间的缩放变换实现 ASCII 心跳动画,需要改变光标位置,此版本仅支持Windows。录制视频不太顺畅,建议在本地测试。#include #include #include #include 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() {

HANDLE o = GetStdHandle(STD_OUTPUT_HANDLE);

_TCHAR buffer[25][80] = { _T(' ') };

_TCHAR ramp[] = _T(".:-=+*#%@");

for (float t = 0.0f;; t += 0.1f) {

int sy = 0;

float s = sinf(t);

float a = s * s * s * s * 0.2f;

for (float z = 1.3f; z > -1.2f; z -= 0.1f) {

_TCHAR* p = &buffer[sy++][0];

float tz = z * (1.2f - a);

for (float x = -1.5f; x

float tx = x * (1.2f + a);

float v = f(tx, 0.0f, tz);

if (v <= 0.0f) {

float y0 = h(tx, tz);

float ny = 0.01f;

float nx = h(tx + ny, tz) - y0;

float nz = h(tx, tz + ny) - y0;

float nd = 1.0f / sqrtf(nx * nx + ny * ny + nz * nz);

float d = (nx + ny - nz) * nd * 0.5f + 0.5f;

*p++ = ramp[(int)(d * 5.0f)];

}

else

*p++ = ' ';

}

}

for (sy = 0; sy

COORD coord = { 0, sy };

SetConsoleCursorPosition(o, coord);

WriteConsole(o, buffer[sy], 79, NULL, 0);

}

Sleep(33);

}}

更新6:移植至 Shadertoy BETA 实现,加入高光和背景。

c语言画爱心 带字,如何用C语言画一个心形相关推荐

  1. 用java画爱心图_C++和Java命令行绘制心形图案

    心形线 心形线,是一个圆上的固定一点在它绕着与其相切且半径相同的另外一个圆周滚动时所形成的轨迹,因其形状像心形而得名. 心脏线亦为蚶线的一种.在曼德博集合正中间的图形便是一个心脏线.心脏线的英文名称& ...

  2. C语言五角星简单程序,如何用*编写五角星形和心形图案的c语言程序

    满意答案 adee305918 2013.07.14 采纳率:57%    等级:11 已帮助:8944人 #include void main() { printf(" * \n" ...

  3. android 画爱心进度条_Android 开发之 HeartProgress 自定义心形进度条

    今天找到一个比较不错的进度有关的素材,随即写了一个自定义控件HeartProgress,思路:先把图片绘制进去,然后根据进度值,截取图片自下而上的范围,进行裁剪,裁剪后的图片进行图片变色,然后重新绘制 ...

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

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

  5. 如何用 css 画一个心形

    如何用 css 画一个心形 (How to draw hearts using CSS) 用两个长方形切圆角倾斜位移并合并为一个心形 第一步 画一个长方形 (Draw a rectangle) 这个长 ...

  6. css画心形原理,如何用 css 画一个心形

    如何用 css 画一个心形 (How to draw hearts using CSS) 用两个长方形切圆角倾斜位移并合并为一个心形 第一步 画一个长方形 (Draw a rectangle) 这个长 ...

  7. 用c语言,制作一个心形彩色告白图案(附源码)

    今天我们来一个好玩的,用c语言,制作一个心形彩色告白图案. 送给c语言初学者 代码: #include<stdio.h> #include<math.h> #include&l ...

  8. 使用Java语言打印一个心形图案

    要使用 Java 语言打印一个心形图案,你可以使用两个 for 循环和一些字符串拼接来实现.你也可以使用 ASCII 码来打印心形图案,这将更加简单. 以下是使用两个 for 循环和字符串拼接的示例代 ...

  9. 用python画一个心形_python怎么画爱心

    Python可以使用turtle库来画爱心. Turtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x.纵轴为y的坐标系原点,(0,0)位置开始,它根据一组函数指 ...

最新文章

  1. 访问修饰符的个人理解-private与protected
  2. BNF范式(巴科斯范式)简介
  3. 吞吐量达到瓶颈后下降_中港协:八大枢纽港集装箱吞吐量增速创新高
  4. STM32 PWM输出(映射)
  5. hadoop emr_在Amazon EMR上运行Hadoop MapReduce作业
  6. Python(4)--Pycharm安装、使用小技巧
  7. 与java线程有关的,线程多少和什么有关?大神们表示有话要说!
  8. mongodb运算符使用
  9. 【免费毕设】PHP论文格式化系统(系统+论文)
  10. 错误处理和调试2 - C++快速入门31
  11. VSCode 拓展插件推荐
  12. 《程序员情商》自我修养必备《论语》
  13. lammps教程:EAM势函数设置详解
  14. JanusGraph对于Gremlin查询语言的介绍
  15. 最小行走距离(dfs+虚树)
  16. python中oserror winerror,在python中将WindowsError转换为OSError
  17. jQuery全屏插件fullPage的基本使用
  18. 机器学习笔记04:逻辑回归(Logistic regression)、分类(Classification)
  19. Android5.1自定义闹钟铃声,vivo手机怎么添加自定义闹钟铃声
  20. Mac上最强大的截图软件-xnip

热门文章

  1. Java Web 实习笔记(二)
  2. 二次元动漫卡通风格APP下载页面html源码 带弹幕
  3. 基于词向量的相似度短语挖掘
  4. java获取密码框密码_用JAVA编写一个简单密码框
  5. c语言中local status6,C语言中易错的地方(一)
  6. 数字后端基本概念介绍Fence
  7. 1. win10安装vs2017(图文)(适用其他community版,如vs2019)
  8. ABAP中不修改内表参照的结构,给内表/结构体增加字段
  9. 用Swift写服务端 — Perfect框架学习(一)
  10. python画建筑分析图_python如何画出漂亮的地图?