2

Je cherche une bibliothèque capable de décomposer des polygones. Je veux définir définir des orientations ou des lignes dans lesquelles le polygone doit être fragmenté, comme on le voit ici:Décomposition de polygones dans une direction spéciale

an irregular polygon with internal subdivision lines, some vertical some not

Alors que je reçois les petits polygones. Quelqu'un connaît une bibliothèque qui supporte cela?

Ou des idées?

+0

De l'image, il n'est pas évident - quel est le critère d'ajout de ligne dans la partition résultante (lignes, qui sont les arêtes sont présentes, mais il y a aussi quelques lignes qui traversent les côtés d'un polygone) –

+0

la ligne doit avoir les directions des arêtes et commencer sur chaque point de contour. Mais mon but est de définir des directions aléatoires et de faire la décomposition dans cette direction. – Hunk

+0

Donc, c'est juste un ensemble de lignes? Je veux dire, l'entrée est: polugon qui sera décomposé et un certain nombre de lignes (laissez-les être des parallèles aux bords du polygone). Et qu'attendez-vous comme résultat? Un ensemble de nouveaux polygones? –

Répondre

1

Je ne sais pas quelle langue utilisez-vous? J'ai une bibliothèque, écrite pour mes besoins, qui peut obtenir une partition complète par un ensemble de lignes donné et renvoyer des polygones en conséquence. Il est écrit sur PHP et appelé dimension et, en l'utilisant, vous pouvez résoudre votre question comme moyen:

  1. Définir votre polygone par un ensemble de lignes LineSet_2D ou Polygon_2D
  2. Définir des lignes de séparation aussi par Line_2D
  3. Utilisez la méthode LineSet_2D getPolygons pour trouver tous les polygones

J'ai écrit un exemple:

//define or polygon. Note that Polygon_2D can also be used 
$rPolygon = new LineSet_2D(
    new Line_2D(0, 3, 1, 1), 
    new Line_2D(1, 1, 3, 0), 
    new Line_2D(3, 0, 1,-1), 
    new Line_2D(1,-1, 0,-3), 
    new Line_2D(0,-3,-1,-1), 
    new Line_2D(-1,-1,-3,0), 
    new Line_2D(-3, 0,-1, 1), 
    new Line_2D(-1, 1, 0, 3) 
); 
//define partition line set 
$rPartition = new LineSet_2D(
    new Line_2D(-1, 1, 1,-1), 
    new Line_2D(-1,-1, 1, 1) 
); 
//result line set: 
$rResultSet = LineSet_2D::createFromArray(array_merge(
    $rPolygon->getLines(), 
    $rPartition->getLines() 
)); 
//for example, dump plain result: 
var_dump($rResultSet->getPolygons()); 

Vous pouvez également trouver cet exemple here Mais je pense que ce n'est pas la solution exacte pour votre question, puisque ma classe LineSet_2D retournera tous les polygones en boucle (c.-à-d. pas seulement des «morceaux»).

+0

hé, merci de votre réponse j'utilise C++. Qu'est-ce que vous voulez dire avec des polygones en boucle? Ma solution devrait être chaque polygone par exemple A, B, c ....dans ma figure – Hunk

+0

Eh bien, je pense qu'il n'est pas trop difficile d'adapter PHP à C++ (puisque C++ a beaucoup plus de portée de syntaxe et de capacités OOP). En mentionnant les polygones en boucle, je veux dire que vous allez faire une partition via LineSet_2D, vous obtiendrez tous les polygones, pas seulement les morceaux d'original. Exemple: imaginez un carré avec 2 diagonales. Il est divisé en 4 morceaux, mais il a beaucoup plus de vrais polygones, puisqu'il n'y a pas seulement de "petites" pièces triangulaires, mais aussi de "gros" triangles et même pas de triangles (carré entier sans un petit triangle)). –

+0

ok merci beaucoup – Hunk

0

Vous recherchez une opération booléenne "polygone chop". Vous pouvez google pour les ressources disponibles.

Certaines files d'attente sur le faire sur votre propre .. Pour chaque ligne de coupe ..

  1. Trouver les points d'intersection de la ligne de coupe avec les bords du polygone.
  2. Pour chaque bord qu'il croise, divisez le bord en deux.
  3. Diviser le polygone correspondant au bord divisé en deux polygones.

Faites la même chose pour tous les polygones. Vous devrez prendre soin de cas spéciaux, comme la ligne de séparation passant par le sommet et ainsi de suite ...

+0

vous voulez dire des opérations comme diff etc.? Vrai de cette façon c'est possible mais je pense que j'ai beaucoup de bibliothèque qui fait ça avec 2 polygones, donc ça devrait en avoir un peu avec un polygone et une ligne? – Hunk

+0

Je ne suis pas sûr des bibliothèques qui font cela pour vous. Je n'utilise pas d'autres, puisque je travaille sur un. En outre, il ressemble plus à un problème de structure de données en dehors des routines d'intersection. Donc, si vous ne trouvez pas un, ce qui serait probablement le cas. Vous pouvez aller de l'avant et écrire l'un des vôtres. Ce n'est pas si difficile, et peut-être amusant à faire. De plus, vous pouvez corriger vous-même les bugs à l'avenir. –