一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

短短幾行代碼,就能畫出如此絢爛的圖像

Q4MP_gh_c472c21 ? 來源:C語言與CPP編程 ? 作者:C語言與CPP編程 ? 2022-05-16 15:34 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

事情是這么一回事:

國外有個大佬在StackExchange上發(fā)起了一個叫做Tweetable Mathematical Art的比賽。

參賽者需要用C++編寫代表三原色的RD、GR、BL三個函數(shù),每個函數(shù)都不能超過140個字符。每個函數(shù)都會接到 i 和 j 兩個整型參數(shù)(0 ≤ i, j ≤ 1023),然后需要返回一個 0 到 255 之間的整數(shù),表示位于 (i, j) 的像素點的顏色值。

舉個例子,如果 RD(0, 0) 和 GR(0, 0) 返回的都是 0 ,但 BL(0, 0) 返回的是 255 ,那么圖像的最左上角那個像素就是藍色。

參賽者編寫的代碼會被插進下面這段程序當中(我做了一些細微的改動),最終會生成一個大小為 1024×1024 的圖片。



//NOTE:compilewithg++filename.cpp-std=c++11
#include #include #include #define DIM 1024#define DM1 (DIM-1)#define _sq(x) ((x)*(x)) // square#define _cb(x) abs((x)*(x)*(x)) // absolute value of cube#define _cr(x) (unsigned char)(pow((x),1.0/3.0)) // cube root
unsigned char GR(int,int);unsigned char BL(int,int);
unsigned char RD(int i,int j){// YOUR CODE HERE}unsigned char GR(int i,int j){// YOUR CODE HERE}unsigned char BL(int i,int j){// YOUR CODE HERE}
void pixel_write(int,int);FILE *fp;int main(){fp = fopen("MathPic.ppm","wb");fprintf(fp, "P6
%d %d
255
", DIM, DIM);for(int j=0;jfor(int i=0;ipixel_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);}

我選了一些自己比較喜歡的作品,放在下面和大家分享。首先是一個來自 Martin Büttner 的作品:

8fdfe1fe-d4ce-11ec-bce3-dac502259ad0.jpg

它的代碼如下:


unsigned char RD(int i,int j){return (char)(_sq(cos(atan2(j-512,i-512)/2))*255);}
unsigned char GR(int i,int j){return (char)(_sq(cos(atan2(j-512,i-512)/2-2*acos(-1)/3))*255);}
unsigned char BL(int i,int j){return (char)(_sq(cos(atan2(j-512,i-512)/2+2*acos(-1)/3))*255);}

同樣是來自 Martin Büttner 的作品

903b258c-d4ce-11ec-bce3-dac502259ad0.jpg

這是目前暫時排名第一的作品。它的代碼如下:


unsigned char RD(int i,int j){#define r(n)(rand()%n)static char c[1024][1024];return!c[i][j]?c[i][j]=!r(999)?r(256):RD((i+r(2))%1024,(j+r(2))%1024):c[i][j];}
unsigned char GR(int i,int j){static char c[1024][1024];return!c[i][j]?c[i][j]=!r(999)?r(256):GR((i+r(2))%1024,(j+r(2))%1024):c[i][j];}
unsigned char BL(int i,int j){static char c[1024][1024];return!c[i][j]?c[i][j]=!r(999)?r(256):BL((i+r(2))%1024,(j+r(2))%1024):c[i][j];}

下面這張圖片仍然出自 Martin Büttner 之手

904e5940-d4ce-11ec-bce3-dac502259ad0.jpg

難以想象, Mandelbrot 分形圖形居然可以只用這么一點代碼畫出:


unsigned char RD(int i,int j){float x=0,y=0;int k;for(k=0;k++<256;){float a=x*x-y*y+(i-768.0)/512;y=2*x*y+(j-512.0)/512;x=a;if(x*x+y*y>4)break;}return log(k)*47;}
unsigned char GR(int i,int j){float x=0,y=0;int k;for(k=0;k++<256;){float a=x*x-y*y+(i-768.0)/512;y=2*x*y+(j-512.0)/512;x=a;if(x*x+y*y>4)break;}return log(k)*47;}
unsigned char BL(int i,int j){float x=0,y=0;int k;for(k=0;k++<256;){float a=x*x-y*y+(i-768.0)/512;y=2*x*y+(j-512.0)/512;x=a;if(x*x+y*y>4)break;}return 128-log(k)*23;}

Manuel Kasten 也制作了一個 Mandelbrot 集的圖片,與剛才不同的是,該圖描繪的是 Mandelbrot 集在某處局部放大后的結(jié)果

90844e24-d4ce-11ec-bce3-dac502259ad0.jpg

它的代碼如下:

unsigned char RD(int i,int j){double a=0,b=0,c,d,n=0;while((c=a*a)+(d=b*b)<4&&n++<880){b=2*a*b+j*8e-9-.645411;a=c-d+i*8e-9+.356888;}return 255*pow((n-80)/800,3.);}
unsigned char GR(int i,int j){double a=0,b=0,c,d,n=0;while((c=a*a)+(d=b*b)<4&&n++<880){b=2*a*b+j*8e-9-.645411;a=c-d+i*8e-9+.356888;}return 255*pow((n-80)/800,.7);}
unsigned char BL(int i,int j){double a=0,b=0,c,d,n=0;while((c=a*a)+(d=b*b)<4&&n++<880){b=2*a*b+j*8e-9-.645411;a=c-d+i*8e-9+.356888;}return 255*pow((n-80)/800,.5);}

這是 Manuel Kasten 的另一作品

90979560-d4ce-11ec-bce3-dac502259ad0.jpg

生成這張圖片的代碼很有意思:函數(shù)依靠 static 變量來控制繪畫的進程,完全沒有用到 i 和 j 這兩個參數(shù)!


unsigned char RD(int i,int j){static double k;k+=rand()/1./RAND_MAX;int l=k;l%=512;return l>255?511-l:l;}
unsigned char GR(int i,int j){static double k;k+=rand()/1./RAND_MAX;int l=k;l%=512;return l>255?511-l:l;}
unsigned char BL(int i,int j){static double k;k+=rand()/1./RAND_MAX;int l=k;l%=512;return l>255?511-l:l;}

這是來自 githubphagocyte 的作品

90aa7842-d4ce-11ec-bce3-dac502259ad0.jpg

它的代碼如下:


unsigned char RD(int i,int j){float s=3./(j+99);float y=(j+sin((i*i+_sq(j-700)*5)/100./DIM)*35)*s;return (int((i+DIM)*s+y)%2+int((DIM*2-i)*s+y)%2)*127;}
unsigned char GR(int i,int j){float s=3./(j+99);float y=(j+sin((i*i+_sq(j-700)*5)/100./DIM)*35)*s;return (int(5*((i+DIM)*s+y))%2+int(5*((DIM*2-i)*s+y))%2)*127;}
unsigned char BL(int i,int j){float s=3./(j+99);float y=(j+sin((i*i+_sq(j-700)*5)/100./DIM)*35)*s;return (int(29*((i+DIM)*s+y))%2+int(29*((DIM*2-i)*s+y))%2)*127;}

這是來自 githubphagocyte 的另一個作品

91141db0-d4ce-11ec-bce3-dac502259ad0.jpg

這是一張使用 diffusion-limited aggregation 模型得到的圖片,程序運行起來要耗費不少時間。代碼很有意思:巧妙地利用宏定義,打破了函數(shù)與函數(shù)之間的界限,三段代碼的字數(shù)限制便能合在一起使用了。


unsigned char RD(int i,int j){#define D DIM#define M m[(x+D+(d==0)-(d==2))%D][(y+D+(d==1)-(d==3))%D]#define R rand()%D#define B m[x][y]return(i+j)?256-(BL(i,j))/2:0;}
unsigned char GR(int i,int j){#define A static int m[D][D],e,x,y,d,c[4],f,n;if(i+j<1){for(d=D*D;d;d--){m[d%D][d/D]=d%6?0:rand()%2000?1:255;}for(n=1return RD(i,j);}
unsigned char BL(int i,int j){A;n;n++){x=R;y=R;if(B==1){f=1;for(d=0;d<4;d++){c[d]=M;f=fif(f>2){B=f-1;}else{++e%=4;d=e;if(!c[e]){B=0;M=1;}}}}}return m[i][j];}

最后這張圖來自 Eric Tressler

914fa22c-d4ce-11ec-bce3-dac502259ad0.jpg

這是由 logistic 映射得到的 Feigenbaum 分岔圖。和剛才一樣,對應(yīng)的代碼也巧妙地利用了宏定義來節(jié)省字符:


unsigned char RD(int i,int j){#define A float a=0,b,k,r,x#define B int e,o#define C(x) x>255?255:x#define R return#define D DIMR BL(i,j)*(D-i)/D;}
unsigned char GR(int i,int j){#define E DM1#define F static float#define G for(#define H r=a*1.6/D+2.4;x=1.0001*b/DR BL(i,j)*(D-j/2)/D;}
unsigned char BL(int i,int j){F c[D][D];if(i+j<1){A;B;G;a0.1){G b=0;b0;k1-x);if(k>D/2){e=a;o=(E*x);c[e][o]+=0.01;}}}}}R C(c[j][i])*i/D;}

怎么樣,短短幾行代碼,就能畫出如此絢爛的圖像,你有沒有什么腦洞大開的想法?

審核編輯 :李倩

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4377

    瀏覽量

    64553
  • C++
    C++
    +關(guān)注

    關(guān)注

    22

    文章

    2118

    瀏覽量

    74973
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4894

    瀏覽量

    70449

原文標題:這幾行代碼,驚為天人!

文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    利用NVIDIA 3D引導(dǎo)生成式AI Blueprint控制圖像生成

    AI 賦能的圖像生成技術(shù)突飛猛進,從早期模型會生成手指過多的人類圖像,到現(xiàn)在能創(chuàng)造出令人驚嘆的逼真視覺效果。即使取得了如此飛躍,仍然存在一個挑戰(zhàn):實現(xiàn)創(chuàng)意掌控。
    的頭像 發(fā)表于 06-05 09:24 ?317次閱讀

    一文讀懂!圖像采集卡是什么?它在工業(yè)/醫(yī)療/監(jiān)控等多領(lǐng)域中的作用

    你有沒有想過,在工業(yè)檢測、醫(yī)院手術(shù)室、安防監(jiān)控這些高精度影像場景中,圖像是怎么被“抓”進電腦里進行分析處理的?單靠攝像頭就能搞定嗎?其實并沒那么簡單,真正起到關(guān)鍵作用的,是一種常被忽視但極其重要的設(shè)備——圖像采集卡。
    的頭像 發(fā)表于 05-13 13:35 ?581次閱讀
    一文讀懂!<b class='flag-5'>圖像</b>采集卡是什么?它在工業(yè)/醫(yī)療/監(jiān)控等多領(lǐng)域中的作用

    基于LockAI視覺識別模塊:C++使用圖像的統(tǒng)計信息

    )。 COLOR_BGR2GRAY:將BGR圖像轉(zhuǎn)換為灰度圖像。 返回值: 無。最后結(jié)果儲存在grayImage中。注意: 其中根據(jù)不同的轉(zhuǎn)換要求可以使用不同的轉(zhuǎn)換代碼,具體如下所示。 轉(zhuǎn)換方向 轉(zhuǎn)換
    發(fā)表于 05-08 10:31

    基于RV1126開發(fā)板實現(xiàn)自學(xué)習(xí)圖像分類方案

    在RV1126開發(fā)板上實現(xiàn)自學(xué)習(xí):在識別前對物體圖片進行模型學(xué)習(xí),訓(xùn)練完成后通過算法分類得出圖像的模型ID。 方案設(shè)計邏輯流程圖,方案代碼分為分為兩個業(yè)務(wù)流程,主體代碼負責抓取、合成
    的頭像 發(fā)表于 04-21 13:37 ?11次閱讀
    基于RV1126開發(fā)板實現(xiàn)自學(xué)習(xí)<b class='flag-5'>圖像</b>分類方案

    基于RV1126開發(fā)板的rknn-toolkit-lite使用方法

    譯的模型,短短幾行代碼即可完成算法的推理,大幅降低開發(fā)成本。同時很多不熟悉C/C++的算法開發(fā)人員有效降低開發(fā)門檻。本地文檔是根據(jù)已經(jīng)完成rknn模型轉(zhuǎn)換的模型進行板卡上的推理,關(guān)于rknn模型轉(zhuǎn)換請閱讀請閱讀《在EASY EA
    的頭像 發(fā)表于 04-15 17:33 ?364次閱讀
    基于RV1126開發(fā)板的rknn-toolkit-lite使用方法

    用touchgfx生成了代碼,也能編譯成功,但下載之后無法顯示圖像,可能是什么原因?

    我用touchgfx生成了代碼,也能編譯成功,但下載之后無法顯示圖像,可能是什么原因?
    發(fā)表于 03-07 06:39

    創(chuàng)建了用于OpenVINO?推理的自定義C++和Python代碼,從C++代碼中獲得的結(jié)果與Python代碼不同是為什么?

    創(chuàng)建了用于OpenVINO?推理的自定義 C++ 和 Python* 代碼。 在兩個推理過程中使用相同的圖像和模型。 從 C++ 代碼中獲得的結(jié)果與 Python* 代碼不同。
    發(fā)表于 03-06 06:22

    圖像采集卡:現(xiàn)代圖像處理技術(shù)的關(guān)鍵組件

    在現(xiàn)代科技快速發(fā)展的背景下,圖像處理技術(shù)已成為信息技術(shù)領(lǐng)域不可或缺的一部分。圖像采集卡,作為連接計算機與各種圖像采集設(shè)備的重要硬件組件,扮演著至關(guān)重要的角色。它不僅涉及圖像信號的轉(zhuǎn)換和
    的頭像 發(fā)表于 02-20 10:42 ?438次閱讀
    <b class='flag-5'>圖像</b>采集卡:現(xiàn)代<b class='flag-5'>圖像</b>處理技術(shù)的關(guān)鍵組件

    OpenAI API Key 獲取全攻略:入門、精通與詳解教程(國內(nèi)開發(fā)者優(yōu)化版)

    引言: 想象一下:只需幾行代碼,你的應(yīng)用就能像 ChatGPT 一樣智能對話;輸入幾個關(guān)鍵詞,瞬間生成引人入勝的文案;上傳一張圖片,AI 就能理解并分析…… 這不是科幻,而是 Open
    的頭像 發(fā)表于 02-15 17:26 ?2543次閱讀
    OpenAI API Key 獲取全攻略:入門、精通與詳解教程(國內(nèi)開發(fā)者優(yōu)化版)

    使用Python進行圖像處理

    下面是一個關(guān)于使用Python在幾行代碼中分析城市輪廓線的快速教程。
    的頭像 發(fā)表于 11-07 10:14 ?564次閱讀
    使用Python進行<b class='flag-5'>圖像</b>處理

    請問PurePath Studio畫出來的程序怎么下到Mini DSP里?

    PurePath Studio 畫出來的程序怎么下到Mini DSP里?還有我想請問一下,PurePath Studio 里面的均衡 及動態(tài)控制程序模塊能不能支持參數(shù)在線可調(diào)? 如果可以,怎么控制?
    發(fā)表于 10-23 08:11

    圖像檢測和圖像識別的原理、方法及應(yīng)用場景

    圖像檢測和圖像識別是計算機視覺領(lǐng)域的兩個重要概念,它們在許多應(yīng)用場景中發(fā)揮著關(guān)鍵作用。 1. 定義 1.1 圖像檢測 圖像檢測(Object Detection)是指在
    的頭像 發(fā)表于 07-16 11:19 ?6824次閱讀

    OpenCV圖像識別C++代碼

    的頭文件 在您的C++代碼中,包含以下必要的頭文件: # include # include # include # include # include # include # include 讀取圖像
    的頭像 發(fā)表于 07-16 10:42 ?4272次閱讀

    圖像處理中的卷積運算

    卷積運算是圖像處理中一種極其重要的操作,廣泛應(yīng)用于圖像濾波、邊緣檢測、特征提取等多個方面。它基于一個核(或稱為卷積核、濾波器)與圖像進行相乘并求和的過程,通過這一操作可以實現(xiàn)對圖像的平
    的頭像 發(fā)表于 07-11 15:15 ?3845次閱讀

    用touchgfx生成了代碼,也能編譯成功,但下載之后無法顯示圖像是什么原因?

    我用touchgfx生成了代碼,也能編譯成功,但下載之后無法顯示圖像,可能是什么原因?
    發(fā)表于 07-03 08:19