関連する live-javascript/jsbin: http://jsbin.com/ekuyam/2/edit
基本的には、キャンバスの中心を基準にして六角形に点を生成し、六角形の各点に円を描くだけですが、よく見ると円が正しく整列していません。ただし、大きな円を使用しない限り、実際には見えません。
小さな円を使用すると、次のように、キャンバス上にかなり正確に配置されているように見えます。
しかし、大きな円を使用して (ズームインのようなもので) 詳しく調べると、ここにある不要なスペース/領域からわかるように、数学に不正確さがあることが明らかになりました。
行は完全に整列するはずですが、代わりに不要なスペースができます。これはなぜですか、どうすれば修正できますか?
コード:
function hexagon(w, h, p) {
var points = 6;
var width = w;
var height = h;
var angle = ((2 * Math.PI) / points);
var hexagon = [];
for (i = 0; i < points; i++) {
hexagon.push({
x: width * Math.sin(angle * i) + p.x,
y: height * Math.cos(angle * i) + p.y
})
}
return hexagon
}
var stage = new Kinetic.Stage({
container: "container",
width: 600,
height: 600
});
var layer = new Kinetic.Layer();
var group = new Kinetic.Group({x: 600/2, y: 600/2, draggable: false});
var radius = 1000;
var s = new Kinetic.Circle({
radius: radius,
stroke: 'black',
strokeWidth: 1,
draggable: true
});
group.add(s);
var hex_points = hexagon(radius, radius, {x: 600/2, y: 600/2});
for (p in hex_points) {
var s = new Kinetic.Circle({
radius: radius,
stroke: 'black',
strokeWidth: 1,
draggable: true
});
s.setPosition({x: hex_points[p].x - 600/2, y: hex_points[p].y - 600/2})
group.add(s);
}
layer.add(group);
stage.add(layer);