天天看点

骰子作画的算法

他用黑底白点的骰子。

骰子作画的算法

模拟出一张人像照片。

骰子作画的算法

把图像放大,就可以看得更清楚。

骰子作画的算法

他一共用了2500多颗骰子。

骰子作画的算法

最后的成品就是这样。

骰子作画的算法

具体来说,

第一步,将图片分割成16像素x16像素的小方块。

  for (int i=0; i < (pic_width/16); ++i) {     for (int j=0; j < (pic_height/16); ++j) {       patch = cropped_img.get(i*16, j*16, 16, 16);     }   }

第二步,每个小方块内共有256个像素,将每个像素点的灰度值,存入一个数组。

  for (int k=0; k < patch.pixels.length; ++k) {    x[k] = rgb2gray(patch.pixels[k]);   int rgb2gray(int argb) {     int _alpha = (argb >> 24) & 0xff;     int _red = (argb >> 16) & 0xff;     int _green = (argb >> 8 ) & 0xff;     int _blue = (argb) & 0xff;     return int(0.3*_red + 0.59*_green + 0.11*_blue);

第三步,计算该数组的平均值,并用1-6之间的一个整数来表示。

  int dice_num = six_step_gray(mean(x));   int mean(int[] x) {     float m = 0;     for (int i=0; i < x.length; ++i) {       m += x[i];     m = m/x.length;     return int(m);   int six_step_gray(int x) {     if (0 <= x && x <= 41) return 1;     if (41 < x && x <= 83) return 2;     if (83 < x && x <= 124) return 3;     if (124 < x && x <= 165) return 4;     if (165 < x && x <= 206) return 5;     if (206 < x && x <= 247) return 6;     else return 6; }

整数1,表示骰子朝上的一面有1个白点;整数2,表示有2个白点;以此类推。白点越少,表示这个区域越接近全黑;白点越多,表示越接近全白。根据白点值,将骰子依次放入,就能模拟出全图。

骰子作画的算法

如果区域划分得越小,模拟图的生成效果就越好。

骰子作画的算法
骰子作画的算法
骰子作画的算法
骰子作画的算法
骰子作画的算法
骰子作画的算法
骰子作画的算法

(完)

继续阅读