2011-01-04 11 views
1

Dies ist eine abgespeckte Frage von this question. Im Grunde frage ich nur nach der Nummer 1 in der Frage.Schnelle boolesche Operation zwischen zwei Mesh-Gruppen

Lassen Sie uns sagen, ich habe zwei Gruppen von meshes, Die Definition der Mesh-Klasse ist wie folgt (C# Syntax):

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; 
} 

Gibt es eine effiziente Art und Weise/Umsetzung der resultierenden von Boolesche Operationen zu finden (in mein Fall würde ich gerne die polygonalen Schnittpunkt) zwischen zwei Mesh s finden?

Die naive Weise eine Schleife durch alle Element s innerhalb des Mesh Objekt sein würde, gilt das andere in einem anderen ElementMesh Objekt, und die Ergebnisse zu erhalten.

Aber ich glaube, es gibt effizientere Algorithmus, dies zu tun - utilizing plane sweeping algorithm.

Es wäre größer, wenn ein solcher Algorithmus bereits anderweitig implementiert wurde, entweder in .Net, C++ oder Matlab.

+0

Suchen Sie nach einer Schnittmenge (dh alle Punkte in Mesh A und Mesh B) oder einer polygonalen Schnittmenge (alle Punkte, die geometrisch in beiden Meshes liegen)? –

+0

@Zac, ich bin auf der Suche nach einer polygonalen Kreuzung. – Graviton

Antwort

-1

In C++ kann dies viel effizienter durchgeführt werden, wenn Sie das Mesh sortiert halten (oder vor den Operationen sortieren) und std :: set_intersection verwenden. Um dies zu tun, müssen Sie Point eine Art von Bestellbeziehung hinzufügen. (Die Sprache generiert automatisch die Sortieroperatoren für die anderen Klassen, vorausgesetzt, in C++ ist List ein Standardcontainer; wahrscheinlich Vektor oder Deque).

+0

erstens, wie "sortieren" Sie das "Mesh"? Zweitens unterscheidet sich der Schnittpunkt von Elementen (oder Polygonen) von dem üblichen 'set_intersection'. – Graviton

0

Nur Meshes reichen nicht aus, um boolesche Operationen auszuführen.

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

Nach diesen zusätzlichen Informationen, Boolesche Operationen sind trivial:

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; 
}; 

Aber immer ein Netz aus dieser Struktur erheblich erschwert ist. Du wirst nichts Nützliches daraus bekommen. Die beste Lösung ist so etwas wie marschierende Würfel und die Maschen, von denen du kommst, werden nicht gut aussehen.

0

Boolesche Operationen im Mesh-Bereich sind schwer zu bekommen, Sie haben recht, wenn Sie versuchen, vorhandenen Code zu verwenden.

Eine vorhandene C++ - Bibliothek, die Ihren Anforderungen entsprechen könnte, ist CGAL.

Sie könnten einen Blick auf die manual werfen.

+0

wie in der Frage erläutert, ich freue mich, Polygon-Polygon-Overlay-Operation in großem Maßstab zu tun, so bin ich auf der Suche nach etwas effizienter als der naive Algorithmus, der nur jedes einzelne Polygon innerhalb der "Mesh" -Liste schneidet . – Graviton

+0

Ich habe verstanden, dass Sie mehrere Polygone haben. CGAL unterstützt hoffentlich boolesche Operationen für Polygon-Sets, nicht nur für einzelne Polygone, werfen Sie einen Blick auf 'Aggregierte Operationen durchführen' im Handbuch. – rotoglup

+0

Das ist der Grund, warum ich von Unity zur Unreal Engine kam.Vor einem Monat hatte ich ein ähnliches Problem und habe herausgefunden, dass es ohne externe Bibliotheken extrem schmerzhaft sein wird. –

Verwandte Themen