網站資訊 news
您現在的位置:首頁 > 網站資訊 > Processing中繪制Voronoi(泰森多邊形)和水立方
NEWS

新聞資訊

Processing中繪制Voronoi(泰森多邊形)和水立方

發布時間:2017/03/16 網站資訊 瀏覽次數:3459

昆山網站建設

Voronoi最出名的例子就是北京奧運的水立方了。它在自然界中非常常見,比如長頸鹿圖案,龜殼圖案等。

那么,什么是Voronoi?
我能想到的通俗點的解釋是這樣的:
想象一個平面(就拿長方形來講好了),該平面內散落著若干種子點(比如,10個種子),現在對組成這個平面的無數個點喊話:請大家立刻找到離自己最近的種子點認大哥,并以此劃分為10個幫派!于是,10個點的voronoi圖案形成了。
下圖是從百度百科扒的,配色嘛…..

由于“每一點都能找到離自己最近的種子點”這一特性,voronoi在城市規劃,氣象學,統計學,建筑和結構等方向有很多應用。另外,單純從美學角度講,這種先撒種子,再劃勢力范圍的方法能生成或者配合生成很多漂亮圖案。
一張桌子:

丹麥BIG的一個建筑概念:

Processing中畫voronoi有不少方法,下面這種我把它起名叫“逐像素掃描法”,相對于中垂線法省很多代碼。
主要思路:遍歷窗口內的每一個像素點,求出該像素點到每個種子點的距離,對這些距離排序,得到最小距離和第二小距離,然后進行比較,如果這兩個距離相等則說明該像素點在多邊形的邊上,對其染色標出;如果不等,則說明該像素點在多邊形內,不作處理。遍歷完成后就得到了一張染過色的網,表明voronoi的邊界。

代碼約30行,如下:
int qty=20;
PVector everyPixel;
PVector[]seed=new PVector[qty];
float[]distance=new float[qty];
float min,secmin;
float threshold=1f;

size(600,400);

for(int i=0;i
seed[i]=new PVector(random(width),random(height));
fill(255,255,0);
ellipse(seed[i].x,seed[i].y,5,5);
}

for(int i=0;i
for(int j=0;j
?? everyPixel=new PVector(i,j);
?? for(int k=0;k
???? distance[k]=everyPixel.dist(seed[k]);
?? }
?? distance=sort(distance);
?? min=distance[0];
?? secmin=distance[1];

?? if(abs(secmin-min)
???? stroke(255);
???? point(i,j);
?? }
}
}


20個種子點是隨機生成的,下圖是得到的一個結果:

代碼注釋:
int qty=20;//設20個種子點
PVector everyPixel;//將來會通過把每一像素點的值賦給everyPixel進行遍歷。
PVector[]seed=new PVector[qty];//20個種子點的位置
float[]distance=new float[qty]; //像素點到20個種子點的距離
float min,secmin;//最小距離和第二小距離
float threshold=1f;//由于距離是浮點數,在實際執行中,幾乎不可能出現兩個距離恰好相等的情況,所以使用的是閾值法,距離差小于某個閾值的都算相等

size(600,400);

for(int i=0;i
seed[i]=new PVector(random(width),random(height));//隨機出20個點
fill(255,255,0);
ellipse(seed[i].x,seed[i].y,5,5);//畫小圈標記這20個點的位置
}

for(int i=0;i
for(int j=0;j
?? everyPixel=new PVector(i,j);//像素點信息賦給變量
?? for(int k=0;k
???? distance[k]=everyPixel.dist(seed[k]);
?? }?????? //該像素到20個種子的距離,形成一個數組
?? distance=sort(distance);? //對該數組排序
?? min=distance[0];????? //得到最小距離
?? secmin=distance[1];?? //得到第二小距離

?? if(abs(secmin-min)
???? stroke(255);???? //填充白色,對于point的染色,要用stroke,而不是fill
???? point(i,j);?????? //描點
?? }
}
}


如果我們進一步把上面的代碼加點顏色的變化就能得到下面這種漂亮一些圖案:

如果進一步把代碼打包成類,并把生成圖案作為材質圖貼到立方體上就能得到題圖的水立方。
整個過程so easy,顫抖吧,grasshopper? ??

云風網絡是集昆山網站制作,昆山網頁設計,昆山網站推廣于一體的昆山網絡公司,業務涵蓋:昆山手機網站制作,昆山網站設計,昆山網絡建設,昆山做網站,昆山網站建設,電話:13912673321

相關推薦
點擊這里給我發消息 技術咨詢
回到頂部
双色球在线自动选号