【七夕要来了】分享程序猿表白神器

时间:2022-03-06 17:14:35
七夕节要到了~在网上看到篇文章很有意思,现在分享给大家~

用C语言打印会跳动的心,送给最爱的那个她!

这篇文章中的代码可以完成几个不同的爱心图案,其中有一个例子甚至可以在黑色背景的控制台上打印出跳动的3D爱心动画,效果相当震撼!说不定可以给她一个惊喜(吓?)噢~

情人节送什么给她- =大家可以一起探讨噢!

一、普通的爱心图案

c语言代码是这样子的:

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

二、带花纹的爱心图案

C语言代码是这样子的:

#include "stdafx.h"
#include <math.h>
#include <stdio.h>


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


getchar();
return 0;
}

#include "stdafx.h"
#include <stdio.h>
#include <math.h>
#include <windows.h>
#include <tchar.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() {
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 < 1.5f; x += 0.05f) {
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 < 25; sy++) {
COORD coord = { 0, sy };
SetConsoleCursorPosition(o, coord);
WriteConsole(o, buffer[sy], 79, NULL, 0);
}
Sleep(33);
}
}

三、跳动的心形图案

c语言代码是这样的

#include "stdafx.h"
#include <stdio.h>
#include <math.h>
#include <windows.h>
#include <tchar.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() {
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 < 1.5f; x += 0.05f) {
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 < 25; sy++) {
COORD coord = { 0, sy };
SetConsoleCursorPosition(o, coord);
WriteConsole(o, buffer[sy], 79, NULL, 0);
}
Sleep(33);
}
}

56 个解决方案

#1


【七夕要来了】分享程序猿表白神器

#2


【七夕要来了】分享程序猿表白神器

#3


用钻石摆成心形绝对比这个成功率大得多

#4


引用 3 楼 yuyang00000 的回复:
用钻石摆成心形绝对比这个成功率大得多

然而编码难度要大得多

#5


引用 4 楼 u010668114 的回复:
Quote: 引用 3 楼 yuyang00000 的回复:

用钻石摆成心形绝对比这个成功率大得多

然而编码难度要大得多
是啊,然而妹子又不管你会不会编码

#6


引用 5 楼 yuyang00000 的回复:
Quote: 引用 4 楼 u010668114 的回复:

Quote: 引用 3 楼 yuyang00000 的回复:

用钻石摆成心形绝对比这个成功率大得多

然而编码难度要大得多
是啊,然而妹子又不管你会不会编码

我是说用钻石这种方式,很难编

#7


引用 6 楼 u010668114 的回复:
Quote: 引用 5 楼 yuyang00000 的回复:

Quote: 引用 4 楼 u010668114 的回复:

Quote: 引用 3 楼 yuyang00000 的回复:

用钻石摆成心形绝对比这个成功率大得多

然而编码难度要大得多
是啊,然而妹子又不管你会不会编码

我是说用钻石这种方式,很难编
【七夕要来了】分享程序猿表白神器

#8


楼主确定妹子不会一脚把你踹飞

#9


屌丝 【七夕要来了】分享程序猿表白神器人家摆总共2000块的荔枝都没成功 【七夕要来了】分享程序猿表白神器

#10


妹子不是有卖吗

#11


引用 3 楼 yuyang00000 的回复:
用钻石摆成心形绝对比这个成功率大得多


可以结贴了

#12


引用 4 楼 u010668114 的回复:
Quote: 引用 3 楼 yuyang00000 的回复:

用钻石摆成心形绝对比这个成功率大得多

然而编码难度要大得多

不大,屌丝也可以,网上买人工钻,很便宜的。

#13


该回复于2015-08-19 15:09:29被管理员删除

#14


【七夕要来了】分享程序猿表白神器

#15


【七夕要来了】分享程序猿表白神器

#16


【七夕要来了】分享程序猿表白神器

#17


然而并没有什么乱用

#18


然并卵。醒醒该搬砖了
【七夕要来了】分享程序猿表白神器

#19


今天看到出租的好多

#20


