1

...そして読んでくれてありがとう...

私はまだロープを学んでいるので、許してください... ;-)

空間で固体をメッシュする関数を書いています。メッシュは「Node」クラスのオブジェクトを使用して実行され、各ノードは次のように表されます。

int id
double p
double r

当初、私はマップが進むべき道だと思っていました。マップを使用すると、「id」キーと2番目のキー(ノードオブジェクトへのポインター)を関連付けることができます。

このようなもの:

int nodeId;
Node *node;
std::map<int, Node *> NodeMap;

次に、ノードを作成するときに、「new」演算子を呼び出します。たとえば、forループでは、次のようなことを行います。

node = new Node(i); // the node constructor sets the id to the value of i.

そして、新しいノードをマップに追加します。

NodeMap[i] = node;

しかし....私は、最初のキー(id)ではなく、pおよびrパラメーター(ノードの座標)によってマップをルックアップする必要があることに気付きました。

言い換えると、pとrの値を指定してノードIDを返すものが必要になります。整数の最初のキー(id)を使用してルックアップが行われる場合、マップは完全なコンテナーです。この特定の問題を解決する方法について誰かが提案を持っていますか?

どうもありがとう!AsvP。

4

6 に答える 6

6

「この構造を表現するために何を使用すればよいか」という質問と同様に、それをどのように操作したいかによって異なります

シーン グラフは 3D ライブラリで一般的です。シーン グラフは、ノード上でツリー ベースのトラバーサルを提供し、多くの場合、変換、相互作用、およびその他の属性をツリーにカスケードすることができます。

レンダリングされるオブジェクトを共通の構造に保持するものとして、バイナリ スペース パーティショニング ツリーがあります。これにより、他のオブジェクトによって明らかに見えない、または遮られているオブジェクトを効率的にカリングできます。

編集; 浮動小数点でインデックスを作成していたことを見逃していました。これは通常、悪い考えです (ほとんどの標準マップで必要とされる正確さが、浮動小数点動作の不安定性に関連する問題を引き起こすため)。この動作が本当に必要でない限り

この場合、次のような処理方法が必要です。

  • ドメインの小さなセクションを正確に指し示し、複数のノードが同じスペースのチャンクを占有するのを防ぐことができるように、ドメインをチャンク化します。
  • ポイントp、rを求めるときに、その領域に存在する(おそらく空の)ノードのセットが与えられるように、スペースをバケット化する何らかの方法を用意します(ノードの集中度が高い領域の適応的な細分化が必要になる可能性があります)。
于 2009-02-13T16:32:44.450 に答える
1

利用可能なジオメトリ ライブラリをご覧になりましたか。私はこの分野の専門家ではありませんが、最近ブースト メーリング リストのプレビュー中にGTLについて耳にしました。

于 2009-02-13T16:37:45.763 に答える
1

ルックアップの問題とは関係ありませんがNodesnew. あなたの場合のように、マップがノードを所有している場合は、次のように簡単に言うことができます。

map <int, Node> mymap;     // map of Nodes, not pointers to Nodes
...
myMap[i] = Node( whatever );

これにより、メモリ管理が大幅に簡素化されます。newC++ では、可能な限り明示的な動的メモリ割り当てを避ける必要があります。

于 2009-02-13T16:44:29.507 に答える
0

map<> は機能しません。C++ の連想コンテナーは、キーの等価性に基づいて機能し、浮動小数点数の等価性の比較はまったくうまくいきません。

x と y を指定すると、ノードを見つける必要があるように思えます。最善の方法は、何を達成しようとしているかによって異なります。座標が与えられたときに最も近いノードを見つけようとしていますか、それともノードに非常に近い座標を計算しようとしていて、そのノードを見つける必要がありますか?

2 つ目は、x または y 座標 (x と仮定します) でノードを並べ替え、バイナリ検索を実行して、指定した x に非常に近い x 座標を持つノードを見つけることです。これにより、通常、少数のノードが選択され、ほぼ正しい y を検索できます。

(もちろん、ノードがある種の予測可能なグリッド内にある場合、積分格子点がある場合は x と y を最も近い整数に丸めるなど、直接計算する手段を提供できるはずです。)

最も近いノードを見つける必要がある場合は、少し複雑になります。これについてはあまり役に立ちませんが、幾何学的アルゴリズムのリソースがあります。

于 2009-02-13T16:46:29.643 に答える
0

あなたは実際に何をしようとしていますか?

3D 位置を表す 2 つの座標がある場合、それらは 3 つの頂点コンポーネントを生成するパラメーター化された関数への入力であると仮定します...この場合、ノードは実際には何のためにあるのでしょうか? ほとんどの場合、このようなパラメータ化を使用してメッシュを直接生成できます。

例として、パラメータ u、v (0...2PI) および (0...PI) を取り、次のようにしてそれらを座標に変換する単位球を考えます。

x = sin(u)*cos(v);
y = sin(u)*sin(v);
z = cos(u);

これを使用して、u と v を適切な範囲で変化させ、重複した頂点をマージすることでメッシュを作成できます。たとえば、u = 0、u = 0.1、v = 0、v = 0.1 とすると、2 つの三角形を作成できる 4 つの頂点 V(u,v) を作成できます。これは一般的なケースであり、特別なケースではないふりをしているので、頂点が重複しているかどうかを確認してそれらをマージし、縮退した三角形を確認して削除するなどのことを行う必要があります。

于 2009-02-13T16:40:53.760 に答える
0

ジェリコが頭に釘を打つ。3D メッシュを生成するために 2 つのパラメータを使用しています。2 つのパラメーターは円柱座標です。1 つは角度で、2 番目は軸に沿った z です。彼の球の例と同様に、半径は定数です。メッシュを作成できますが、メッシュを更新する必要があり、更新を行う関数が ID を入力引数として取りません。これらのパラメータ p と r を使用して、「元の位置」を取ります。

于 2009-02-13T16:51:15.670 に答える