2012-04-05 20 views
6

Chcę wizualizować dwa różne algorytmy, które decydują czy jest nakładanie w kolekcji kręgów w płaszczyźnie w Javie:Jak wizualizować algorytm bez zmiany kodu tego algorytmu?

  • O (n²) algorytm, który sprawdza każdą kombinację kół
  • O (nlogn) algorytmu używającego linii przeciągnięcia

Czy istnieje sposób, aby pozwolić obiektowi klasy wizualizacji "nasłuchiwać" na obiekcie klasy algorytmu w taki sposób, aby mógł na przykład zobaczyć, kiedy algorytm wykonuje nakładanie się sprawdzić między parą okręgów i wie, kiedy zaktualizować wizualizację?

inny przykład: mogę zachować listę aktywnych kręgów (te, które przecinają linię przeciągnięcia) jako zmiennej algorytmu linii zamiatać i pozwolić innej klasy (klasa wizualizacji) dostać tej zmiennej. Ale w jaki sposób ta klasa będzie wiedzieć, kiedy lista zostanie zaktualizowana i musi zaktualizować wizualizację?

To tylko strategia, o której myślałem. Być może istnieją lepsze sposoby ...

+0

Nie wiem, czy to rozważyłeś, ale mam na myśli tylko jedno słowo: Wielowątkowość. Jeden wątek algorytmu i jeden wątek wizualizacji? –

+0

Zdecydowanie potrzebuję wielu wątków.Głównym problemem jest to, jak wątek wizualizacji musi odświeżyć? – aerod

+0

Narysuj zdjęcie. (Wizualizuje go, nie modyfikuje kodu.) –

Odpowiedz

0
  1. Czy klasa (-y), które stanowią koło (i wszelkich innych obiektów występujących w tym problemu/Algorithm) i zawierają metody dla każdej operacji.
  2. Implementuj algorytm jako operację na obiektach z (1) - jako wywołania metod.
  3. Utwórz klasę wizualizacji, która sprawdza obiekty od 1 i wizualizuje ich stan na każdej z metod - powiedzmy - Update().
  4. Tworzenie podklas wszystkich klas w (1), które oprócz oryginalnego zachowania, które wywołują Visualization.Update() dla każdej operacji.

Zbuduj "swój świat" z (4) zajęć zamiast (1), aby mieć wizualizację.

1

Nie jestem pewien, czy to ci pomoże, czy nie, ale jeśli nie możesz zmienić kodu algorytmu wspierającego obserwatorów, to jedną (interesującą) opcją byłoby przyjrzenie się programowaniu zorientowanemu na aspekt.

Na przykład w AspectJ (np. Patrz http://en.wikipedia.org/wiki/AspectJ) można określić (używając rzeczy zwanych punktami) miejsca (zwane "punktami złączenia"), w których powinny być uruchamiane bity dodatkowego kodu (zwanego "poradą"). Można go użyć do wykrycia testów overlap wykonywanych przez algorytm i reagowania na nie zgodnie z oczekiwaniami.

Oczywiście robienie rzeczy w ten sposób wymagałoby użycia AspectJ, więc nie byłoby to możliwe z normalną Javą - ale jest to coś interesującego, na co warto spojrzeć.

Powiązane problemy