2016-02-26 13 views
13

前のapproachは機能していないようで、ソリューションはやや複雑なので、もう少し簡単なアプローチを試してみました。円に六角形を塗りつぶす(別のアプローチ)

今回は、コードが六角形を描画する前に、あらかじめ定義された円にいくつの行と列が収まるかを決定し、この結果に基づいてすべての六角形の描画を開始します。

これまでのところ、これまでのアプローチのように、ヘックスが重なったり、円の下部に大きな隙間が残ったりすることがあります。

また、これらの六角形をグリッドにフォーマットするにはどうすればいいですか?

円の半径を増減することができ、六角形を再描画できる小さなスライダがキャンバスの下にあります。

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 circle = { 
 
\t r: 120, /// 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 } 
 
} 
 

 
var hex_w = hexagon.r * 2; 
 
var hex_h = Math.floor(Math.sqrt(3) * hexagon.r); 
 
var hex_s = (3/2) * hexagon.r; 
 

 
fill_CircleWithHex(circle); 
 

 
function fill_CircleWithHex(circle){ 
 
\t drawCircle(circle); 
 
\t 
 
\t var c_h = circle.r * 2; /// circle height //// 
 
\t var c_w = c_h; //// circle width ///// 
 
\t 
 
\t var max_hex_H = Math.round(c_h/hex_h); 
 
\t 
 
\t var row_sizes = [] 
 
\t for(var row= 0; row< max_hex_H; row++){ 
 
\t \t 
 
\t \t var d = circle.r - (row* hex_h); //// distance from circle's center to the row's chord //// 
 
\t \t var c = 2 * (Math.sqrt((circle.r*circle.r) - (d * d))); /// length of the row's chord //// 
 
\t \t var row_length = Math.floor(c/(hexagon.r * 3)); 
 
\t \t row_sizes.push(row_length ) 
 
\t } 
 
\t 
 
\t console.log("circle_r : "+circle.r); 
 
\t console.log("hex_r : "+hexagon.r); 
 
\t console.log("max_hex_H : "+max_hex_H); 
 
\t console.log("max_hex_W : ", row_sizes) 
 

 
\t for(var row = 0; row < row_sizes.length; row++){ 
 
\t \t var max_hex_W = row_sizes[row]; 
 
\t \t 
 
\t \t var x_offset = Math.floor((c_w - (max_hex_W * hex_w))/2); 
 
\t \t 
 
\t \t for(var col = 1; col < max_hex_W; col++){ 
 
\t \t \t hexagon.pos.x = (col * hex_w) + (circle.pos.x - circle.r) + x_offset ; 
 
\t \t \t hexagon.pos.y = (row * hex_h) + (circle.pos.y - circle.r); 
 
\t \t \t ctx.fillText(row+""+col, hexagon.pos.x - 6, hexagon.pos.y+4); 
 
\t \t \t drawHexagon(hexagon) 
 
\t \t } 
 
\t } 
 
} 
 

 
function drawHexagon(hex){ 
 
\t var angle_deg, angle_rad, cor_x, cor_y; 
 
\t ctx.beginPath(); 
 
\t for(var c=0; c <= 5; c++){ 
 
\t \t angle_deg = 60 * c; 
 
\t \t angle_rad = (Math.PI/180) * angle_deg; 
 
\t \t cor_x = hex.r * Math.cos(angle_rad); //// corner_x /// 
 
\t \t cor_y = hex.r* Math.sin(angle_rad); //// corner_y /// 
 
\t \t if(c === 0){ 
 
\t \t \t ctx.moveTo(hex.pos.x+ cor_x, hex.pos.y+cor_y); 
 
\t \t }else{ 
 
\t \t \t ctx.lineTo(hex.pos.x+cor_x, hex.pos.y+cor_y); 
 
\t \t } 
 
\t } 
 
\t ctx.closePath(); 
 
\t 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.stroke(); 
 
} 
 

 

 
    $(function() { 
 
    $("#slider").slider({ 
 
\t \t max: 200, 
 
\t \t min:0, 
 
\t \t value:100, 
 
\t \t create: function(event, ui) { 
 
\t \t \t $("#value").html($(this).slider('value')); 
 
\t \t }, 
 
\t \t change: function(event, ui) { 
 
\t \t \t $("#value").html(ui.value); 
 
\t \t }, 
 
\t \t slide: function(event, ui){ 
 
\t \t \t $("#value").html(ui.value); 
 
\t \t \t circle.r = ui.value; 
 
\t \t \t ctx.clearRect(0,0, canvas_width, canvas_height); 
 
\t \t \t fill_CircleWithHex(circle); 
 
\t \t } 
 
\t }); 
 
    });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<link href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.css" rel="stylesheet"/> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script> 
 

 
