Алгоритм Джарвіса (або алгоритм загортання подарунка) — алгоритм знаходження опуклої оболонки. Часова складність — О(n * h), де n — кількість точок, h — кількість точок опуклої оболонки. Тобто, алгоритм найбільш ефективний у випадку малої кількості точок опуклої оболонки.
Опис алгоритму
Нехай шукана опукла оболонка множини точок. Як початкову беремо найлівішу точку (точку з найменшою x-координатою), якщо їх буде декілька, то виберемо серед них найнижчу (точку з найменшою y-координатою). Нехай знайдена точка — точка (її можна знайти за час звичайним проходом по всіх точках і порівнянням координат). Точка напевно є вершиною опуклої оболонки. Далі для кожної точки шукаємо проти годинникової стрілки точки шляхом знаходження за серед точок, що залишились, (включно з ) точку з найменшим полярним кутом . Вона і буде наступною вершиною опуклої оболонки. При цьому не обов'язково обчислювати кут — достатньо обчислити векторний добуток (узагальненням векторного добутку для двовимірного випадку є ) між векторами та , де — знайдений на даний момент мінімум, — претендент (першим мінімумом може бути обрана довільна точка). Якщо векторний добуток від'ємний, то знайдено новий мінімум. Якщо рівний нулю, тобто та лежать на одній прямій, то мінімум — та, яка лежить далі від точки . Алгоритм продовжує роботу доки . Чому алгоритм зупиниться? Тому, що точка (найнижча серед найлівіших точок) у будь-якому випадку належить до точок опуклої оболонки.
Псевдокод
Jarvis(P) 1) p[1] = найнижча серед найлівіших точок множини P; 2) i = 1; 3) do: p[i+1] = довільна точка з P (крім вже зарахованих до опуклої оболонки, але включно з p[1]); (a)for (для кожної точки j з P, крім вже зарахованих до опуклої оболонки, але включно з p[1] p[i+1] = min_polar_angle(p[i+1], P[j]); // мінімум через векторний добуток (b)i = i + 1; while p[i] != p[1] 4) return p;
Реалізація на С++
//Point - some type that has x, y members and //for which operator != is defined template <typename Point> inline bool determinantSignum(const Point& a, const Point& b, const Point& c) { return (((b.x - a.x) * (c.y - b.y) - (c.x - b.x) * (b.y - a.y)) >= 0); } template <typename Point> void jarvis(const std::vector<Point> & source, std::vector<Point>& result) { if (source.empty()) { return; } std::vector<Point> src = source; typedef typename std::vector<Point>::iterator PointIterator; PointIterator leftDownIt = src.begin(); PointIterator it = leftDownIt + 1; Point currentPoint; Point leftDownPoint = *(leftDownIt); // Finding leftest lowest point for (PointIterator end = src.end(); it != end; ++it) { currentPoint = *it; if (currentPoint.x < leftDownPoint.x) { leftDownPoint = currentPoint; leftDownIt = it; } else if (currentPoint.x == leftDownPoint.x && currentPoint.y < leftDownPoint.y) { leftDownPoint = currentPoint; leftDownIt = it; } } // Add selected point to answer src.erase(leftDownIt); result.push_back(leftDownPoint); currentPoint = leftDownPoint; Point nextPoint, tryPoint; PointIterator nextIt; do { nextPoint = leftDownPoint; nextIt = it; it = src.begin(); for (PointIterator end = src.end(); it != end; ++it) { tryPoint = *it; if (determinantSignum(nextPoint, currentPoint, tryPoint)) { nextPoint = tryPoint; nextIt = it; } } if (nextPoint != leftDownPoint) { src.erase(nextIt); result.push_back(nextPoint); currentPoint = nextPoint; } } while (nextPoint != leftDownPoint); }
Див. також
Посилання
- Реалізація на С++. Містить помилку в обрахунку векторного добутку. Виправлено у наведеному вище коді. [ 6 липня 2012 у Wayback Machine.]
Література
- Препарата Ф., Шеймос М. Вычислительная геометрия. Введение. — М. : Мир, 1989. — 478 с. — .
- Jarvis, R. A. (1973). On the identification of the convex hull of a finite set of points in the plane. . 2: 18—21. doi:10.1016/0020-0190(73)90020-3.
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Algoritm Dzharvisa abo algoritm zagortannya podarunka algoritm znahodzhennya opukloyi obolonki Chasova skladnist O n h de n kilkist tochok h kilkist tochok opukloyi obolonki Tobto algoritm najbilsh efektivnij u vipadku maloyi kilkosti tochok opukloyi obolonki Opis algoritmuNehaj shukana opukla obolonka mnozhini P p1 p2 pn displaystyle P p 1 p 2 p n tochok Yak pochatkovu beremo najlivishu tochku tochku z najmenshoyu x koordinatoyu yaksho yih bude dekilka to viberemo sered nih najnizhchu tochku z najmenshoyu y koordinatoyu Nehaj znajdena tochka tochka p1 displaystyle p 1 yiyi mozhna znajti za chas O n displaystyle O n zvichajnim prohodom po vsih tochkah i porivnyannyam koordinat Tochka p1 displaystyle p 1 napevno ye vershinoyu opukloyi obolonki Dali dlya kozhnoyi tochki pi displaystyle p i shukayemo proti godinnikovoyi strilki tochki pi 1 displaystyle p i 1 shlyahom znahodzhennya za O n displaystyle O n sered tochok sho zalishilis vklyuchno z p1 displaystyle p 1 tochku z najmenshim polyarnim kutom pi 1pipi 1 displaystyle p i 1 p i p i 1 Vona i bude nastupnoyu vershinoyu opukloyi obolonki Pri comu ne obov yazkovo obchislyuvati kut dostatno obchisliti vektornij dobutok uzagalnennyam vektornogo dobutku dlya dvovimirnogo vipadku ye mizh vektorami pipi 1 displaystyle p i p i 1 ta pipi 1 displaystyle p i p i 1 de pi 1 displaystyle p i 1 znajdenij na danij moment minimum pi 1 displaystyle p i 1 pretendent pershim minimumom mozhe buti obrana dovilna tochka Yaksho vektornij dobutok vid yemnij to znajdeno novij minimum Yaksho rivnij nulyu tobto pi 1 displaystyle p i 1 ta pi 1 displaystyle p i 1 lezhat na odnij pryamij to minimum ta yaka lezhit dali vid tochki pi displaystyle p i Algoritm prodovzhuye robotu doki pi 1 p1 displaystyle p i 1 neq p 1 Chomu algoritm zupinitsya Tomu sho tochka p1 displaystyle p 1 najnizhcha sered najlivishih tochok u bud yakomu vipadku nalezhit do tochok opukloyi obolonki PsevdokodJarvis P 1 p 1 najnizhcha sered najlivishih tochok mnozhini P 2 i 1 3 do p i 1 dovilna tochka z P krim vzhe zarahovanih do opukloyi obolonki ale vklyuchno z p 1 a for dlya kozhnoyi tochki j z P krim vzhe zarahovanih do opukloyi obolonki ale vklyuchno z p 1 p i 1 min polar angle p i 1 P j minimum cherez vektornij dobutok b i i 1 while p i p 1 4 return p Realizaciya na S Point some type that has x y members and for which operator is defined template lt typename Point gt inline bool determinantSignum const Point amp a const Point amp b const Point amp c return b x a x c y b y c x b x b y a y gt 0 template lt typename Point gt void jarvis const std vector lt Point gt amp source std vector lt Point gt amp result if source empty return std vector lt Point gt src source typedef typename std vector lt Point gt iterator PointIterator PointIterator leftDownIt src begin PointIterator it leftDownIt 1 Point currentPoint Point leftDownPoint leftDownIt Finding leftest lowest point for PointIterator end src end it end it currentPoint it if currentPoint x lt leftDownPoint x leftDownPoint currentPoint leftDownIt it else if currentPoint x leftDownPoint x amp amp currentPoint y lt leftDownPoint y leftDownPoint currentPoint leftDownIt it Add selected point to answer src erase leftDownIt result push back leftDownPoint currentPoint leftDownPoint Point nextPoint tryPoint PointIterator nextIt do nextPoint leftDownPoint nextIt it it src begin for PointIterator end src end it end it tryPoint it if determinantSignum nextPoint currentPoint tryPoint nextPoint tryPoint nextIt it if nextPoint leftDownPoint src erase nextIt result push back nextPoint currentPoint nextPoint while nextPoint leftDownPoint Div takozhAlgoritm Grehema Algoritm ChanaPosilannyaRealizaciya na S Mistit pomilku v obrahunku vektornogo dobutku Vipravleno u navedenomu vishe kodi 6 lipnya 2012 u Wayback Machine LiteraturaPreparata F Shejmos M Vychislitelnaya geometriya Vvedenie M Mir 1989 478 s ISBN 5 03 001041 6 Jarvis R A 1973 On the identification of the convex hull of a finite set of points in the plane 2 18 21 doi 10 1016 0020 0190 73 90020 3