On this page |
int pcopenlod(string filename, string Pchannel, vector P, int min_pts, ...)
この関数は、ポイントクラウドファイル(.pc
)を開き、そこに含まれているポイントへのアクセスのキューを作成します。
そして、pcunshadedやpciterateによってポイントを繰り返すことができ、pcexportを使えば、新しいデータをポイントクラウドに追加することができます。
この関数はpcopenと同様ですが、大きな違いは、この関数が作成するキューのポイントは全体のポイントグループの集合体であることです。 言い換えれば、単一ポイントがたくさんのポイントを表現しているということです。 この関数は、ポイントクラウド内のポイントを無視しないで、目的の詳細レベルで検索を実行することができます。 例えば、検索原点に近いポイントが通常通りにキューに追加される検索を実行することができますが、原点から遠いポイントは平均化されます。 この関数は激的なパフォーマンスの向上を引き起こします。なぜなら、全体のポイントグループが単一ポイントのように処理することができるからです。
pcopenと同様に、Pは検索原点を指定し、Pchannelはポジションチャンネルを指定します。 構築中は、ツリー構造がポイントクラウド内のポイントすべてを網羅した単一の境界ボックスとして構築され始め、ノード内のポイント数がmin_ptsより小さくなるまで再帰的に細分化されます。 ポイントの細分化が止まれば、リーフノードが作成されます。min_ptsに適するデフォルト値は8です。
ある条件に達するまでルートノードからツリー構造を降下することで検索が実行されます。
概念的には、大雑把な検索から始めて、十分に詳細な検索になるまで洗練化していきます。
measure
を使えば、検索が目的の詳細レベルになる時を決めることができます。measure
ではdistance
とsolidangle
の2つの値がサポートされています。
Distance Query ¶
Solid Angle Query ¶
Solid Angle検索は、検索ポイントへの近さとポイントの領域によってポイントに優先順位を付けます。 つまり、検索ポイントに近くて、大きい領域を持つポイントが優先順位のウェイトが高いです。 検索プロセスは、ポイントの子をキューにすることで、より大きい寄与度を持つポイントを分割しようとします。
ポイントの寄与度の計算に使用される実際の方程式は、以下の通りです:
Ai / ||Pi - P||^2,
Aiは集合領域値、Piは集合ボックス内のPに一番近いポイント、Pは検索原点です。
pcopenlod
(…, "measure"
, "solidangle"
, "area"
, "A"
, …)をコールすれば、領域値を保持していると思われるA
チャンネルでSolid Angle検索を実行します。
Solid Angle検索を使用する方法は2通りあります。
1つ目が、指定したthresholdを満たすポイントの数に応じて、異なるポイントの数を返す制限なし(threshold
)の検索です。
2つ目が、常に同じポイントの数を返す制限あり(samples
)の検索です。
samples
引数があれば、制限ありの検索が使われます。
制限ありの検索は、thresholdによるサンプルを使わないで優先順位を付けることで動作します。 つまり、ポイントの合計のウェイトが考慮されず、同じポイントの数を返します。 アルゴリズムは、寄与度の大きいポイントのピックとそのポイントの分割によって、目的のサンプル数になるまで分割を繰り返すことで動作しています。 制限のある検索は、検索に対して一定のパフォーマンスまたは最低品質レベルが必要な時に役に立ちます。
Threshold検索は、ポイントの寄与度と一定の閾値を比較することで動作します。 そして、この比較に基づいてポイントの受け入れまたは拒否をします。 検索ポイントが異なれば、ポイントの寄与度も異なるので、Threshold検索では、キューされるポイントの数は変化します。 Threshold検索は、ポイントクラウドから遠い位置を検索するために、ポイントの最低数を使うことを許容できる時に役に立ちます。
Aggregation(集約) ¶
追加する文字列パラメータは、ポイントの値を集約する方法を指定します。
各チャンネルには、mean
(平均)、sum
(合計)、weighted
(荷重平均)の集約モードがあります。
pcopenlod
(…, aggregate:P
, sum
)をコールすれば、チャンネルP
の値を合計します。
pcopenlod
(…, aggregate:A
, weighted
, weight
, W
)をコールすれば、チャンネルW
のウェイトから加重平均法を使ってチャンネルA
の値を集約します。
サンプル: Proximity Query(近接検索) ¶
int handle = pcopenlod(texturename, "P", P, 8, "measure", "distance", "threshold", 2.0, "aggregate:P", "mean", "aggregate:value", "sum"); Cf = 0; while (pciterate(handle)) { pcimport(handle, "value", valueSum); Cf += valueSum; } pcclose(handle);
サンプル: Threshold Solid Angle Query ¶
handle = pcopenlod(texturename, "P", P, 8, "measure", "solidangle", "area", "A", "threshold", 0.01, "aggregate:A", "sum", "aggregate:irradiance", "weighted", "weight", "A", "aggregate:P", "mean"); Cf = 0; while (pciterate(handle)) { pcimport(handle, "irradiance", irradiance); Cf += irradiance; } pcclose(handle);
サンプル: 制限ありのSolid Angle Query ¶
handle = pcopenlod(texturename, "P", P, 8, "measure", "solidangle", "area", "A", "samples", 4, "aggregate:A", "sum", "aggregate:irradiance", "weighted", "weight", "A", "aggregate:P", "mean"); Cf = 0; while (pciterate(handle)) { pcimport(handle, "irradiance", irradiance); Cf += irradiance; } pcclose(handle);
See also | |
file | |
ptcloud |
|