<canvas id="myCanvas" width="350" height="250" style="border:1px solid #d3d3d3;"> </canvas> 
 
<div style="width: 200px; height: 40px;"> 
 
\t <div id="slider" style="position:relative; width: 150px; top: 4px;float: left;"></div> <div id="value" style="float: left;"> 0 </div> 
 
</div>

+0

私は混乱しています。六角形と円のサイズはどちらも指定できますか?あなたは問題をより正確に述べることができますか?ハードな制約と最大限にしようとしていることは何ですか? –

+0

ハードな拘束は円のサイズで、これに基づいて六角形のグリッドが生成されます。 – Alexus

+0

六角形のように見えるだけですか?六角形は番号を付ける必要がありますか?私はちょうど六角形のスタイルを生成するスマートCSSの背景を適用することを考えています。 – Paul

答えて

6

以下は、円の中心点を中心とした定期的なハニカム構造体のためのパッキング問題を解決します。通常の意味:

  • すべての六角形のセットは、円の中心を中心に60度の回転で対称です。

各六角形の座標は、中心から反時計回りに六角形の序数を表し、正午から始まる時計回りのシーケンス番号を表します。

円が広がるにつれて、新しい六角形の殻が必ずしも全体として充填されるとは限りません。外殻を満たす自由度は部分的に改善された解決策を生み出すが、依然として最適ではない。回転対称性に規則性を緩和することは、60度(すなわち、120度および180度)以外の角度であれば、円の内部のより高い被覆率を可能にする。

このコードの次の改訂では、その背後にある数学を見ていきます(そして、円の周りの回転対称性が最適性の必要条件であることを証明する定理を見つけることができます)。

var c_el; 
 
var ctx; 
 
var canvas_width; 
 
var canvas_height; 
 
var circle; 
 
var hexagon; 
 
var hex_w; 
 
var hex_h; 
 
var hex_s; 
 
