几十行C++代码生成自己的图片

背景:Kyle McCormick 在 StackExchange 上启动了一个名为 “Tweetable Mathematical Art” 的创意比赛。在这个挑战中,参与者必须在三条推文的长度内编写代码以创造一幅艺术图像。具体来说,每位参赛者需用 C++ 设计三个函数:RD、GR 和 BL,其中每个函数的字符长度不能超过 140。这些函数会接收两个参数 i 和 j(范围为 0 至 1023)并返回一个介于 0 到 255 之间的整数,代表在 (i, j) 位置的像素颜色值。例如,若 RD(0, 0) 和 GR(0, 0) 都返回 0,而 BL(0, 0) 返回 255,那么图像的左上角像素便会呈现蓝色。这些定制的代码将嵌入一个主程序中,生成一个 1024x1024 的美观图片。【ppm格式介绍:https://www.cnblogs.com/flyinggod/p/14159044.html

其实就是手动写一个ppm格式的RGB文件,自己组合每一个像素,最后产生RGB图片。

修改RD、GR 和 BL函数后可以生成自己的图片。比如我将修改后生成一个颜色的圆分裂为四个的代码如下:

#include <iostream>
#include <cmath>
#include <cstdlib>

#define DIM 1024

// 计算两点之间的距离
double distance(int x1, int y1, int x2, int y2) {
    return sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
}

// 基于距离的波函数
double wave(int x, int y) {
    int refX = DIM / 4;
    int refY = DIM / 4;
    
    if (x > (DIM/2)){
        refX = 3 * DIM / 4;
    }
    
    if (y > (DIM/2)){
        refY = 3 * DIM / 4;
    }
    
    double distToCenter = distance(x, y, refX, refY);
    return distToCenter / (DIM / 2); // normalize to [0,1]
}

unsigned char RD(int i, int j) {
    double w = wave(i, j);
    if (w < 0.2) {
        return 255 * (1 - w / 0.2);
    } else if (w < 0.4) {
        return 255;
    } else if (w < 0.5) {
        return 255 - 255 * (w - 0.4) / 0.2;
    }
    if ((i == DIM / 2 || j == DIM / 2) && (i % 2 == 0 || j % 2 == 0 || rand() % 2 == 0)) {
        return 0;
    }
    return 0;
}

unsigned char GR(int i, int j) {
    double w = wave(i, j);
    if (w < 0.2) {
        return 0;
    } else if (w < 0.4) {
        return 255 * (1 - (w - 0.2) / 0.2);
    }
    if ((i == DIM / 2 || j == DIM / 2) && (i % 2 == 0 || j % 2 == 0 || rand() % 2 == 0)) {
        return 0;
    }
    return rand() % 255;  
}

unsigned char BL(int i, int j) {
    return 0; // 黑色
}

void pixel_write(int, int);
FILE *fp;

int main() {
    fp = fopen("MathPic.ppm", "wb");
    fprintf(fp, "P6\n%d %d\n255\n", DIM, DIM);
    for(int j = 0; j < DIM; j++)
        for(int i = 0; i < DIM; i++)
            pixel_write(i, j);
    fclose(fp);
    return 0;
}

void pixel_write(int i, int j) {
    static unsigned char color[3];
    color[0] = RD(i,j) & 255;
    color[1] = GR(i,j) & 255;
    color[2] = BL(i,j) & 255;
    fwrite(color, 1, 3, fp);
}

在这里插入图片描述
其他的如下:
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值