これらの間の位置に制約を持つランダムな点のセットを作成する基本的な方法は、特定の場所に配置される点の確率を調整する機能を持たせることです。この関数は定数で始まり、ポイントが置かれると、そのポイントを囲む禁止されたエリアはゼロに設定されます。それは連続変数では困難ですが、問題を離散化するとかなり簡単です。
その他注意しなければならないのは、シリンダー部分にあることです。周期的に繰り返される矩形領域上のランダムな点と考える方が簡単かもしれません。これは、2つの異なる方法で処理することができます。
最も簡単なのは考慮にあなたがポイントを配置している長方形のタイルが、また、その近隣のものではないだけを取ることです。あなたがメインタイルにポイントを置くたびに、あなたはまた、隣のタイルにポイントを置き、タイル内の確率関数にその効果を計算します。
より洗練されたアプローチでは、すでに配置されたポイントに対応するデルタ関数の合計で、禁則領域を符号化するカーネルの確率関数を考慮します。これがFFTを使用して計算される場合、周期性は生成物によって自然である。
次のように最初のアプローチは、コード化することができます:あなたは自分の価値観でそれを実行した場合、大きな最小距離が他のすべてを禁止して
from __future__ import division
import numpy as np
r, h = 20, 300
w = 2*np.pi*r
int_w = int(np.rint(w))
mult = 10
pdf = np.ones((h*mult, int_w*mult), np.bool)
points = []
min_d, max_d = 230, 250
available_locs = pdf.sum()
while available_locs:
new_idx = np.random.randint(available_locs)
new_idx = np.nonzero(pdf.ravel())[0][new_idx]
new_point = np.array(np.unravel_index(new_idx, pdf.shape))
points += [new_point]
min_mask = np.ones_like(pdf)
if max_d is not None:
max_mask = np.zeros_like(pdf)
else:
max_mask = True
for p in [new_point - [0, int_w*mult], new_point +[0, int_w*mult],
new_point]:
rows = ((np.arange(pdf.shape[0]) - p[0])/mult)**2
cols = ((np.arange(pdf.shape[1]) - p[1]) * 2*np.pi*r/int_w/mult)**2
dist2 = rows[:, None] + cols[None, :]
min_mask &= dist2 > min_d*min_d
if max_d is not None:
max_mask |= dist2 < max_d*max_d
pdf &= min_mask & max_mask
available_locs = pdf.sum()
points = np.array(points)/[mult, mult*int_w/(2*np.pi*r)]
、出力は、通常、1つか2つの点です。より合理的な値で実行するとここ
min_d, max_d = 50, 200
は、確率関数は、最初の5点の各々を確定した後にどのように見えるかは次のとおりに沿った点が最初の高さ、座標の対として返されること
注、第二の距離シリンダーの円周。
シリンダー、または直線(ユークリッド)の表面に沿った距離? – NPE
シリンダーの表面に沿って – user1407199
質問に追加してください。 – NPE