var line,
lines = [],
gap = size / 7;
for (var y = gap / 2; y <= size; y+= gap) {
line = []
for (var x = gap / 2; x <= size; x+= gap) {
line.push({x: x, y: y})
context.beginPath();
context.arc(x, y, 1, 0, 2 * Math.PI, true);
context.fill();
}
lines.push(line)
}
然后替换隔行的 x 坐标。这里我们通过 odd 变量交替赋值 true 或 false 实现。
一个正三角网格将在新坐标下形成。
var line, dot,
odd = false,
lines = [],
gap = size / 8;
for (var y = gap / 2; y <= size; y+= gap) {
odd = !odd
line = []
for (var x = gap / 4; x <= size; x+= gap) {
dot = {x: x + (odd ? gap/2 : 0), y: y}
line.push(dot)
context.beginPath();
context.arc(dot.x, dot.y, 1, 0, 2 * Math.PI, true);
context.fill();
}
lines.push(line)
}
原文:Triangular mesh
这种三角网格效果常出现库和 SVG 中。今天我们将用 canvas 实现它!同时,这也是一个说明坐标系和替换细节而得到漂亮效果的案例。
老规矩,首先是初始化得到一个方形 canvas。
创建点网格的常规方式是通过行和列。这些点将会被绘制在 canvas 上,并被存储在一个数组中,以便后续使用。
点是由一个含有
x
、y
属性的对象表示。行列之间的间距通过
gap
变量表示。我们将点绘制成圆后,便看到网格在 canvas 上的样子。然后替换隔行的 x 坐标。这里我们通过
odd
变量交替赋值 true 或 false 实现。一个正三角网格将在新坐标下形成。
下一步是使用点绘制三角形。
创建一个接收三角形三个坐标,并连接绘制它们的函数。
现在,结合
drawTriangle
函数和点数组绘制所有三角形。这部分也许会有点难以理解。脚本会遍历所有线,并组合相邻线的点以形成三角形。为了便于理解,我们将相邻的两条线分别称为
a
和b
。然后将两线符合要求的点合并到一个数组中,使其看起来像“之”字型:a1
、b1
、a2
、b2
、a3
以此类推。这将为我们提供了一个含有三角形所有坐标的数组。如:[
a1
,b1
,a2
]、[b1
,a2
,b2
], [a2
,b2
,a3
] 等。至此,我们得到一个正三角网格。接着,我们为一个细节赋予魔法。
现在每个点与相邻点之间的间距相同。其实,我们可以将点在该区域内进行位移,而避免与其它点发生重叠(译者注:每个点的安全位移区域是点间距的一半)。利用
Math.random()
对点进行位移。另外,还可以增加一些生成艺术的乐趣。比如填充只有 16 种色调的灰色!
如果想探索该效果的更多实现细节,可看看我的库:triangulr。