Sto provando a trovare un modo per mettere quanti più esagoni in un cerchio possibile. Finora il risultato migliore che ho ottenuto è la generazione di esagoni dal centro verso l'esterno in una forma circolare.cerchio di riempimento con gli esagoni
Ma credo che il mio calcolo per ottenere i massimi circoli esagonali è sbagliato, in particolare la parte in cui io uso il Math.ceil()
e Math.Floor
funzioni per arrotondare giù/su alcuni valori.
Quando si utilizza Math.ceil()
, gli esagoni a volte si sovrappongono al cerchio.
Quando si utilizza Math.floor()
d'altra parte, a volte lascia troppo spazio tra l'ultimo cerchio di esagoni e il bordo del cerchio.
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;">