2013-06-15 7 views
5

Próbuję napisać wtyczkę do Blendera, która automatycznie porządkuje drzewo węzłów, bez nakładania się i połączeń, które przepływają w lewo. Mam dostęp do listy węzłów, ich pozycji, ich wymiarów oraz listy połączeń/łączy. Wykres przebiega od lewej do prawej i może zawierać wiele początkowych i końcowych węzłów. Wyjście węzła nie można podłączyć do wejścia węzła przed nim, czy to własnych wejściowychJak ustawić wykres liniowo bez nakładania się?

Czy ktoś wie, z papieru lub artykuł, który skupia się na kodowanie coś, co może odwrócić ten (brak zależności cykliczne.): Messy nodes

W to? Neat nodes

Metoda, którą pierwotnie wymyśliłem to: Dla wszystkich węzłów, które nie mają połączeń wejściowych, ustaw je po lewej stronie. Dla wszystkich węzłów, które są podłączone do tych węzłów początkowych, umieść je po prawej stronie łączącego węzła początkowego. Powtórz to dla każdego węzła do końca. Jeśli jeden węzeł nakłada się na inny, przenieś go, a łańcuch węzłów po jego prawej stronie, w dół.

To było wspaniałe dla każdego izolowanym sieci, ale gdy węzeł jednego łańcucha podłączony do węzła innego (oddział, który łączy z powrotem do bagażnika na przykład), to często mają wsteczną połączenie: Backward connection

Ta metoda, którą wymyśliłem, wydaje się całkiem ... prymitywna. Czytałem trochę o układach kierowanych przez Spring Force, ale wydaje się, że są bardziej dla wykresów, które płyną w dowolnych/wszystkich kierunkach, i nie jestem do końca pewny, jak ręcznie to zaimplementowałem tutaj, ponieważ " m ograniczone do korzystania z samej matematyki rdzeniowej bez innych zewnętrznych bibliotek.

To nie jest zwykły problem, ale nie jestem pierwszym, który spróbuje to rozgryźć. Nie proszę o dokładne przykłady kodu, tylko o coś, na co mam zwrócić uwagę, aby pomóc mi opracować przyzwoity algorytm.

Odpowiedz

4

A węzłów, jeśli istnieje, zapewni poprawną kolejność węzłów do wyświetlenia. Jeśli dwa węzły nie są powiązane, ale sąsiadują ze sobą, mogą być umieszczone w tej samej współrzędnej X, jeśli chcesz.

Generalnie, rysowanie drzew z odpowiednim odstępem to NP-complete [patrz odnośniki na Drawing Presentable Trees, Bill Mill], a rysowanie wykresów nie jest łatwiejsze.

1

chciałbym wykorzystać Graphviz na to: http://www.graphviz.org/

  1. Czytaj swoją Blender wykres w pamięci
  2. Napisz na ten sam wykres w formacie GraphViz plików wykres
  3. uruchomić jeden z plików wykonywalnych Graphviz (chciałbym proponuję dot (link))
  4. Czytaj równoważny wykres ale z pozycji węzłów stworzonych przez Graphviz
  5. Napisz wykres Blendera, z pozycjami zmodyfikowanymi na podstawie wyników GraphViz

Chyba że chcesz z powodów akademickich, nie wymyślaj ponownie koła. Takie podejście powinno być łatwe do wykonania i nie będzie wymagać projektowania złożonego algorytmu układu wykresów.

+0

Ponieważ będzie używany przez inne osoby, nie mogę polegać na żadnym zewnętrznym oprogramowaniu lub bibliotekach. Spojrzałem na teorię z teorii GraphViz, która trochę mnie zainspirowała, chociaż nigdy jej nie użyłem. –