早在8年前,也就是2008年,Roger Johansson使用C#做了一個利用遺傳算法使用不同的多邊形繪制圖像的程序EvoLisa(嗯,讓我想想我當時在干什么。。。),這里是展示。
達爾文的像
為了方便理解代碼是如何工作的,現在假如你正在徒步通往真理的殿堂,你所能借助的唯一的工具就是一個能告訴你現在你接近真理殿堂距離的儀器,而你又是處于迷茫的狀態,完全不知道應該往那邊走,那么現在應該怎么辦? 不妨先大膽的邁出一步,這時候再看看自己的距離是不是變小了?如果是,那說明自己至少大致走對了方向;如果發現距離并沒有減小吶?那就退回來,換個方向再試一下,總有一個方向會是對的。每到達一個新的位置,就重復上面的過程,雖然過程中會有不斷的失敗,但是通過大量的努力(選擇),就可以不斷地接近目的地。
作者Roger Johansson在源代碼中也是使用了這種思想,通過不斷的嘗試,不斷的保留更優解(到達一個新的位置),這樣使得最后使用多邊形層疊出來的圖像跟原始圖像盡可能的接近。這里是源代碼(云梯自備),以及CSDN下載執行文件,源代碼
每幅圖像
是由一定數量的多邊形
疊加而成; 每個多邊形
是由頂點
和色彩
組成 由于每個多邊形的頂點和色彩的不同導致層疊出的圖像也就不同,所以成等點和色彩為每幅圖像的基因
,
幾率
進行增加
,刪除
,或者移動
上下的位置(層疊的次序)對每一個多邊形按照一定的概率``增加
,減少
它的頂點數目
對每一個多邊形按照一定的概率
移動頂點的位置對每一個多邊形按照一定的概率
改變其rgba
的數值將所有的多邊形在畫布上繪制出,并獲取像素信息將繪制出的圖形和原圖形的所有相應位置上像素差值的平方之和作為適應度,越小表示兩個圖像越接近,效果越好如果適應度減小,則保留當前多邊形組合的基因
;否則,放棄此次變異,回滾到上一次變異的結果。如果對生成圖像的效果不滿意,重復步驟1自己使用js代碼實現了一遍,最后的效果如下:
Chrome GEM.鄧紫棋
對于簡單的圖像,程序能在很短的時間內使用多邊形繪制出一個比較像的圖像,但是對于復雜的,那只能是等一會了,一般要好幾個小時。
其實自己實現了一遍代碼,最后發現其中最難的,或者說獲得時間最多的并不是理解其中的原理以及敲代碼,而是能夠使用適當的參數保證程序能夠盡快的得出自己滿意的結果,我大部分時間都在調參數了o(╥﹏╥)o
代碼地址github
由于Chrome瀏覽器的同源策略問題,所以代碼要在火狐瀏覽器中才能夠順利運行
新聞熱點
疑難解答