2011-01-04 37 views
1

これは、this questionというトリミングされた質問です。基本的に私は質問の第1位について尋ねています。メッシュの2つのグループ間の高速ブール演算

(C#構文)を次のようにメッシュクラスの定義がある、のは、私がmeshesの2つのグループを持っているとしましょう:

public class Mesh 
{ 
public List<Element> elements; 
public List<Point> points; 
} 

public class Element 
{ 
    public List<int> PointIndex; 
} 

public class Point 
{ 
    public double X; 
    public double Y; 
} 

は、ブール演算の結果として得を見つけるための任意の効率的な方法/実装があります(中私の場合ポリゴンスタイルの交差点)が2つのMeshの間にありますか?

素朴な方法は、Meshオブジェクト内のすべてのElement Sをループにすることが別のMesh目的で他のElementに対してチェックし、その結果を得ることができます。

しかし、これを行うためのより効率的なアルゴリズムがあると思います。utilizing plane sweeping algorithm

このようなアルゴリズムが.Net、C++、またはmatlabのいずれかで既に実装されている場合は、もっと大きくなります。

+0

セットスタイルの交差点(つまり、メッシュAとメッシュBの両方に存在するすべての点)またはポリゴンスタイルの交差点(両方のメッシュ内の幾何学的にすべての点)を探していますか? –

+0

@Zac、多角形の交差点を探しています。 – Graviton

答えて

-1

C++では、メッシュを並べ替えたままにしておく(または操作の前に並べ替える)と、std :: set_intersectionを使用すると、はるかに効率的に行うことができます。これを行うには、何らかの並べ替えの関係をPointに追加する必要があります。 (この言語は、C++でListが標準コンテナであると仮定すると、他のクラスの順序演算子を自動的に生成します;おそらくベクトルまたはデキュール)。

+0

まず、 'Mesh'をどのようにソートしますか?次に、要素(またはポリゴン)の交点は、通常の 'set_intersection'とは異なります。 – Graviton

0

ブール演算を行うだけのメッシュでは不十分です。その追加情報の後

class B 
{ 
public: 
    virtual bool Inside(Point p) const=0; 
}; 

、ブール演算は簡単です:

class Intersect : public B 
{ 
public: 
    Intersect(B &b1, B &b2) : b1(b1), b2(b2) { } 
    bool Inside(Point p) const { return b1.Inside(p) && b2.Inside(p); } 
private: 
    B &b1; 
    B &b2; 
}; 

しかし、その構造の外にメッシュを得ることはかなり困難です。あなたはそれから何か役に立つものを得るつもりはありません。最善の解決策は、行進立方体のようなもので、あなたが得たメッシュはそれほど良く見えません。

0

メッシュブール演算が正しくなるのは難しく、既存のコードを使用しようとするのは正しいです。

あなたのニーズに合う既存のC++ライブラリは、CGALです。

manualをご覧ください。

+0

質問で説明したように、私は大規模なポリゴンポリゴンオーバーレイ操作を行うために探しているので、単純なアルゴリズムよりも効率的なものを探しています。これは 'Mesh'リストの各ポリゴンと交差しています。 – Graviton

+0

多角形が複数あることを理解しました。 CGALは単なるポリゴンだけでなく、ポリゴンセットのブール演算をサポートしていますので、マニュアルの「集約演算の実行」を参照してください。 – rotoglup

+0

これが私がUnityからUnreal Engineに来た理由です。月前に私は同様の問題を抱えていて、外部ライブラリなしでは極端に苦しいことがあると考えました。 –