8
できるだけ円に六角形を入れる方法を探しています。今まで私が得た最良の結果は、中心から外側に向かって六角形を円形に生成することです。円を六角形で塗りつぶし
は、しかし、私は私の計算は私が/アップいくつかの値を切り捨てするMath.ceil()
とMath.Floor
機能を使用が間違っている最大六角サークル、特に一部を取得すると思います。
Math.ceil()
を使用すると、六角形がサークルと重複することがあります。
一方、Math.floor()
を使用すると、六角形の最後の円と円の境界線の間に余分なスペースが残ることがあります。
var c_el = document.getElementById("myCanvas");
var ctx = c_el.getContext("2d");
var canvas_width = c_el.clientWidth;
var canvas_height = c_el.clientHeight;
var PI=Math.PI;
var PI2=PI*2;
var hexCircle = {
\t r: 110, /// radius
\t pos: {
\t \t x: (canvas_width/2),
\t \t y: (canvas_height/2)
\t }
};
var hexagon = {
\t r: 20,
\t pos:{
\t \t x: 0,
\t \t y: 0
\t },
\t space: 1
};
drawHexCircle(hexCircle, hexagon);
function drawHexCircle(hc, hex) {
\t drawCircle(hc);
\t var hcr = Math.ceil(Math.sqrt(3) * (hc.r/2));
var hr = Math.ceil((Math.sqrt(3) * (hex.r/2))) + hexagon.space; // hexRadius
\t var circles = Math.ceil((hcr/hr)/2);
drawHex(hc.pos.x , hc.pos.y, hex.r); //center hex ///
\t for (var i = 1; i<=circles; i++) {
\t \t for (var j = 0; j<6; j++) {
\t \t \t var currentX = hc.pos.x+Math.cos(j*PI2/6)*hr*2*i;
\t \t \t var currentY = hc.pos.y+Math.sin(j*PI2/6)*hr*2*i;
\t \t \t drawHex(currentX,currentY, hex.r);
\t \t \t for (var k = 1; k<i; k++) {
\t \t \t \t var newX = currentX + Math.cos((j*PI2/6+PI2/3))*hr*2*k;
\t \t \t \t var newY = currentY + Math.sin((j*PI2/6+PI2/3))*hr*2*k;
\t \t \t \t drawHex(newX,newY, hex.r);
\t \t \t }
\t \t }
\t }
}
function drawHex(x, y, r){
ctx.beginPath();
ctx.moveTo(x,y-r);
for (var i = 0; i<=6; i++) {
ctx.lineTo(x+Math.cos((i*PI2/6-PI2/4))*r,y+Math.sin((i*PI2/6-PI2/4))*r);
}
ctx.closePath();
ctx.stroke();
}
function drawCircle(circle){
\t ctx.beginPath();
\t ctx.arc(circle.pos.x, circle.pos.y, circle.r, 0, 2 * Math.PI);
\t ctx.closePath();
\t ctx.stroke();
}
<canvas id="myCanvas" width="350" height="350" style="border:1px solid #d3d3d3;">