var delta; 
 

 
function drawHexagonAt (po_ctr_hex, pn_circle, pn_sector) { 
 
    var cur 
 
     ; 
 
     
 
    cur = { x: po_ctr_hex.x - 0.5 * hexagon.r, y: po_ctr_hex.y - delta }; 
 
    
 
    ctx.beginPath(); 
 
    ctx.moveTo(cur.x, cur.y); 
 
    cur.x = cur.x + hexagon.r; 
 
    cur.y = cur.y; 
 
    ctx.lineTo(cur.x, cur.y); 
 
    cur.x = cur.x + hexagon.r/2; 
 
    cur.y = cur.y + delta; 
 
    ctx.lineTo(cur.x, cur.y); 
 
    cur.x = cur.x - hexagon.r/2; 
 
    cur.y = cur.y + delta; 
 
    ctx.lineTo(cur.x, cur.y); 
 
    cur.x = cur.x - hexagon.r; 
 
    cur.y = cur.y; 
 
    ctx.lineTo(cur.x, cur.y); 
 
    cur.x = cur.x - hexagon.r/2; 
 
    cur.y = cur.y - delta; 
 
    ctx.lineTo(cur.x, cur.y); 
 
    cur.x = cur.x + hexagon.r/2; 
 
    cur.y = cur.y - delta; 
 
    ctx.lineTo(cur.x, cur.y); 
 
\t ctx.closePath(); 
 
\t ctx.stroke(); 
 

 
    cur.x = cur.x + hexagon.r/2; 
 
    cur.y = cur.y + delta; 
 
\t ctx.fillText(pn_circle + "/" + pn_sector, cur.x-6, cur.y+4); 
 
} // drawHexagonAt 
 

 
function fill_CircleWithHex(circle){ 
 
\t drawCircle(circle); 
 
\t 
 
\t var radacc2; 
 
\t var iter = 0; 
 
\t var sector = 0; 
 
\t var i, j; 
 
\t var ctr  = { x: circle.pos.x , y: circle.pos.y }; 
 
\t var cur  = { x: 0   , y: 0 }; 
 
\t 
 
\t delta = Math.floor(Math.sqrt(3) * 0.5 * hexagon.r); 
 
    radacc2 = hexagon.r * hexagon.r; 
 
\t while ((radacc2 < circle.r * circle.r)) { 
 
\t  cur.x = ctr.x; 
 
\t  cur.y = ctr.y - iter * 2 * delta; 
 
\t  
 
\t  if (iter === 0) { 
 
\t   drawHexagonAt (cur, 0, 0); 
 
\t  } 
 
\t  else { 
 
    \t  for (var i=0; i < 6; i++) { 
 
    \t   // j-loops -- next honeycomb 
 
    \t   sector = 0; 
 
    \t   for (var j=0; j < iter; j++) { 
 
    \t    cur.x = cur.x + 1.5 * hexagon.r; 
 
    \t    cur.y = cur.y + delta; 
 
    \t    drawHexagonAt (cur, iter, sector++); 
 
    \t   } 
 
    \t   for (var j=0; j < iter; j++) { 
 
    \t    cur.x = cur.x; 
 
    \t    cur.y = cur.y + 2 * delta; 
 
    \t    drawHexagonAt (cur, iter, sector++); 
 
    \t   } 
 
    \t   for (var j=0; j < iter; j++) { 
 
    \t    cur.x = cur.x - 1.5 * hexagon.r; 
 
    \t    cur.y = cur.y + delta; 
 
    \t    drawHexagonAt (cur, iter, sector++); 
 
    \t   } 
 
    \t   for (var j=0; j < iter; j++) { 
 
    \t    cur.x = cur.x - 1.5 * hexagon.r; 
 
    \t    cur.y = cur.y - delta; 
 
    \t    drawHexagonAt (cur, iter, sector++); 
 
    \t   } 
 
    \t   for (var j=0; j < iter; j++) { 
 
    \t    cur.x = cur.x; 
 
    \t    cur.y = cur.y - 2 * delta; 
 
    \t    drawHexagonAt (cur, iter, sector++); 
 
    \t   } 
 
    \t   for (var j=0; j < iter; j++) { 
 
    \t    cur.x = cur.x + 1.5 * hexagon.r; 
 
    \t    cur.y = cur.y - delta; 
 
    \t    drawHexagonAt (cur, iter, sector++); 
 
    \t   } 
 
    \t  } // i-loop -- meta-honeycomb 
 
    \t } // if -- Iteration 1 vs. n > 1 
 
    \t  
 
    \t  // radacc update 
 
    \t  iter++; 
 
     radacc2 = ((2*iter + 1) * delta) * ((2*iter + 1) * delta) + hexagon.r * hexagon.r/4; 
 
    } // while -- komplette Shells 
 
    
 
    // 
 
    // Partielle Shells 
 
    // 
 
    var proceed; 
 
    do { 
 
\t  cur.x = ctr.x; 
 
\t  cur.y = ctr.y - iter * 2 * delta; 
 
     proceed = false; 
 

 
\t  for (var i=0; i < 6; i++) { 
 
\t   // j-loops -- next honeycomb 
 
\t   sector = 0; 
 
\t   for (var j=0; j < iter; j++) { 
 
\t    cur.x = cur.x + 1.5 * hexagon.r; 
 
\t    cur.y = cur.y + delta; 
 
\t    sector++ 
 
\t    if (Math.sqrt ((cur.x - ctr.x) * (cur.x - ctr.x) + (cur.y - ctr.y) * (cur.y - ctr.y)) + hexagon.r < circle.r) { 
 
\t     drawHexagonAt (cur, iter, sector); 
 
\t     proceed = true; 
 
\t    } 
 
\t   } 
 
\t   for (var j=0; j < iter; j++) { 
 
\t    cur.x = cur.x; 
 
\t    cur.y = cur.y + 2 * delta; 
 
\t    sector++ 
 
\t    if (Math.sqrt ((cur.x - ctr.x) * (cur.x - ctr.x) + (cur.y - ctr.y) * (cur.y - ctr.y)) + hexagon.r < circle.r) { 
 
\t     drawHexagonAt (cur, iter, sector); 
 
\t     proceed = true; 
 
\t    } 
 
\t   } 
 
\t   for (var j=0; j < iter; j++) { 
 
\t    cur.x = cur.x - 1.5 * hexagon.r; 
 
\t    cur.y = cur.y + delta; 
 
\t    sector++ 
 
\t    if (Math.sqrt ((cur.x - ctr.x) * (cur.x - ctr.x) + (cur.y - ctr.y) * (cur.y - ctr.y)) + hexagon.r < circle.r) { 
 
\t     drawHexagonAt (cur, iter, sector); 
 
\t     proceed = true; 
 
\t    } 
 
\t   } 
 
\t   for (var j=0; j < iter; j++) { 
 
\t    cur.x = cur.x - 1.5 * hexagon.r; 
 
\t    cur.y = cur.y - delta; 
 
\t    sector++ 
 
\t    if (Math.sqrt ((cur.x - ctr.x) * (cur.x - ctr.x) + (cur.y - ctr.y) * (cur.y - ctr.y)) + hexagon.r < circle.r) { 
 
\t     drawHexagonAt (cur, iter, sector); 
 
\t     proceed = true; 
 
\t    } 
 
\t   } 
 
\t   for (var j=0; j < iter; j++) { 
 
\t    cur.x = cur.x; 
 
\t    cur.y = cur.y - 2 * delta; 
 
\t    sector++ 
 
\t    if (Math.sqrt ((cur.x - ctr.x) * (cur.x - ctr.x) + (cur.y - ctr.y) * (cur.y - ctr.y)) + hexagon.r < circle.r) { 
 
\t     drawHexagonAt (cur, iter, sector); 
 
\t     proceed = true; 
 
\t    } 
 
\t   } 
 
\t   for (var j=0; j < iter; j++) { 
 
\t    cur.x = cur.x + 1.5 * hexagon.r; 
 
\t    cur.y = cur.y - delta; 
 
\t    sector++ 
 
\t    if (Math.sqrt ((cur.x - ctr.x) * (cur.x - ctr.x) + (cur.y - ctr.y) * (cur.y - ctr.y)) + hexagon.r < circle.r) { 
 
\t     drawHexagonAt (cur, iter, sector); 
 
\t     proceed = true; 
 
\t    } 
 
\t   } 
 
\t  } // i-loop -- meta-honeycomb 
 
\t  
 
\t  iter++; 
 
    } while (proceed && (iter < 15));  
 
    
 
} // fill_CircleWithHex 
 

 

 
function drawCircle(circle){ 
 
\t ctx.beginPath(); 
 
\t ctx.arc(circle.pos.x, circle.pos.y, circle.r, 0, 2 * Math.PI); 
 
\t ctx.stroke(); 
 
} 
 

 

 
    $(function() { 
 
    $("#slider").slider({ 
 
\t \t max: 200, 
 
\t \t min:0, 
 
\t \t value:100, 
 
\t \t create: function(event, ui) { 
 
\t \t \t $("#value").html($(this).slider('value')); 
 
\t \t }, 
 
\t \t change: function(event, ui) { 
 
\t \t \t $("#value").html(ui.value); 
 
\t \t }, 
 
\t \t slide: function(event, ui){ 
 
\t \t \t $("#value").html(ui.value); 
 
\t \t \t circle.r = ui.value; 
 
\t \t \t ctx.clearRect(0,0, canvas_width, canvas_height); 
 
\t \t \t fill_CircleWithHex(circle); 
 
\t \t } 
 
\t }); 
 
    }); 
 
    
 
