在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

如果讓程序自動來填寫每一個像素點,最后會是一副什么畫呢?

Android編程精選 ? 來源:小林coding ? 作者:燒茄子 ? 2022-04-13 14:59 ? 次閱讀

Hi,大家好。

我們知道,在計算機中要顯示顏色,一般都是用R、G、B三個0-255范圍內的整數來描述。

89413620-ba77-11ec-aa7f-dac502259ad0.png

這一點,即便你不是從事前端、客戶端這些與界面交互相關的開發工作,也應該知道。

也就是說,你現在在屏幕上看到的任何一個像素點的顏色,都可以用RGB三個整數值來表示。

那就有一個有趣的問題:如果讓程序自動來填寫每一個像素點,最后會是一副什么畫呢?

最近我在知乎就看到了這么一個有趣的話題,看完真的讓人稱奇,獨樂樂不如眾樂樂,分享給大家。

事情是這么一回事:

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

參賽者需要用C++編寫代表三原色的RD、GR、BL三個函數,每個函數都不能超過 140 個字符。每個函數都會接到 i 和 j 兩個整型參數(0 ≤ i, j ≤ 1023),然后需要返回一個 0 到 255 之間的整數,表示位于 (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
#defineDIM1024
#defineDM1(DIM-1)
#define_sq(x)((x)*(x))//square
#define_cb(x)abs((x)*(x)*(x))//absolutevalueofcube
#define_cr(x)(unsignedchar)(pow((x),1.0/3.0))//cuberoot

unsignedcharGR(int,int);
unsignedcharBL(int,int);

unsignedcharRD(inti,intj){
//YOURCODEHERE
}
unsignedcharGR(inti,intj){
//YOURCODEHERE
}
unsignedcharBL(inti,intj){
//YOURCODEHERE
}

voidpixel_write(int,int);
FILE*fp;
intmain(){
fp=fopen("MathPic.ppm","wb");
fprintf(fp,"P6
%d%d
255
",DIM,DIM);
for(intj=0;jfor(inti=0;ireturn0;
}
voidpixel_write(inti,intj){
staticunsignedcharcolor[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 的作品:

8950cdba-ba77-11ec-aa7f-dac502259ad0.jpg

它的代碼如下:

unsignedcharRD(inti,intj){
return(char)(_sq(cos(atan2(j-512,i-512)/2))*255);
}

unsignedcharGR(inti,intj){
return(char)(_sq(cos(atan2(j-512,i-512)/2-2*acos(-1)/3))*255);
}

unsignedcharBL(inti,intj){
return(char)(_sq(cos(atan2(j-512,i-512)/2+2*acos(-1)/3))*255);
}

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

895d3dde-ba77-11ec-aa7f-dac502259ad0.jpg

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

unsignedcharRD(inti,intj){
#definer(n)(rand()%n)
staticcharc[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];
}

unsignedcharGR(inti,intj){
staticcharc[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];
}

unsignedcharBL(inti,intj){
staticcharc[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 之手:

896ae57e-ba77-11ec-aa7f-dac502259ad0.jpg

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

unsignedcharRD(inti,intj){
floatx=0,y=0;intk;for(k=0;k++<256;){floata=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;}
returnlog(k)*47;
}

unsignedcharGR(inti,intj){
floatx=0,y=0;intk;for(k=0;k++<256;){floata=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;}
returnlog(k)*47;
}

unsignedcharBL(inti,intj){
floatx=0,y=0;intk;for(k=0;k++<256;){floata=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;}
return128-log(k)*23;
}

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

897933f4-ba77-11ec-aa7f-dac502259ad0.jpg

它的代碼如下:

unsignedcharRD(inti,intj){
doublea=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;}
return255*pow((n-80)/800,3.);
}

unsignedcharGR(inti,intj){
doublea=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;}
return255*pow((n-80)/800,.7);
}

unsignedcharBL(inti,intj){
doublea=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;}
return255*pow((n-80)/800,.5);
}

這是 Manuel Kasten 的另一作品:

89866c22-ba77-11ec-aa7f-dac502259ad0.jpg

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

unsignedcharRD(inti,intj){
staticdoublek;k+=rand()/1./RAND_MAX;intl=k;l%=512;returnl>255?511-l:l;
}

unsignedcharGR(inti,intj){
staticdoublek;k+=rand()/1./RAND_MAX;intl=k;l%=512;returnl>255?511-l:l;
}

unsignedcharBL(inti,intj){
staticdoublek;k+=rand()/1./RAND_MAX;intl=k;l%=512;returnl>255?511-l:l;
}

這是來自 githubphagocyte 的作品:

8993b03a-ba77-11ec-aa7f-dac502259ad0.jpg

它的代碼如下:

unsignedcharRD(inti,intj){
floats=3./(j+99);
floaty=(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;
}

unsignedcharGR(inti,intj){
floats=3./(j+99);
floaty=(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;
}

unsignedcharBL(inti,intj){
floats=3./(j+99);
floaty=(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 的另一個作品:

89a4472e-ba77-11ec-aa7f-dac502259ad0.jpg

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

unsignedcharRD(inti,intj){
#defineDDIM
#defineMm[(x+D+(d==0)-(d==2))%D][(y+D+(d==1)-(d==3))%D]
#defineRrand()%D
#defineBm[x][y]
return(i+j)?256-(BL(i,j))/2:0;
}

unsignedcharGR(inti,intj){
#defineAstaticintm[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=1
returnRD(i,j);
}

unsignedcharBL(inti,intj){
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;}}}}}returnm[i][j];
}

最后這張圖來自 Eric Tressler:

89b672b4-ba77-11ec-aa7f-dac502259ad0.jpg

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

unsignedcharRD(inti,intj){
#defineAfloata=0,b,k,r,x
#defineBinte,o
#defineC(x)x>255?255:x
#defineRreturn
#defineDDIM
RBL(i,j)*(D-i)/D;
}

unsignedcharGR(inti,intj){
#defineEDM1
#defineFstaticfloat
#defineGfor(
#defineHr=a*1.6/D+2.4;x=1.0001*b/D
RBL(i,j)*(D-j/2)/D;
}

unsignedcharBL(inti,intj){
Fc[D][D];if(i+j<1){A;B;G;a0.1){Gb=0;b0;k1-x);if(k>D/2){e=a;o=(E*x);c[e][o]+=0.01;}}}}}RC(c[j][i])*i/D;
}

