我需要一种算法来绘制云或类似云的形状。显然,我不希望它们都相似。
我应该使用什么来生成相关的 X、Y 坐标系列来绘制云?
我将在 SVG 或 Canvas 中实现它
7 回答
这取决于你想要什么样的云。您可以尝试在游戏开发者中非常流行的Perlin 噪声。
您可以使用 SVG feTurbulence 过滤器原语来生成 Perlin 噪声,该噪声可用于创建类似云的纹理。
一些帮助和示例:
- http://www.w3.org/Graphics/SVG/IG/resources/svgprimer.html#feTurbulence
- http://commons.oreilly.com/wiki/index.php/SVG_Essentials/Filters
- http://pilatinfo.org/english/filters/index.htm
Inkscape矢量图形编辑器还拥有大量预定义的 svg 过滤器,请参阅此处以在某些文本上仅使用其中的几个过滤器的示例。“噪声填充”使用的是 feTurbulence,可能很容易调整。Inkscape 还有一个用于调整每个过滤器参数的 GUI,选择任何形状,然后在菜单中选择“过滤器 > 过滤器编辑器...”。
为了给你的树朋友,画许多快乐的小事故。
我推荐帆布 - 你可以用画笔发疯!
祝你画得愉快,愿上帝保佑我的朋友。
这是使用 Silverlight 完成的 Perlin 噪声示例:http: //kodierer.blogspot.com/2009/05/oscar-algorithm-silverlight-real-time.html
它可能是您可以使用和/或适应的东西。
如果在画布中实现并且您想要蓬松的云形状而不是噪声类型,我会说绘制一个随机长度的矩形,然后首先将不同大小的圆圈添加到侧面,然后再添加到顶部以获得云效果。您必须做一些数学运算以确保云没有显示在矩形下方,并且矩形的顶部没有任何直线部分。但是在画布中实现应该不难。
这段代码在一系列颜色中制作了一堆圆圈,也许它会帮助你处理云
for (var i = 0; i < 12; i++)
{
for (var j = 0; j < 12; j++)
{
var ctx = document.getElementById('c1').getContext('2d');
ctx.strokeStyle = 'rgb(0,' + Math.floor(255 - 42.5 * i) + ',' +
Math.floor(255 - 42.5 * j) + ')';
ctx.beginPath();
ctx.arc(40 + j * 25, 40 + i * 25, 10, 0, Math.PI * 2, true);
ctx.stroke();
}
}
生成一组气泡(圆形或水平椭圆)并为每个云计算形状的并集。