zl程序教程

您现在的位置是:首页 >  后端

当前栏目

骰子作画的算法

算法 骰子
2023-09-14 09:03:13 时间

程序员Scott MacDonald做了一个很有趣的项目----骰子作画

他用黑底白点的骰子。

bg2011112601.png

模拟出一张人像照片。

bg2011112602.jpg

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

bg2011112603.jpg

他一共用了2500多颗骰子。

bg2011112604.jpg

最后的成品就是这样。

bg2011112605.jpg

任何一张图片都可以用骰子模拟出来,算法非常简单:将图片分成若干个区域,每个区域经过计算以后,用1-6之间的一个整数表示,代表骰子的一个面。这种将连续的量转化成不连续的整数的算法,属于vector quantization(矢量量化)的一个应用。

具体来说,

第一步,将图片分割成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个白点;以此类推。白点越少,表示这个区域越接近全黑;白点越多,表示越接近全白。根据白点值,将骰子依次放入,就能模拟出全图。

这种算法早在1981年就有人提出,当时用的是1~9个白点的多米诺骨牌。

bg2011112606.jpg

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

bg2011112607.jpgbg2011112608.jpgbg2011112609.jpgbg2011112610.jpgbg2011112611.jpgbg2011112612.jpg

此外,不用编程,使用Photoshop也可以得到类似效果。

bg2011112613.png

(完)


【每日算法Day 98】慈善赌神godweiyang教你算骰子点数概率! 把 n 个骰子扔在地上,所有骰子朝上一面的点数之和为 s。输入 n,打印出 s 的所有可能的值出现的概率。 你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。
膜拜(离散化差分模板题) 题目描述 小鱼有 n 名优秀的粉丝。 粉丝们得知小鱼将会在一条直线上出现,打算去膜他。为了方便,粉丝们在这条直线上建立数轴。 第 i 名粉丝有一个侦查区间[li,ri] 。如果小鱼在 j(li≤j≤ri) 处出现,这名粉丝将立刻发现并膜他。 小鱼希望膜他的人越多越好,但是他不能分身,因此只能选择一个位置出现。 小鱼想知道自己最多能被多少个人膜。
漫画算法:辗转相除法是什么鬼? 辗转相除法, 又名欧几里得算法(Euclidean algorithm),目的是求出两个正整数的最大公约数。它是已知最古老的算法, 其可追溯至公元前300年前。
【Unity3D 灵巧小知识点】 ☀️ | 求解 两个向量的夹角度数 Unity 小科普 老规矩,先介绍一下 Unity 的科普小知识: Unity是 实时3D互动内容创作和运营平台 。 包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者,借助 Unity 将创意变成现实。 Unity 平台提供一整套完善的软件解决方案,可用于创作、运营和变现任何实时互动的2D和3D内容,支持平台包括手机、平板电脑、PC、游戏主机、增强现实和虚拟现实设备。
阮一峰 阿里技术专家。著名技术博客作者,技术方向为 React + Node,自由软件运动的支持者