MATLAB | 我用MATLAB复刻了这场颜色图生成大赛的作品

MATLAB | 我用MATLAB复刻了这场颜色图生成大赛的作品,第1张

我用MATLAB复刻了这场颜色图绘制大赛的作品

这场比赛居然已经是七年前的事情了,大佬A Frayed Knot在StackExchange上发起了挑战,举办了名为Tweetable Mathematical Art的比赛(实际上活动整整进行了一年半)

比赛规则如下:
使用C++代码或格式与C++类似的代码,使用不多于140个字符,通过输入x,y坐标输出R,G,B颜色值的形式构造函数,并生成一张1024x1024大小的图片。

挑战发起者给出了的一个基础示例:
3z2pa

/* RED */
    return i&&j?(i%j)&(j%i):0;
/* GREEN */
    return i&&j?(i%j)+(j%i):0;
/* BLUE */
    return i&&j?(i%j)|(j%i):0;

但这个我拿c++和matlab跑了一下发现爱你效果完全不是那样的,应该是有点写错的地方,期待大家的指出,同时发现Wolfram中国区一行代码大赛杨永康作品和这个很相似,将其改写为matlab改写版:

[X,Y]=meshgrid(0:1023);
P(:,:,1)=bitand(bitand(mod(X,Y),mod(Y,X)),255);
P(:,:,2)=bitand(mod(X,Y)+mod(Y,X),255);
P(:,:,3)=bitand(bitor(mod(X,Y),mod(Y,X)),255);
imshow(uint8(P))

同时我自己做了很多尝试,同时发现若是将代码微调至如下代码,其结果也非常有意思:

% @author:slandarer
[X,Y]=meshgrid(0:1023);
P(:,:,1)=bitand(bitand(mod(X,Y),mod(Y,X)),255);
P(:,:,2)=bitand(bitxor(mod(X,Y),mod(Y,X)),255);
P(:,:,3)=bitand(bitor(mod(X,Y),mod(Y,X)),255);
imshow(uint8(P))
% [X,Y]=meshgrid(0:1023);
% P(:,:,1)=mod(bitand(mod(X,Y),mod(Y,X)),255);
% P(:,:,2)=mod(bitxor(mod(X,Y),mod(Y,X)),255);
% P(:,:,3)=mod(bitor(mod(X,Y),mod(Y,X)),255);
% imshow(uint8(P))


trichoplax大佬——方格布

正常方格布:

[i,j]=meshgrid(0:1023);
s=3./(j+99);DIM=1024;
P=(mod(round((i+DIM).*s+j.*s),2)+mod(round((DIM.*2-i).*s+j.*s),2)).*127;
imshow(uint8(P))

扭曲并添加颜色:

[i,j]=meshgrid(0:1023);
s=3./(j+99);DIM=1024;
y=(j+sin((i.*i+(j-700).^2.*5)./100./DIM).*35).*s;
P(:,:,1)=(mod(round((i+DIM).*s+y),2)+mod(round((DIM.*2-i).*s+y),2)).*127;
P(:,:,2)=(mod(round(5.*((i+DIM).*s+y)),2)+mod(round(5.*((DIM.*2-i).*s+y)),2)).*127;
P(:,:,3)=(mod(round(29.*((i+DIM).*s+y)),2)+mod(round(29.*((DIM.*2-i).*s+y)),2)).*127;
imshow(uint8(P))

Martin Ender大佬——随机油画及色带

以下代码因为跑的太慢了将更改颜色概率调到了1/100,想要还原原作品可以将各个数值进行调整。

function randpainter
r=@(n)randi([0,n-1],[1,1]);
R=zeros(1024,1024);G=zeros(1024,1024);B=zeros(1024,1024);
for i=1:1024
    for j=1:1024
        R(i,j)=RD(i,j);
        G(i,j)=GR(i,j);
        B(i,j)=BL(i,j);
    end
end
P(:,:,1)=R;P(:,:,2)=G;P(:,:,3)=B;
imshow(uint8(P))

function C=RD(i,j)
    if R(i,j)~=0
    else
        if r(99)~=0,R(i,j)=RD(mod(i+r(2),1024)+1,mod(j+r(2),1024)+1);   
        else,R(i,j)=r(256);disp('一缕数值填入完成');
        end
    end;C=R(i,j);disp([i,j,C]);
end
function C=GR(i,j)
    if G(i,j)==0
        if r(99)~=0,G(i,j)=GR(mod(i+r(2),1024)+1,mod(j+r(2),1024)+1);   
        else,G(i,j)=r(256);disp('一缕数值填入完成');
        end
    end;C=G(i,j);disp([i,j,C]);
