2011-05-13 10 views
1

Je veux générer des points aléatoires dans un espace 2D, ces points seront des noeuds d'un graphe planaire (construit en utilisant l'algorithme Gabriel graph ou RNG). J'ai écrit du code java pour le faire, mais j'ai deux problèmes difficiles à résoudre.graphe planaire avec longueur maximale fixe des arêtes

1) J'ai besoin que tous les bords du graphe ne sont pas plus à un seuil donné

2) Après que je veux connaître les visages de graphique, un visage est un ensemble de noeuds connectés par le bord. Un visage ne contient pas d'autres noeuds. Dans l'image ci-dessous les visages sont signés par l'étiquette (F1, F2 ...)

Comment faire ces deux choses? des algorithmes? Il y a un moyen déjà connu?

Ci-dessous, il est un exemple du graphique que je dois créer

http://imageshack.us/photo/my-images/688/immagineps.png/

+0

Pouvez-vous définir plus précisément les 'faces'? De l'image, il ressemble à une coque convexe d'un ensemble de points. – dfb

+0

un visage est une collection de nœuds connectés par le bord. Un visage ne contient pas d'autres noeuds. Dans les visages d'image sont signés par étiquette (F1, F2 ...) Peut-être que les visages ne doivent être que convexes, cette propriété pourrait résulter de la construction du graphique Gabriel mais je ne suis pas sûr. – tulkas85

Répondre

1
  1. Si vous pouvez tolérer un certain écart du nombre de points, vous pouvez modifier votre algorithme de graphe de Gabriel être incrémentiel (la plus grande partie de l'effort consisterait à incrémenter votre algorithme de Delaunay), puis chaque fois qu'un bord est trop long, insérez un point aléatoire dans le cercle ayant ce bord comme diamètre.

  2. Les structures de données les plus pratiques pour les graphes plans sont centrées sur les bords: par exemple, les représentations doubly-connected edge list et quad-edge. Si vous n'utilisez pas déjà une structure de données de ce type pour l'étape Delaunay (et je ne peux pas imaginer pourquoi vous ne le seriez pas), vous pouvez trier les connexions sortantes de chaque sommet par angle. De là, il est facile d'implémenter une fonction qui prend une demi-arête et retourne la demi-arête suivante sur la même face dans le sens inverse des aiguilles d'une montre. Passez maintenant à travers tous les demi-arêtes, et pour chaque demi-arête non déjà visitée, parcourez le visage jusqu'à ce que vous reveniez à l'endroit où vous avez commencé. Marquez tous les demi-arêtes de l'itération intérieure comme une face.

+0

J'ai résolu la première étape avec peu de changements sur mon code, mais je n'utilise pas Delaunay pour créer Gabriel Graph. Pouvez-vous expliquer comment trouver l'ordre des arêtes dans le sens anti-horaire qui partagent le même point? Mes structures de données sont composées par Vecteur de bord, chaque arête contient deux points. Deux bords sont liés si vous partagez un point. – tulkas85

+0

+1 pour cette solution. @ tulkas85, dans la plupart des langues, vous pouvez utiliser quelque chose comme 'atan2()' pour déterminer l'angle d'un vecteur par rapport à l'axe X. Puis trier tous les bords avec un sommet commun par angle. – brainjam

+0

@ tulkas85 "mais je n'utilise pas Delaunay pour créer le graphique Gabriel" -> Comment créer le graphique sans Delaunay? J'utilise Delaunay mais je préférerais m'en passer. Même si je ne suis pas sûr que mon graphique est correct. Je le crée en vérifiant la condition '(a, b) est la paire gabriel si d^2 (a, b) <= d^2 (a, c) + d^2 (b, c)' pour les trois points de un triangle de Delaunay – embert