の地点にある地点にあると思われます。あなたはいくつかの都市を持っているので、中央の都市の場所を一種の中心として選ぶことができます。
出発点Zを考えると、各レイはサイズの下限と上限を持ち、セットは細部を得るために数が増えています。私は以下のスキームをスケッチしました。それについては何もテストされていません。気軽に改善を提案してください。
各光線は角度θで表され、原点Zを持ちます。各光線は1つの長さではなく、内側と外側の2つの長さがあり、収束しようとします。内側の初期値は0に設定され、外側は可能な半径(「水平線」)より大きい値に設定されます。私たちはそれが領土内に収まるまでOutsideを縮小し、二分探索(あなたのゲーム空間の直径でlog2 N)を使用して、それが領土のかなり外に出るまで内部で成長します。また、境界線の詳細を取得するために端点を広げて、光線の数を増やします。最終的な結果は、終点が「間隔を空けて」離れていない領域の境界を確立する一連の光線であると考えられます。
1本の光線から始めることができます(theta = North(0)、Inside = 0、Outside = Horizon)。 一連の光線Rをシータでソートすると仮定します。 とRからの光線rがある場合、次の(r)はソートされた次の光線です r)は、セット内の最初のレイであるRの最後のレイです。 は都市の位置を知っているので、内側の点として都市を持つ光線をセットにすることができます。 いずれにしてもうまくいくはずです。
追加のパラメータ「しきい値」を使用すると、回答の精度が向上します。
R = empty
add_to_R(0,0,Horizon)
repeat until done
done = true
for each ray r in R
guess = average(Inside(r),Outside(r))
if guess>threshold
then done = false
if interritory(Z+(Theta(r),guess))
then Inside(r)=guess
else Outside(r)=guess
for each ray r in R
if (distance(Inside(r),Inside(next(r)))> spacing
then add_to_R(average(Theta(r),Theta(next(r)),
min(Inside(r),Inside(next(r)),
max(Outside(r),Outside(next(r))
end
ランニングコストは、選択された光線エンドポイント間隔で割った領域の外周に関係すること乗算器と、あなたの最大領域の直径が2を記録すべきです。
このスキームは完全ではありません。半島の中でサンプリングしないことによって、光線が交差するようになるという領土の半島の存在下では失敗するでしょう。もし半島が恣意的に薄ければ、それを発見するために任意に多くの標本が必要になるだろう。おそらく、半島の最小幅を選択し、最後に収束していないことを確認する半球幅の収束光線を見つけたら、外側にステップするアルゴリズムを調整することができます。
地域は任意の多角形であってもよいし、特定の形状のタイルに指定できますか?探し始める場所に関する情報がありますか、それを探している有限の2D空間を照会するだけですか? – Matthew
どのような形状でも構いません。 http://store.introversion.co.uk/images/screen_shots/defcon_screen1.jpg – Martin
私はすべての敵の都市の位置を得ることができるので、私はいくつかの出発点を知っています。だから、あなたは敵の領土にいると知られている〜20ポイントで始めると仮定します。 – Martin