4

私は現在、ある種の円グラフ/ボロノイ図ハイブリッド(キャンバス/javascript)を構築しようとしています.それが可能かどうかさえわかりません. 私はこれに非常に慣れておらず、まだアプローチを試していません。

円と、2、3、5、7、11 の数字のセットがあるとします。

円を数字に相当するセクション (円グラフによく似ています) に細分化したいのですが、格子/ハニカムのような形状を形成します。

ここに画像の説明を入力

これは可能ですか?特に、基本的な円グラフのレンダリングしか行ったことがない人にとっては、とてつもなく難しいでしょうか?

4

3 に答える 3

0

これは、簡単に見てからの私の見解です。

n頂点/エッジを持つポリゴンがあると仮定した場合の一般的な解決策は、方程式kの解決策に依存しますn。各方程式には2nk、(ただし正確2kにゼロ以外の)変数しかありません。各ポリゴンの方程式の変数は同じx_1, x_2, x_3... x_nky_1, y_2, y_3... y_nk変数です。各ポリゴンの方程式について、正確に4つが非ゼロの係数を持ち、正確に4つが非ゼロの係数を持ちますx_1, x_2, x_3... x_nk。親の形状に応じて境界が異なります。簡単にするために、形状は円であると仮定します。境界条件は次のとおりです。y_1, y_2, y_3... y_nkx_iy_i(x_i)^2 + (y_i)^2 <= r^2

2nk注:下限がわからないため、以下とは言いませんが、を超えることはできないことを知っています2nk。これは、必要に応じて、頂点を共有するポリゴンの結果です。

方程式は、各ポリゴンの面積を表す、明確であるが可変の範囲の積分のコレクションであり、ポリゴンの面積は次のようになりithます。

A_i = pi*r^2/S_i

ここrで、は親円の半径であり、はS_i図のようにポリゴンに割り当てられた番号です。

(x_j,y_j)ポリゴンの方程式にゼロ以外の係数を持つ4つの別々のペアは、ポリゴンの頂点を生成します。

これはかなり難しいかもしれません。

于 2012-08-03T05:24:55.723 に答える
0

境界は最初から固定ですか、それとも少しデフォルメできますか。

これを解決しなければならない場合は、領域を大きいものから小さいものへと並べ替えます。次に、最大の領域から始めて、最初に必要なサイズのランダムな凸多角形 (円に沿った頂点) を生成します。次の領域は最初の領域とエッジを共有しますが、そうでなければランダムで凸状になります。その後の各ポリゴンは、既存のポリゴンから既存のエッジを選択し、そこから始まる「凸」エッジも共有します(「凸エッジ」は、新しいポリゴンに使用された場合、新しいポリゴンはまだ凸状です)。

「合計境界が目的の境界に近づく」ためのさまざまな予想ポリゴン位置を評価することにより、おそらく最初の目標に対する安価な近似を生成できます。これは、ワード クラウドが行うことと非常によく似ています。多かれ少なかれ閉じられたスペースを埋めようとしながら、物を最大から最小に段階的に配置します。

于 2012-08-03T08:05:29.577 に答える
0

一連のボロニオ中心 (つまり、それぞれの中心の座標のリスト) が与えられると、各中心に最も近い領域を計算できます。

area[i] = areaClosestTo(i,positions)

中心が正しい場所にないため、これらが少し間違っていると仮定します。したがって、領域を理想的な領域と比較することで、現在のセットの誤差を計算できます。

var areaIndexSq = 0;
var desiredAreasMagSq = 0;
for(var i = 0; i < areas.length; ++i) {
    var contrib = (areas[i] - desiredAreas[i]);
    areaIndexSq += contrib*contrib;
    desiredAreasMagSq += desiredAreas[i]*desiredAreas[i];
}
var areaIndex = Math.sqrt(areaIndexSq/desiredAreasMagSq);

これは、領域と desiredAreas の間の差分ベクトルのベクトル ノルムです。最小二乗適合線がどれだけ優れているかの尺度のように考えてください。

ある種のハニカム パターンも必要なので、それを と呼びhoneycombness(positions)、物の品質の全体的な尺度を取得できます (これは単なるスターターであり、これの重み付けまたは形式はボートに浮かぶものであれば何でもかまいません)。

var overallMeasure = areaIndex + honeycombnessIndex;

次に、推測がどれほど悪いかを知るメカニズムがあり、これを位置を変更するメカニズムと組み合わせることができます。最も簡単なのは、各中心の x 座標と y 座標にランダムな量を追加することです。または、エリアが高すぎる隣接エリアに向かって各ポイントを移動し、エリアが低すぎるエリアから遠ざけることもできます。

これは単純な解法ではありませんが、各点に最も近い面積を計算する以外に必要な数学は最小限であり、親しみやすいものです。難しい部分は、極小値を認識して対処することかもしれません。

ちなみに、プロセスの開始点を取得するのはかなり簡単なはずです。パイのスライスの重心は、真実からかけ離れていてはなりません。

明確な利点は、中間計算を使用して、パイからボロノイへの遷移をアニメーション化できることです。

于 2013-03-25T14:22:05.130 に答える