Roman Cortes又带来了用JavaScript脚本编写的红色玫瑰花。用代码做出的玫瑰花,这才是牛逼程序员送给女友的最好情人节礼物呢!(提示:在不同浏览器下观看效果、速度会有很大的不同)@H_502_1@
图片是由代码生成,用户可以刷新该页面,重复观看这朵玫瑰的呈现过程。@H_502_1@
当然,感兴趣的人可以了解下面的实现过程与相关理论:@H_502_1@
这朵三维代码玫瑰的呈现效果采用了蒙特卡罗方法,创造者对蒙特卡罗方法非常推崇,他表示在功能优化和采样方面,蒙特卡罗方法是“令人难以置信的强大工具”。关于蒙特卡罗方法可以参考:。@H_502_1@
具体操作:@H_502_1@
外观采样呈现效果绘制
@H_502_1@我用了多个不同的形状图来组成这朵代码玫瑰。共使用了31个形状:24个花瓣,4个萼片,2个叶子和1根花茎,其中每一个形状图都用代码进行描绘。@H_502_1@
首先,来定义一个采样范围:@H_502_1@
}
现在,尝试一下更密集的采样间隔:@H_502_1@
正如现在所看到的,因为采样间隔越来越密集,点越来越接近,到最高密度时,相邻点之间的距离小于一个像素,肉眼就看不到间隔(见0.01)。为了不造成太大的视觉差,再进一步缩小采样间隔,此时,绘制区已经填满(比较结果为0.01和0.001)。@H_502_1@
接下来,我用这个公式来绘制一个圆形:(X-X0)^ 2 +(Y-Y0)^ 2 <半径^ 2,其中(X0,Y0)为圆心:@H_502_1@
};
} else {
// outside the circle
return null;
}
}
有不同的方法来定义一个圆,其中一些并不需要拒绝采样。我并无一定要使用哪一种来定义圆圈的意思,所以下面用另一种方法来定义一个圆:@H_502_1@
(此方法相比前一个方法需要密集采样以进行填充。)@H_502_1@
好了,现在让圆变形,以使它看起来更像是一个花瓣:@H_502_1@
<div class="jb51code">
<pre class="brush:js;">
function surface(a,y0 = 50;
if ((x - x0) (x - x0) + (y - y0) (y - y0) < radius radius) {
return {
x: x,y: y (1 + b) / 2 // deformation
};
} else {
return null;
}
}