怎么樣,短短幾行代碼,就能畫出如此絢爛的圖像,你有沒有什么腦洞大開的想法,可以復制上面的代碼來試一試啊!

-End-

審核編輯 :李倩


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 函數
    +關注

    關注

    3

    文章

    4341

    瀏覽量

    62800
  • C++
    C++
    +關注

    關注

    22

    文章

    2113

    瀏覽量

    73742
  • 代碼
    +關注

    關注

    30

    文章

    4808

    瀏覽量

    68812

原文標題:這幾行代碼,真的騷!

文章出處:【微信號:AndroidPush,微信公眾號:Android編程精選】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    請問TVP5158分辨率D1與HalfD1是如何轉換的?

    的數據格式之間到底是如何轉換的。比如說我要將D1分辨率的數據變成HalfD1的分辨率,其中可以從手冊中看出是將D1格式數據行中的像素點去掉了半,但是去掉的這
    發表于 12-23 06:31

    高斯濾波和均值濾波的區別

    。 高斯濾波的核心思想是對圖像中的每一個像素點,用其鄰域內像素的加權平均灰度值替代該的灰度值,權重由高斯函數決定,距離中心
    的頭像 發表于 09-29 09:40 ?772次閱讀

    高斯濾波和雙邊濾波的區別

    思想是對圖像中的每一個像素點,用其鄰域內像素的加權平均灰度值替代該的灰度值。 高斯濾波的權重由高斯函數決定,距離中心
    的頭像 發表于 09-29 09:37 ?531次閱讀

    顯示器的像素間距越小,顯示效果越好嗎

    像素間距(Pixel Pitch) 是指LED顯示屏或LCD等顯示器上相鄰兩像素點之間的距離,通常以毫米(mm)為單位表示。像素間距直接決定了屏幕上能夠顯示的最小細節和圖像的細膩程度
    的頭像 發表于 08-10 09:56 ?1230次閱讀

    高光譜相機檢測手機背板顏色均勻性

    高光譜成像技術是項新技術,傳統的光譜分析技術只能做局部平均光譜分析,而高光譜能夠做到整幅圖的各個光譜分析。成像光譜有凝視成像型、推帚型、擺掃型。它能夠在生成一副圖像的同時獲取這副圖像每個
    的頭像 發表于 07-30 15:46 ?329次閱讀
    高光譜相機檢測手機背板顏色均勻性

    DSP教學實驗箱_數字圖像處理操作_案例分享:5-13 灰度圖像二值化

    像素點1灰度值+...+像素點n灰度值)/ n = 像素點平均值avg,然后每一個像素點與a
    發表于 07-25 15:03

    FPGA verilog HDL實現中值濾波

    )計數器控制模塊,主要用于獲得中心像素點的地址信息。 (1)系統模塊開始信號之后開始獲取第一個中心像素點,注意初始化信號值和系統開始的信號值的區別; (2)該時刻得到的的數據將在下一個
    發表于 06-18 18:50

    如果要設計電阻應變式傳感器測重量系統,請問怎么設定測量的multisim電路和重量的范圍,最后也要變成0-10V輸出

    如果要設計電阻應變式傳感器測重量系統,測量的是重量,請問怎么設定測量的multisim電路和重量的范圍,最后也要變成0-10V輸出?(
    發表于 06-09 20:22

    STM32F407插入USB設備后會發生DISCNT中斷,這是為什么

    我的工程基于STM32F407平臺,用的stm32的官方庫;在usb在hs、host 模式下,上電時未插入USB設備,但是程序會發生HPRTINT中斷。插入USB設備后會發生
    發表于 04-26 07:08

    freertos任務創建,每一個任務分配的內存是多大才好,怎么計算

    小白剛剛接觸freertos,想問下就創建任務而言,每一個任務分配的內存是多大才好,怎么計算? 另外,每個任務的執行周期怎么確定?在任務里面放延時函數嗎?
    發表于 04-23 06:39

    激光雷達分辨率對比方法與技巧詳解

    分辨率這個詞是從攝像頭沿用而來,攝像頭拍出來的單幅圖像,其像素點均勻分布在橫縱兩維度的畫面中,因此「橫向像素點 x 縱向像素點」就能直接反映出攝像頭分辨率的高低。
    發表于 03-29 11:47 ?3798次閱讀
    激光雷達分辨率對比方法與技巧詳解

    touchgfx顯示的時候,在像素點差異比較大的地方顯示錯誤怎么解決?

    顯存是外掛SDRAM,顯示是LTDC驅動800*480,GUI是touchgfx生成的,在顯示的時候,在像素點差異比較大的地方,顯示錯誤,都是顯示單色R或G,求大佬!!!
    發表于 03-28 06:42

    如何看懂MOS管的每一個參數

    那么結溫和熱阻有什么用?--半導體器件主要通過熱傳遞的方式對元件本身進行散熱,當芯片溫度升高,超過結溫后會導致元件損壞。
    發表于 03-18 10:44 ?2448次閱讀
    如何看懂MOS管的<b class='flag-5'>每一個</b>參數

    PLC控制柜維護與保養的21條黃金法則

    般來說只會損壞一副觸點,如果繼電器有兩觸點,幅損壞,則可以考慮另外一副,比如:現場接線為1
    發表于 03-04 09:53 ?511次閱讀

    基于HTTP/3構建SSH協議會是什么樣

    來自UCLouvain的Fran?ois Michel 和Olivier Bonaventure在研究中思考了問題:如果使用最新的網絡技術重新設計SSH協議,那新協議
    的頭像 發表于 02-20 17:07 ?738次閱讀
    基于HTTP/3構建SSH協議<b class='flag-5'>會是</b>什么樣<b class='flag-5'>呢</b>?
    主站蜘蛛池模板: 国产美女精品久久久久中文| 国产一区二区三区影院| 97视频碰碰车| 成人在线一区二区三区| 99国产成人精品2021| 91操碰| 国产黄色大全| 99xxxx开心| 成人午夜大片免费7777| 轻点灬大ji巴太大太深了| 综合色区| 四虎精品成人免费观看| 欧美日韩在线成人看片a| 色偷偷偷| 你懂的在线看| 欧美日韩视频综合一区无弹窗| 男人的天堂视频在线| 国产激爽大片在线播放| 激情午夜婷婷| wwwxx免费| 丁香六月婷婷精品免费观看| 亚洲播播播| 国产成人午夜片在线观看| free性乌克兰高清videos| 国产成人精品亚洲日本在线观看| 婷婷精品视频| 婷婷丁香在线| 欧美日韩国产成人精品| 丁香婷婷九月| 免费视频网站在线观看| 美女性爽视频国产免费| 欧美人与z0zoxxxx特| xxxxxx性bbbbbb| 日本免费色网站| 成人99国产精品一级毛片| 九色视频网| 免费爱做网站在线看| 日韩毛片大全| bt天堂bt在线网| 国产福利免费观看| 朱元璋传奇1998王耿豪版|