2017-08-01 1 views
0

Dans mon problème actuel, je veux être en mesure de détecter quand un point est dans un vtkUnstructuredGrid 2D ou non.Comment trouver si un point est dans un contour défini par une grille 2D non structurée en VTK?

J'ai essayé d'utiliser vtkSelectEnclosedPoints en créant un vtkGeometryFilter et en l'utilisant sur mon Grid non structuré. Toutefois, la classe vtkSelectEnclosedPoints est conçue pour vérifier si les points sont situés dans une surface et non dans un contour. Ainsi, lorsque j'essaie de l'appliquer en 2D, je trouve que mes points sont en dehors de ma maille même si je sais qu'ils sont situés à l'intérieur. C'est parce que la classe fonctionne intrinsèquement en 3D. Y a-t-il une classe ou une approche similaire que je pourrais utiliser pour détecter quand les points sont dans un vtkUnstructuredGrid 2D? Le code est capable de connaître la dimension du maillage avant de l'ouvrir (c'est une entrée utilisateur).

Répondre

1

Donc, tous les points de votre "contour" vtkUnstructuredGrid forment un seul polygone? Dans ce cas, vous pouvez utiliser la classe vtkPolygon, voir l'exemple here. Si votre grille non structurée est composée de plusieurs polygones, alors j'utiliserais toujours la même chose, juste itérée sur tous les polygones.

+0

Tous les points dans le contour de mon vtkUnstructuredGrid forment une géométrie concave étrange qui change avec chaque exécution de mon logiciel. Puisque cette géométrie est constituée d'un nombre de polygones qui peut aussi changer de temps en temps, je ne vois pas comment je pourrais reconstruire ces polygones à chaque fois? – BlaB

+0

La fonction PointInPolygon fonctionne également avec des polygones concaves, ce qui n'est pas un problème. Si, comme vous le dites, la géométrie est constituée de plusieurs polygones, testez simplement tous les polygones à l'aide de la fonction PointInPolygon de l'exemple jusqu'à ce que vous en trouviez un (ou jusqu'à ce que vous l'ayez testé). Si cette solution n'est pas ce que vous cherchez, une capture d'écran ou un extrait de code pourrait peut-être mieux illustrer votre problème ... Comment la limite que vous voulez tester est-elle définie, sinon comme un (ensemble de) polygone (s)? – tomj

0

Vous pouvez créer un vtkModifiedBSPTree basé sur votre grille 2D et effectuer une diffusion rayonnée (IntersectWithLine) pour les points que vous souhaitez tester. J'ai utilisé cette classe pour les modèles de terrain triangulés en polydata, il est extrêmement rapide et fiable.