引用 12 楼 accessysq 的回复:
Quote: 引用 4 楼 u010668114 的回复:

Quote: 引用 3 楼 yuyang00000 的回复:

用钻石摆成心形绝对比这个成功率大得多

然而编码难度要大得多

不大,屌丝也可以,网上买人工钻,很便宜的。
关键是怎么在屏幕(控制台)打出砖石来。。打星星多容易********

#21


JAVA的呢 【七夕要来了】分享程序猿表白神器【七夕要来了】分享程序猿表白神器

#22


好东西,学习一下 【七夕要来了】分享程序猿表白神器

#23


http://www.waitingfy.com/html5/snake/   能不能打开?第一个观察模式是表白模式,很久以前做的。

#24


记得下次用人民币

#25


关键是女生怎么运行C语言,要是.net  C# ,汇编就好了

#26


为毛没有java。。。 【七夕要来了】分享程序猿表白神器

#27


亲,给截图能更好说明一切 【七夕要来了】分享程序猿表白神器

#28


引用 17 楼 cdj0311 的回复:
然而并没有什么乱用
+1

#29


【七夕要来了】分享程序猿表白神器

#30


然并卵,洗洗睡吧

#31



还可以试试这两种
1.
#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)]);
            }
            else
                putchar(' ');
        }
        putchar('\n');
    }
}







2.

#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);
}







说真心的,其实有多少女孩会喜欢看Dos 打出来的心形,除非是程序媛才能懂的
其她女生还是喜欢花呀,巧克力 和 钻石



#32


该回复于2015-08-23 09:14:01被管理员删除

#33


该回复于2015-08-23 09:18:44被管理员删除

#34


如果 不懂这个,即使看了,也觉得比网页做的挫

#35


看不懂!哈哈

#36


嗯,感觉楼主忘记附上几张用代码敲出的图片了。哈哈

【七夕要来了】分享程序猿表白神器

#37


可是在编译起来放哪运行呢?电脑屏幕吗?用什么编译啊,我是小白,勿喷

#38


楼主果然是屌丝

#39


引用 31 楼 sinbas 的回复:

还可以试试这两种
1.
#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)]);
            }
            else
                putchar(' ');
        }
        putchar('\n');
    }
}







2.

#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);
}







说真心的,其实有多少女孩会喜欢看Dos 打出来的心形,除非是程序媛才能懂的
其她女生还是喜欢花呀,巧克力 和 钻石
第二个没有什么效果啊,你没有给出那个文件谁知道想表达什么啊。而且第一个心形太大,doc窗口不能完整放下一个。

#40


楼主,那个第三个跳动的心,为什么文件后缀名是.c就老是编译出错,改成.C就不会了呢?

#41


引用 6 楼 u010668114 的回复:
Quote: 引用 5 楼 yuyang00000 的回复:

Quote: 引用 4 楼 u010668114 的回复:

Quote: 引用 3 楼 yuyang00000 的回复:

用钻石摆成心形绝对比这个成功率大得多

然而编码难度要大得多
是啊,然而妹子又不管你会不会编码

我是说用钻石这种方式,很难编
 买钻石 拼成心形,绝对成功  【七夕要来了】分享程序猿表白神器

#42


能给个这篇文章出处地址吗?

#43


