2009-06-23 13 views
5

Rysuję profile elewacyjne pokazujące elewacji Zysk/strata wzdłuż szlaku, podobny do tego poniżej:(? Proste) Umieszczenie na linii Label Wykresy

Sample Elevation Profile with hand-placed labels http://img38.imageshack.us/img38/4079/profilewithgoodlabels.png

Jest to w zasadzie z wykresem liniowym odległość od początku na osi X i wysokość na osi Y.

Chciałbym dostarczyć fantazyjne etykiety z rzędami punktów w interesujących punktach wzdłuż szlaku, takich jak te, które dodałem ręcznie do przykładowego obrazu. Szukam pomysłów, w jaki sposób najlepiej umieścić te etykiety, tak aby:

  • one nie pokrywają się ze sobą
  • one nie pokrywają się z samego profilu, a przynajmniej tak się dzieje w sposób czyste wyglądające sposób (wydaje się konieczne może być w środku strome doliny, na przykład)
  • one nie sięgają poza pole, które ogranicza ogólny obraz

Aby osiągnąć te cele, ja figura Mogę (przynajmniej):

  • Flip tekstu wokół (patrz przykład)
  • Wybierz odpowiednie długości dla liderów
  • Wybierz odpowiednie kąty dla liderów (ale minimalizacji wariancji może być pożądane ze względów estetycznych)
  • upuść elewacje spotowych na mniej ważne miejsca w zatłoczonych obszarach
  • nazwy skracać w zatłoczonych miejscach (PlaceName S w moim otoczeniu już obsługiwać skrót w bardzo miły sposób, więc przejście od „South Twin Mountain” do „S” Twin Mtn jest łatwe)
  • Kropla słabiej ważne a nnotacje całkowicie w zatłoczonych miejscach

Ale nie wiem, jak najlepiej ukształtować ten algorytm. Wygląda na to, że może to być problem z optymalizacją? (Zminimalizuj cienie związane z adnotacją i podaj liczbową karę za każdą rzecz, której staram się unikać?) Ale ponieważ istnieje wiele zmiennych dyskretnych do optymalizacji i nie zależy mi na "najlepszym" rozwiązanie (tylko dobre, a najlepiej stabilne, jedno) Nie jestem pewien, co robić.

W jaki sposób zbliża się problem podobny do tego w grafice? Programowanie dynamiczne? Oddział i granica? Czy idea optymalizacji jest poza bazą? Czy są jakieś przydatne biblioteki dla .NET, na które mógłbym chcieć spojrzeć?

(Nie chcę tego całkowicie oddawać ogólnej bibliotece graficznej, ponieważ jest to kluczowa cecha całego produktu i mam zaplanowanych kilka niestandardowych funkcji, które mogą być trudne do zrealizowania w ogólnym celu biblioteka rysowania wykresów)

+0

Jak to działa? Czy znalazłeś najlepszy algorytm? –

+0

Skończyłem z symulowanym podejściem do wyżarzania (po odstawieniu tego projektu na jakiś czas). Było dość proste w implementacji, działa raczej dobrze, a jego części można ponownie wykorzystać do innych celów, takich jak mapowanie etykiet i wybieranie układów stron, a nawet przewidywanie, które trasy przez sieć szlaków mogą być dobre do wędrówek. –

Odpowiedz

1

Prawdopodobnie umieściłbym jedną etykietę, a następnie umieściłbym następną, sprawdziłby, czy pokrywa się z pierwszą, a jeśli tak, odwróć ją, jeśli to nie działa, popchnij ją w górę, aż nie będzie zachodzą na siebie ... jako punkt wyjścia. Może dodać funkcję kosztu jako odległość od idealnego lub domyślnego miejsca docelowego (jeśli nie ma żadnych innych etykiet, które mogłyby przeszkodzić), co należy zminimalizować. Następnie znajdź najtańszy układ etykiet. Potrafi rzucać, przemieszczać się, obracać, skracać i upuszczać każdy inny koszt.

+0

To dobry pomysł, ale co się stanie, jeśli pierwszy wybór nie będzie dobry i nie zadziała w następnych kilku? Na przykład, jeśli pierwszym wyborem jest od lewej do prawej, umieszczenie etykiety, która zakrywa większość doliny i uniemożliwia umieszczenie etykiet z długimi przywódcami wychodzącymi z doliny za punkty znajdujące się w dolinie dolina? –

+0

Cóż, wtedy ogólny koszt byłby wyższy, ponieważ każda kolejna etykieta musiałaby zostać przeniesiona na większą odległość. Sądzę więc, że mógłbyś * wypróbować każdą możliwą kolejność etykiet, a następnie wziąć najniższy koszt jeden ... to oczywiście jest wysoce nieefektywne, ale być może możesz wymyślić jakieś heurystyki, aby zminimalizować liczbę możliwości, które trzeba zbadać. . – mpen

2

Oto moje zdanie:

  1. Zaznacz punkty, w których chcesz umieścić etykiety
  2. podzielić je na grupy, z odległości co najmniej 2*size między nimi
  3. dla każdej grupy, iść z prawej spróbuj umieścić etykietę.
  4. Spróbuj umieścić etykietę w prawo lub w lewo. Zobacz co skutkuje niższym długości linii pionowej
  5. Jeśli nie ma znaczenia, spróbuj umieścić na prawo
  6. Chyba, że ​​to koniec grupy, a następnie spróbuj umieścić go w lewo

Teraz przejdź jeszcze raz nad etykietami i zobacz, czy można je przewrócić z jednej strony na drugą, jednocześnie skracając długość pionowych linii.

Powinien przynieść przyzwoitą wydajność, moim zdaniem.

1

To pytanie przypomina mi projekt graficzny, który jeszcze nie tak dawno temu. Miało to narysować wykres matematyczny (jak w węzłach i krawędziach) w jak najbardziej przyjemny sposób. Jest kilka podejść, ale moim ulubionym zdecydowanie było podejście fizyki. Traktujesz każdy węzeł jako naładowaną cząsteczkę, która odpycha wszystkie pozostałe i każdą krawędź jako sprężynę klasyczną o pewnej idealnej długości. Wykonujesz kilkaset kroków i ostatecznie dochodzisz do stanu stabilnego z odpowiednim efektem tłumienia.

Widzę wiele paraleli z twoim problemem. Pola tekstowe są węzłami, a linie odniesienia są krawędziami.

To będzie musiało zostać zmodyfikowane. Na przykład powinna istnieć siła dodatnia w górę, aby nie spadały poniżej wykresu. Trzeba też uwzględnić pomysł przewracania tekstu w lewo lub w prawo. Ale powinien dać rozsądny wynik na większości danych wejściowych.

Artykuł, do którego się odwołałem dla mojego projektu, to: here.

+0

Kolejny dobry plan, wcześniej słyszałem o tym podejściu, ale nigdy nie przyszło mi do głowy myśleć o tym projekcie. Dzięki! –