end
function C=BL(i,j)
    if B(i,j)==0
        if r(99)~=0,B(i,j)=BL(mod(i+r(2),1024)+1,mod(j+r(2),1024)+1);   
        else,B(i,j)=r(256);disp('一缕数值填入完成');
        end
    end;C=B(i,j);disp([i,j,C]);
end
end

[i,j]=meshgrid(0:1023);
P(:,:,1)=cos(atan2(j-512,i-512)./2).^2.*255;
P(:,:,2)=(cos(atan2(j-512,i-512)./2-2.*acos(-1)/3)).^2*255;
P(:,:,3)=(cos(atan2(j-512,i-512)./2+2.*acos(-1)/3)).^2*255;
imshow(uint8(P))

大佬cjfaure——尖锐漩涡

C++有很多离谱的类型转换,这些特性用MATLAB来实现需要多写很多代码:

[i,j]=meshgrid(0:1023);
P(:,:,1)=floor(floor(sqrt((73-i).^2+(609-j).^2)+1)./(sqrt(abs(sin(floor(sqrt((860-i).^2+(162-j).^2))./115)))+1)./200).*90;
P(:,:,2)=floor(floor(sqrt((160-i).^2+(60-j).^2)+1)./(sqrt(abs(sin(floor(sqrt((86-i).^2+(860-j).^2))./115)))+1)./200).*90;
P(:,:,3)=floor(floor(sqrt((844-i).^2+(200-j).^2)+1)./(sqrt(abs(sin(floor(sqrt((250-i).^2+(20-j).^2))./115)))+1)./200).*90;
imshow(uint8(P))

对参数进行微调:

[i,j]=meshgrid(0:1023);
P(:,:,1)=fix(fix(sqrt((148-i).^2+(1000-j).^2)+1)./(sqrt(abs(sin(fix(sqrt((500-i).^2+(400-j).^2))./115)))+1)./200).*90;
P(:,:,2)=fix(fix(sqrt((610-i).^2+(60-j).^2)+1)./(sqrt(abs(sin(fix(sqrt((864-i).^2+(860-j).^2))./115)))+1)./200).*90;
P(:,:,3)=fix(fix(sqrt((180-i).^2+(100-j).^2)+1)./(sqrt(abs(sin(fix(sqrt((5-03-i).^2+(103-j).^2))./115)))+1)./200).*90;
imshow(uint8(P))

还是cjfaure大佬——音乐谱

亲测其代码C++中并不能跑出所展示的效果,这里对其进行改写让其尽量相似:

[i,j]=meshgrid(0:1023);
P=mod(bitand(fix(100.*sin(fix((i+400).*(j+100)./11115))),i,'int16').*1021,256).*2;
imshow(uint8(P))

依旧是Martin Ender大佬——Hofstadter’s Q-sequence
function Q_seq
h=zeros([1,1000]);DIM=1024;
R=zeros(1024,1024);G=zeros(1024,1024);B=zeros(1024,1024);
for i=1:1024
    for j=1:1024
        disp([i,j])
        R(i,j)=RD(i,j);
        G(i,j)=GR(i,j);
        B(i,j)=BL(i,j);
    end
end
P(:,:,1)=R;P(:,:,2)=G;P(:,:,3)=B;
imshow(uint8(P./1024.*255))
    function C=RD(i,j)
        if j<0
            if h(i)==0
                if i<=2
                    h(i)=1;
                else
                    h(i)=RD(i-RD(i-1,j),j)+RD(i-RD(i-2,j),j);
                end
            end
            C=h(i);
        else
            C=GR(i+256,j+512);
        end
    end
    function C=GR(i,j)
        C=DIM-4*RD(fix(sqrt((i-512)*(i-512)+(j-768)*(j-768))/2.9)+1,-1);
    end
    function C=BL(i,j)
        C=DIM-4*RD(fix(sqrt((i-768)*(i-768)+(j-256)*(j-256))/2.9)+1,-1);
    end
end

Snack大佬——三色谢宾斯基三角形
[i,j]=meshgrid(0:1023);
P(:,:,1)=fix(cos(bitand(i,j))).*255;
P(:,:,2)=fix(cos(bitand(1024-i,1024-j))).*255;
P(:,:,3)=fix(tan(bitxor(i,j))).*125;
imshow(uint8(P))

另外,欢迎关注公众号:slandarer随笔 那里更新的会快一丝丝

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/733413.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-27
下一篇 2022-04-27

发表评论

登录后才能评论

评论列表(0条)

保存