偶也来凑个热闹! 【七夕要来了】分享程序猿表白神器
#pragma comment(lib,"user32")
#pragma comment(lib,"gdi32")
#include <windows.h>
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
    PAINTSTRUCT ps;
    HDC hdc;
    HFONT hfont,ohfont;
    RECT r;
    COLORREF oc;

    switch(message) {
    case WM_CLOSE://按Alt+F4退出
        PostQuitMessage(0);
        break;
    case WM_PAINT:
        BeginPaint(hWnd, &ps);
        hdc = ps.hdc; // the device context to draw in
        GetClientRect(hWnd, &r); // Obtain the window's client rectangle
        hfont = CreateFont(720, 0, 0, 0, 0, 0, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 0, "Webdings");
        ohfont=(HFONT)SelectObject(hdc,hfont);
        oc=SetTextColor(hdc,0x00C080FF);
        SetBkMode(hdc, TRANSPARENT);
        TextOut(hdc,r.left+r.right/2-360, r.top+r.bottom/2-360,"\x59",1);
        DeleteObject(hfont);
        hfont = CreateFont(480, 0, 0, 0, 0, 0, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 0, "Webdings");
        SelectObject(hdc,hfont);
        SetTextColor(hdc,0x000000FF);
        TextOut(hdc,r.left+r.right/2-360, r.top+r.bottom/2-360,"\x5a",1);
        DeleteObject(hfont);
        hfont = CreateFont(120, 0, 0, 0, 0, 0, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 0, "Script");
        SelectObject(hdc,hfont);
        SetTextColor(hdc,0x00FFFFFF);
        TextOut(hdc,r.left+r.right/2-480, r.bottom-360,"I love you",10);
        SelectObject(hdc,ohfont);
        SetTextColor(hdc,oc);
        DeleteObject(hfont);
        EndPaint(hWnd, &ps);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    MSG msg             = {0};
    WNDCLASS wc         = {0};
    HBRUSH hbrh;
    hbrh=CreateSolidBrush(0x00000000);
    wc.lpfnWndProc      = WndProc;
    wc.hInstance        = hInstance;
    wc.hbrBackground    = hbrh;
    wc.lpszClassName    = "minwindowsapp";
    wc.hCursor          = LoadCursor(NULL,IDC_ARROW);
    if( FAILED(RegisterClass(&wc)) ) return 1;

    if(FAILED(CreateWindow(wc.lpszClassName,
                        "Minimal Windows Application",
                        WS_POPUP|WS_VISIBLE,
                        0,
                        0,
                        GetSystemMetrics(SM_CXSCREEN),
                        GetSystemMetrics(SM_CYSCREEN),
                        0,
                        0,
                        hInstance,
                        NULL)))
        return 2;

    while( GetMessage( &msg, NULL, 0, 0 ) > 0 ) {
        DispatchMessage( &msg );
    }
    DeleteObject(hbrh);
    return 0;
}

#44


该回复于2015-08-25 08:29:45被管理员删除

#45


哎,楼主,屌丝才用这玩意表白啊,姑娘看到只会心里默念:这傻逼程序猿,真屌丝。

#46


【七夕要来了】分享程序猿表白神器【七夕要来了】分享程序猿表白神器【七夕要来了】分享程序猿表白神器

#47


首先,要有妹子

#48


代码有错,用vc6.0执行不成功,哈哈哈哈 【七夕要来了】分享程序猿表白神器

#49


哎,七夕都过了。。。。

#50


送礼物这种事,还是要投其所好的,不然达不到预想的效果 【七夕要来了】分享程序猿表白神器

#1


【七夕要来了】分享程序猿表白神器

#2


【七夕要来了】分享程序猿表白神器

#3


用钻石摆成心形绝对比这个成功率大得多

#4


引用 3 楼 yuyang00000 的回复:
用钻石摆成心形绝对比这个成功率大得多

然而编码难度要大得多

#5


引用 4 楼 u010668114 的回复:
Quote: 引用 3 楼 yuyang00000 的回复:

用钻石摆成心形绝对比这个成功率大得多

然而编码难度要大得多
是啊,然而妹子又不管你会不会编码

#6


引用 5 楼 yuyang00000 的回复:
Quote: 引用 4 楼 u010668114 的回复:

Quote: 引用 3 楼 yuyang00000 的回复:

用钻石摆成心形绝对比这个成功率大得多

然而编码难度要大得多
是啊,然而妹子又不管你会不会编码

我是说用钻石这种方式,很难编

#7


引用 6 楼 u010668114 的回复:
Quote: 引用 5 楼 yuyang00000 的回复:

Quote: 引用 4 楼 u010668114 的回复:

Quote: 引用 3 楼 yuyang00000 的回复:

用钻石摆成心形绝对比这个成功率大得多