$(document).ready(function() { 
 
    c_el = document.getElementById("myCanvas"); 
 
    ctx = c_el.getContext("2d"); 
 
    
 
    canvas_width = c_el.clientWidth; 
 
    canvas_height = c_el.clientHeight; 
 

 
    circle = { 
 
    \t r: 120, /// radius 
 
    \t pos: { 
 
    \t \t x: (canvas_width/2), 
 
    \t \t y: (canvas_height/2) 
 
    \t } 
 
    }; 
 
    
 
    hexagon = { 
 
    \t r: 20, 
 
    \t pos:{ 
 
    \t \t x: 0, 
 
    \t \t y: 0 
 
    \t } 
 
    }; 
 
    
 
    hex_w = hexagon.r * 2; 
 
    hex_h = Math.floor(Math.sqrt(3) * hexagon.r); 
 
    hex_s = (3/2) * hexagon.r; 
 
    
 
    fill_CircleWithHex(circle); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<link href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.css" rel="stylesheet"/> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script> 
 

 
<canvas id="myCanvas" width="350" height="250" style="border:1px solid #d3d3d3;"> </canvas> 
 
<div style="width: 200px; height: 40px;"> 
 
<div id="slider" style="position:relative; width: 150px; top: 4px;float: left;"></div> <div id="value" style="float: left;"> 0 </div> 
 
</div>

+0

これまでのところ最高の答えですが、私の予想以上に複雑ですが、少し単純化することは可能でしょうか? (私は上記の例で使用したforループの量を参照しています) – Alexus

+0

6つのケースを持つswitch文のcpostで、最も内側の6個のループを折りたたんで、次の六角形の中間点の計算を区別することができます。同様に、部分シェルのコードを最初のループにまとめることもできます。しかし、現在、最も内側の六角形の中点と円は常に一致している。これをリラックスさせることでさらに良い解決策が得られますが、コード構造はおそらくこれに合わせる必要があります。私は今夜​​これを調べます。 – collapsar

+3

いい仕事です。これらの内部ループを関数呼び出しにすることができます:https://jsfiddle.net/7ekv24ab/少し簡略化します。 – tiffon

0

進さんをパックするために、あなたのコードにいくつかの時間を過ごしました。その完璧ではないと確信してこれを行うより良い方法です。それが役立つかどうかチェックするか、またはヘックスのステップをサークルから外すことができたら[row_sizesの計算に問題があります]。たぶん、私は時間がたつごとにそれを見直すことができますか、またはこれを行うための他の方法を見ることができます。

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 circle = { 
 
\t r: 120, /// 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 } 
 
} 
 

 
var hex_w = hexagon.r * 3; /// added spacing 
 
var hex_h = Math.floor(Math.sqrt(3) * hexagon.r/2); /// added spacing 
 
var hex_s = (3/2) * hexagon.r; 
 

 
var hex_width = 33.4; //based on r = 20 
 

 
fill_CircleWithHex(circle); 
 

 
function fill_CircleWithHex(circle){ 
 
\t drawCircle(circle); 
 
\t 
 
\t var c_h = circle.r * 2; /// circle height //// 
 
\t var c_w = c_h; //// circle width ///// 
 

 
\t var max_hex_H = Math.round(c_h/(hex_h )); 
 
\t var row_sizes = [] 
 
    
 
\t for(var col= 0; col < max_hex_H; col++){ 
 
\t \t 
 
\t \t var d = circle.r - (col * hex_h); //// distance from circle's center to the row's chord //// 
 
\t \t var c = 2 * (Math.sqrt((circle.r*circle.r) - (d * d))); /// length of the row's chord //// 
 
\t \t 
 
\t \t row_sizes.push(Math.ceil(c/(hexagon.r * 3))) 
 
\t } 
 

 
\t for(var row = 0; row < row_sizes.length; row++){ 
 
\t \t var max_hex_W = row_sizes[row]; 
 
    console.log(hex_w); 
 
\t \t var x_offset = Math.floor((c_w - (max_hex_W * hex_w))) + row%2 * hex_width - hex_width/2; // changed offset to define a zig zag 
 
\t \t 
 
\t \t for(var col = 1; col < max_hex_W; col++){ 
 
\t \t \t hexagon.pos.x = (col * hex_w) + (circle.pos.x - circle.r) + x_offset ; 
 
\t \t \t hexagon.pos.y = (row * 17.3) + (circle.pos.y - circle.r) ; 
 
\t \t \t ctx.fillText(row+""+col, hexagon.pos.x - 6, hexagon.pos.y+4); 
 
\t \t \t drawHexagon(hexagon) 
 
\t \t } 
 
\t } 
 
} 
 

 
function drawHexagon(hex){ 
 
\t var angle_deg, angle_rad, cor_x, cor_y; 
 
\t ctx.beginPath(); 
 
    
 
\t for(var c=0; c <= 5; c++){ 
 
\t \t angle_deg = 60 * c; 
 
\t \t angle_rad = (Math.PI/180) * angle_deg; 
 
\t \t cor_x = hex.r * Math.cos(angle_rad); //// corner_x /// 
 
\t \t cor_y = hex.r* Math.sin(angle_rad); //// corner_y /// 
 
\t \t if(c === 0){ 
 
\t \t \t ctx.moveTo(hex.pos.x+ cor_x, hex.pos.y+cor_y); 
 
\t \t }else{ 
 
\t \t \t ctx.lineTo(hex.pos.x+cor_x, hex.pos.y+cor_y); 
 
\t \t } 
 
\t } 
 
\t ctx.closePath(); 
 
\t 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.stroke(); 
 
} 
 

 

 
    $(function() { 
 
    $("#slider").slider({ 
 
\t \t max: 200, 
 
\t \t min:0, 
 
\t \t value:100, 
 
\t \t create: function(event, ui) { 
 
\t \t \t $("#value").html($(this).slider('value')); 
 
\t \t }, 
 
\t \t change: function(event, ui) { 
 
\t \t \t $("#value").html(ui.value); 
 
\t \t }, 
 
\t \t slide: function(event, ui){ 
 
\t \t \t $("#value").html(ui.value); 
 
\t \t \t circle.r = ui.value; 
 
\t \t \t ctx.clearRect(0,0, canvas_width, canvas_height); 
 
\t \t \t fill_CircleWithHex(circle); 
 
\t \t } 
 
\t }); 
 
    });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<link href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.css" rel="stylesheet"/> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script> 
 

 
<canvas id="myCanvas" width="350" height="250" style="border:1px solid #d3d3d3;"> </canvas> 
 
<div style="width: 200px; height: 40px;"> 
 
\t <div id="slider" style="position:relative; width: 150px; top: 4px;float: left;"></div> <div id="value" style="float: left;"> 0 </div> 
 
</div>

+0

解決策が包含制約に違反しているため、下降しています。 – collapsar

0

短い答え:これを実行する簡単な方法はありません。特殊なケースが多すぎます。説明するために、1,2,3,4,6,7の六角形で簡単に始まり、その上に収まる最小の円を描き、円の中心が終わるところに注意してください。

円の中心がかなり動き回っています。それは、六角形の中央、頂点またはジャンクション上に終わる可能性があります。

それ以降は悪化するだけです。

この問題で最も近いのはthis pageです。

EDIT:プログラミングの六角形に関する非常に包括的な治療については、次のブログページをご覧ください。

http://www.redblobgames.com/grids/hexagons/

関連する問題