Algorytm Kirkpatricka - algorytmy pozwalający lokalizować przynależność punktu w przestrzeni 2D do jednostki podziału - trójkąta triangulacji.
Algorytm wymaga preprocessingu w czasie
Następnie każde zapytanie dla przygotowanego wielokąta realizowane jest w casie
Biblioteka składa się z pakietu visualizer
, który wykorzystywany jest przez bibliotekę do wizualizacji działania algorytmu i wyniku lokalizacji. Właściwa biblioteka znajduje sie w pakiecie kirkpatrick_point_location
, zbiera ona funkcje potrzebne do działania algorytmu w przyjazny interfejs. W pakietach można znaleźć
Notebook jupytera pokazujący działanie poszczególnych etapów działania algorytmu.
Do triangulacji początkowej figury użyto triangulacji Delaunaya, a następnie do triangulacji "dziur" powstałych przez usunięcie zbioru niezależnych wierzchołków użyto algorytmu earcut.
Najpierw sklonuj repozytorium będąc w folderze do którego chcesz je sklonować, na przykład za pomocą:
git clone https://github.com/lkwinta/Kirkpatrick-Algorithm.git
Pobierz Anacondę, odpal Anaconda Prompt i przejdź do folderu Kirkpatrick-Algorithm, tam stwórz środowisko:
conda create --name kirkpatrick --file kirkpatrick.txt
conda activate kirkpatrick
Następnie uruchom:
python3 setup.py sdist
python3 -m pip install -e .
Otwórz Jupyter Notebook z listy programów w Conda Navigator, pamiętaj, żeby na górze zaznaczyć Twoje środowisko (kirkpatrick). Jeśli nie znajduje modułu kirkpatrick spróbój zrestartować środowisko i jupytera:
conda deactivate
conda activate kirkpatrick
W celu uniknięcia błędów wziązanych ze ścieżkami do różnych wersji interpreterów pythona sugerujemy korzystanie z Linuxa, a na Windowsie zainstalowanie WSL-a i właśnie w nim uruchamianie wszystkich komend.
W razie problemów z brakiem biblioteki tkinter
przy rysowaniu można skorzystać z polecenia
sudo apt-get install python3-tk
Aby użyć biblioteki należy ją zaimportować w poniższy sposób:
from kirkpatrick_algorithm.kirkpatrick_point_location.point_location import Kirkpatrick
Następnie definiujemy przykładowy wielokąt i inicjalizujemy nim obiekt biblioteki. Konstruktor przyjmuję listę krotek będących współrzędnymi punktów wielokąta.
polygon = [(5,5), (3,4), (6,3), (4,2), (6,0), (7,1), (8,4)]
kirkpatrick = Kirkpatrick(polygon)
Kolejnym potrzebnym krokiem jest wywołanie funkcji przetwarzającej wielokąt. Bez tego algorytm będzie wyrzucał wyjątek przy próbie lokalizacji punktu.
kirkpatrick.preprocess()
Samą lokalizację punktu wywołujemy przez funkcję query
, która przyjmuje krotkę ze współrzędnymi punktu do lokalizacji, a zwraca obiekt Triangle
z biblioteki planegeometry
jako zlokalizowany
trójkąt. Gdy punkt znajduje się poza zewnętrznym trójkątem, funkcja zwraca None.
found_triangle = kirkpatrick.query((3, 5))
Listę wszystkich trójkątów można otrzymać funkcją get_triangles()
.
all_triangles = kirkpatrick.get_triangles()
Można też skorzystać z funkcji query_with_show
, która lokalizuje punkt oraz rysuje wszystkie trójkąty oraz zlokalizowany trójkąt.
kirkpatrick.query_with_show((3, 5))
W pakiecie kirkpatrick_point_location_visualization
znajduje się biblioteka pozwalająca generować obazki pokazujące kolejne kroki działania algorytmu.
Bibliotekę należy zaimportować w następujący sposób
from kirkpatrick_algorithm.kirkpatrick_point_location_visualization.point_location_visualization import KirkpatrickVisualization
from kirkpatrick_algorithm.kirkpatrick_point_location_visualization.point_location_interactive_visualization import KierkpatrickInteractiveVisualization
Podobnie jak w głownej bibliotece należy zainicjalizować obiekt biblioteczny
polygon = [(5,5), (3,4), (6,3), (4,2), (6,0), (7,1), (8,4)]
kirkpatrick_vis = KirkpatrickVisualization(polygon)
Później należy uruchomić przetwarzanie wielokąta
kirkpatrick_vis.preprocess()
Aby zadać punkt do sprawdzenia można użyć funkcję query
. Podobnie jak w zwykłej bibliotece zwraca ona obiekt typu Triangle
:
_ = kirkpatrick_vis.query((5,4))
Następnie aby wyświetlić kroki przetwarzania można skorzystać z funkcji
show_prep
.
kirkpatrick_vis.show_prep()
A aby wyswietlic kolejne kroki lokalizacji mozna skorzystac z
kirkpatrick_vis.show_query()
A z kolei wywyołanie poniższej instrukcji otworzy interaktywną wizualizację w której można samemu zadać wielokąt i punkt do sprawdzenia oraz przewijać kolejne kroki algorytmu
KirkpatrickInteractiveVisualization()
https://ics.uci.edu/~goodrich/teach/geom/notes/Kirkpatrick.pdf
https://github.com/rkaneriya/point-location