然而编码难度要大得多
是啊,然而妹子又不管你会不会编码

我是说用钻石这种方式,很难编
【七夕要来了】分享程序猿表白神器

#8


楼主确定妹子不会一脚把你踹飞

#9


屌丝 【七夕要来了】分享程序猿表白神器人家摆总共2000块的荔枝都没成功 【七夕要来了】分享程序猿表白神器

#10


妹子不是有卖吗

#11


引用 3 楼 yuyang00000 的回复:
用钻石摆成心形绝对比这个成功率大得多


可以结贴了

#12


引用 4 楼 u010668114 的回复:
Quote: 引用 3 楼 yuyang00000 的回复:

用钻石摆成心形绝对比这个成功率大得多

然而编码难度要大得多

不大,屌丝也可以,网上买人工钻,很便宜的。

#13


该回复于2015-08-19 15:09:29被管理员删除

#14


【七夕要来了】分享程序猿表白神器

#15


【七夕要来了】分享程序猿表白神器

#16


【七夕要来了】分享程序猿表白神器

#17


然而并没有什么乱用

#18


然并卵。醒醒该搬砖了
【七夕要来了】分享程序猿表白神器

#19


今天看到出租的好多

#20


引用 12 楼 accessysq 的回复:
Quote: 引用 4 楼 u010668114 的回复:

Quote: 引用 3 楼 yuyang00000 的回复:

用钻石摆成心形绝对比这个成功率大得多

然而编码难度要大得多

不大,屌丝也可以,网上买人工钻,很便宜的。
关键是怎么在屏幕(控制台)打出砖石来。。打星星多容易********

#21


JAVA的呢 【七夕要来了】分享程序猿表白神器【七夕要来了】分享程序猿表白神器

#22


好东西,学习一下 【七夕要来了】分享程序猿表白神器

#23


http://www.waitingfy.com/html5/snake/   能不能打开?第一个观察模式是表白模式,很久以前做的。

#24


记得下次用人民币

#25


关键是女生怎么运行C语言,要是.net  C# ,汇编就好了

#26


为毛没有java。。。 【七夕要来了】分享程序猿表白神器

#27


亲,给截图能更好说明一切 【七夕要来了】分享程序猿表白神器

#28


引用 17 楼 cdj0311 的回复:
然而并没有什么乱用
+1

#29


【七夕要来了】分享程序猿表白神器

#30


然并卵,洗洗睡吧

#31



还可以试试这两种
1.
#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)]);
            }
            else
                putchar(' ');
        }
        putchar('\n');
    }
}







2.

#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);
}







说真心的,其实有多少女孩会喜欢看Dos 打出来的心形,除非是程序媛才能懂的
其她女生还是喜欢花呀,巧克力 和 钻石



#32


该回复于2015-08-23 09:14:01被管理员删除

#33


该回复于2015-08-23 09:18:44被管理员删除

#34


如果 不懂这个,即使看了,也觉得比网页做的挫

#35


看不懂!哈哈

#36


嗯,感觉楼主忘记附上几张用代码敲出的图片了。哈哈

【七夕要来了】分享程序猿表白神器

#37


可是在编译起来放哪运行呢?电脑屏幕吗?用什么编译啊,我是小白,勿喷

#38


楼主果然是屌丝

#39


引用 31 楼 sinbas 的回复:

还可以试试这两种
1.
#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)]);
            }
            else
                putchar(' ');
        }
        putchar('\n');
    }
}







2.

#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);
}







说真心的,其实有多少女孩会喜欢看Dos 打出来的心形,除非是程序媛才能懂的
其她女生还是喜欢花呀,巧克力 和 钻石
第二个没有什么效果啊,你没有给出那个文件谁知道想表达什么啊。而且第一个心形太大,doc窗口不能完整放下一个。

#40


楼主,那个第三个跳动的心,为什么文件后缀名是.c就老是编译出错,改成.C就不会了呢?

#41


引用 6 楼 u010668114 的回复:
Quote: 引用 5 楼 yuyang00000 的回复:

Quote: 引用 4 楼 u010668114 的回复:

Quote: 引用 3 楼 yuyang00000 的回复:

用钻石摆成心形绝对比这个成功率大得多

然而编码难度要大得多
是啊,然而妹子又不管你会不会编码

我是说用钻石这种方式,很难编
 买钻石 拼成心形,绝对成功  【七夕要来了】分享程序猿表白神器

#42


能给个这篇文章出处地址吗?

#43


偶也来凑个热闹! 【七夕要来了】分享程序猿表白神器
#pragma comment(lib,"user32")
#pragma comment(lib,"gdi32")
#include <windows.h>
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
    PAINTSTRUCT ps;
    HDC hdc;
    HFONT hfont,ohfont;
    RECT r;
    COLORREF oc;

    switch(message) {
    case WM_CLOSE://按Alt+F4退出
        PostQuitMessage(0);
        break;
    case WM_PAINT:
        BeginPaint(hWnd, &ps);
        hdc = ps.hdc; // the device context to draw in
        GetClientRect(hWnd, &r); // Obtain the window's client rectangle
        hfont = CreateFont(720, 0, 0, 0, 0, 0, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 0, "Webdings");
        ohfont=(HFONT)SelectObject(hdc,hfont);
        oc=SetTextColor(hdc,0x00C080FF);
        SetBkMode(hdc, TRANSPARENT);
        TextOut(hdc,r.left+r.right/2-360, r.top+r.bottom/2-360,"\x59",1);
        DeleteObject(hfont);
        hfont = CreateFont(480, 0, 0, 0, 0, 0, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 0, "Webdings");
        SelectObject(hdc,hfont);
        SetTextColor(hdc,0x000000FF);
        TextOut(hdc,r.left+r.right/2-360, r.top+r.bottom/2-360,"\x5a",1);
        DeleteObject(hfont);
        hfont = CreateFont(120, 0, 0, 0, 0, 0, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 0, "Script");
        SelectObject(hdc,hfont);
        SetTextColor(hdc,0x00FFFFFF);
        TextOut(hdc,r.left+r.right/2-480, r.bottom-360,"I love you",10);
        SelectObject(hdc,ohfont);
        SetTextColor(hdc,oc);
        DeleteObject(hfont);
        EndPaint(hWnd, &ps);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    MSG msg             = {0};
    WNDCLASS wc         = {0};
    HBRUSH hbrh;
    hbrh=CreateSolidBrush(0x00000000);
    wc.lpfnWndProc      = WndProc;
    wc.hInstance        = hInstance;
    wc.hbrBackground    = hbrh;
    wc.lpszClassName    = "minwindowsapp";
    wc.hCursor          = LoadCursor(NULL,IDC_ARROW);
    if( FAILED(RegisterClass(&wc)) ) return 1;

    if(FAILED(CreateWindow(wc.lpszClassName,
                        "Minimal Windows Application",
                        WS_POPUP|WS_VISIBLE,
                        0,
                        0,
                        GetSystemMetrics(SM_CXSCREEN),
                        GetSystemMetrics(SM_CYSCREEN),
                        0,
                        0,
                        hInstance,
                        NULL)))
        return 2;

    while( GetMessage( &msg, NULL, 0, 0 ) > 0 ) {
        DispatchMessage( &msg );
    }
    DeleteObject(hbrh);
    return 0;
}

#44


该回复于2015-08-25 08:29:45被管理员删除

#45


哎,楼主,屌丝才用这玩意表白啊,姑娘看到只会心里默念:这傻逼程序猿,真屌丝。

#46


【七夕要来了】分享程序猿表白神器【七夕要来了】分享程序猿表白神器【七夕要来了】分享程序猿表白神器

#47


首先,要有妹子

#48


代码有错,用vc6.0执行不成功,哈哈哈哈 【七夕要来了】分享程序猿表白神器

#49


哎,七夕都过了。。。。

#50


送礼物这种事,还是要投其所好的,不然达不到预想的效果 【七夕要来了】分享程序猿表白神器