2012-01-23 6 views
11

obliczeniowej Geometria problemów:
Punkt P0 dobiera się losowo na krawędzi (np EB) wielokąta (np BCDE), w celu znalezienia możliwych punktów (tj P1,P2,P3,...) w innych krawędzie oparte na podanej odległości (tj. r). Poniższa demonstracja pokazuje rozwiązanie poprzez znalezienie przecięć między okręgiem wyśrodkowanym na punkcie P0 a krawędziami wielokąta. Tak więc problem można w zasadzie rozwiązać przez analizę skrzyżowań Circle--Line-Segment.Koło wielokątów przecięcia

Zastanawiam się, czy istnieje bardziej skuteczna metoda dla tego bardzo prostego problemu pod względem kosztów obliczeniowych? Proces zostanie poddany ocenie kilku million times, więc każda poprawka jest interesująca.

  • końcowe rozwiązanie skorzysta z Python mocy;
  • obliczenie rdzenia będzie w Fortran w razie potrzeby.

enter image description here

Aktualizacje:
Dzięki za komentarze. Proszę wziąć pod uwagę moje komentarze do komentarzy, które pomogą wyjaśnić pytanie więcej. Nie chce ich tutaj powtarzać, zachęcając do rozważenia wszystkich komentarzy i odpowiedzi;).

Właśnie zaimplementowałem metodę Circle--Line-Segment Intersection na podstawie algorytmu znalezionego [here]. Właściwie to dostosowałem go do pracy z liniowymi segmentami. Wzorcem algorytmu realizowanego w Pythonie jest następująca:
enter image description here
enter image description here
liczba odcinków jest: 100,000 a system jest zwykle na pulpicie. Upłynął czas: 15 seconds. Mam nadzieję, że są one pomocne w wyjaśnieniu kosztów obliczeniowych. Wdrożenie rdzenia w Fortan może znacznie poprawić wydajność.
Tłumaczenie jest jednak ostatnim krokiem.

+0

Czy odległość "r" wszystkich milionów zapytań jest taka sama? Czy możemy liczyć na wypukłość wielokąta? –

+0

@BorisStrandjev Dla naszego problemu wszystkie wielokąty są wypukłe. 'r' może być różne dla każdej iteracji, więc może się zmieniać, ale jest stałe dla każdego wielokąta osobno. – Developer

+0

Czy są miliony zapytań wykonanych w jednym wielokącie lub w innym? –

Odpowiedz

2

Na przecięciu line (lub line-segment) i circle (sphere w 3D) jest trochę bardziej wyjaśnienie, szczegóły realizacji oraz Python C itp próbek kodów w [this link]. Możesz spróbować ich dla swojego problemu.
Pomysł jest w zasadzie taki sam jak wcześniej w wersji [here].

+1

link jest martwy – Alnitak

0

Zakładając, że circle--line-intersection jest zoptymalizowany, może być w stanie uzyskać coś od rozróżniania różnych przypadkach:

do punktu A, B:

  • Jeśli d (P0, A) < ri d (P0, B) < R: punkt przecięcia nie

  • Jeśli d (P0, ą) == r: skrzyżowanie A

  • gdy d (P 0, B) == r: skrzyżowanie B
  • Jeśli D (P0, ą) < R i D (P0, B)> R 1 przecięcia wykonania circle--line-intersection
  • Jeśli D (P0 A)> R i d (P0, B) < R 1 przecięcia wykonania circle--line-intersection

  • Jeśli d (P0 a)> r d (P0, B)> R: W oznacza 0, 1 lub 2 przecięcia -> Jeśli minimum distance do linii (A, B)> r: Brak przecięć -> Jeśli minimum distance do linii (A, B) == r: 1 przecięcie -> Jeśli minimum distance do linii (A, B) < r: 2 przecięcie d

+0

W ostatnim przypadku sądzę, że chodziło o d (P0, P2)> r. –

+0

Należy zwrócić uwagę, że okrąg wyśrodkowany na 'P0', więc wszystkie skrzyżowania leżą na okręgu, więc ich odległości są równe' r'. To jest 'd (P0, *) = r'. Czy brakuje mi czegoś z twojej odpowiedzi? – Developer

+0

Przepraszam, że pomieszałem skrzyżowanie z rzeczywistymi punktami. Naprawię odpowiedź, mam nadzieję, że ma to więcej sensu niż ostatni przypadek: – Wesley