11
Convex Hull Problemine Genel Bakış: Algoritmalar ve Karmaşıklıkları Bayram AKGÜL 1 , Hakan KUTUCU 2 1 Bayram AKGÜL, Bartın Üniversitesi, Bilgisayar Programcılığı, [email protected] 2 Karabük Üniversitesi, Bilgisayar Mühendisliği Bölümü, [email protected] Özet: Convex hull problemi; düzlemde sonlu sayıda noktayı içine alan ve en küçük alanı kaplayan dışbükey çokgeni oluşturma problemi olarak tanımlanır. Convex hull problemi hesaplamalı geometrinin birçok uygulamasında önemli bir problem olarak karşımıza çıkmaktadır. Bilgisayar grafikleri, CAD/CAM uygulamaları, çarpışma analizi, şekil analizi, örüntü tanıma, görüntü işleme gibi birçok alanda kullanılmaktadır. Bu çalışmada convex hull problemi tanıtılarak özelliklerinden bahsedilmiş, düzlemsel ve 3-boyutlu convex hull problemi “brute force” yöntemi ile çözülmüştür. Daha sonra sırasıyla convex hull problemini çözen; “Gift wrapping”, Graham scan”, “QuickHull”, “Divide and conquer”, “Monotone chain” ve “Incremental Convex Hull” algoritmaları tanıtılmış ve bu algoritmaların analizleri ayrıntılı olarak verilip çalışma zamanları karşılaştırılmıştır. Anahtar Sözcükler: convex hull, hesaplamalı geometri, gift wrapping, graham scan, quickhull, divide&conquer, monotone chain, incremental convex hull A Survey of Convex Hull Problem: Algorithms and Complexities Abstract: The problem of computing the convex hull of a set of points in the plane is the minimal convex set that contains all the points. Convex hull computation has been extensively studied in computational geometry and it has various applications such as computer graphics, CAD/CAM applications, collision detection, shape analysis, pattern recognition, image processing, etc. In this paper, we introduce convex hull problem and discuss its properties. Then we discuss the planar and 3- dimensional convex hull algorithms such as “gift-wrapping”, “Graham’s scan”, “QuickHull”, Divide and conquer”, “Monotone chain” and “Incremental Convex Hull” algorithms. Finally, we give their run time complexities. Keywords: Convex hull, computational geometry, gift wrapping, graham scan, quickhull, divide&conquer, monotone chain, incremental convex hull 1. Giriş: Convex hull problemi düzlemde sonlu sayıda noktayı içine alan ve en küçük alanı kaplayan çokgeni oluşturma problemi olarak tanımlanmaktadır. Convex hull problemi hesaplamalı geometrinin birçok uygulamasında karşımıza çıkmaktadır. Bilgisayar grafikleri [1], CAD/CAM uygulamaları [2], çarpışma analizi [3], şekil analizi, örüntü tanıma [4], görüntü işleme [5] gibi birçok alanda kullanılmaktadır. Bu makalede convex hull problemini çözen çeşitli algoritmalar tanıtılmış, algoritmaları yazılmış, karmaşıklıkları analiz edilmiş ve düzlemde n adet nokta için bu algoritmalar ile convex hull problemini çözen ve görselleştiren bir uygulama geliştirilmiştir. Bu uygulama algoritma analizi gibi derslerde eğitim amaçlı olarak herhangi bir problemin çözümünde geliştirilebilecek algoritmaların görselleştirilmesi ve karşılaştırılmasında kullanılabilir.

Convex hull - Akademik Bilişim · Web viewConvex hull computation has been extensively studied in computational geometry and it has various applications such as computer graphics,

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Convex hull - Akademik Bilişim · Web viewConvex hull computation has been extensively studied in computational geometry and it has various applications such as computer graphics,

Convex Hull Problemine Genel Bakış: Algoritmalar ve Karmaşıklıkları

Bayram AKGÜL1, Hakan KUTUCU2 1 Bayram AKGÜL, Bartın Üniversitesi, Bilgisayar Programcılığı, [email protected] Karabük Üniversitesi, Bilgisayar Mühendisliği Bölümü, [email protected]

Özet: Convex hull problemi; düzlemde sonlu sayıda noktayı içine alan ve en küçük alanı kaplayan dışbükey çokgeni oluşturma problemi olarak tanımlanır. Convex hull problemi hesaplamalı geometrinin birçok uygulamasında önemli bir problem olarak karşımıza çıkmaktadır. Bilgisayar grafikleri, CAD/CAM uygulamaları, çarpışma analizi, şekil analizi, örüntü tanıma, görüntü işleme gibi birçok alanda kullanılmaktadır. Bu çalışmada convex hull problemi tanıtılarak özelliklerinden bahsedilmiş, düzlemsel ve 3-boyutlu convex hull problemi “brute force” yöntemi ile çözülmüştür. Daha sonra sırasıyla convex hull problemini çözen; “Gift wrapping”, “Graham scan”, “QuickHull”, “Divide and conquer”, “Monotone chain” ve “Incremental Convex Hull” algoritmaları tanıtılmış ve bu algoritmaların analizleri ayrıntılı olarak verilip çalışma zamanları karşılaştırılmıştır.

Anahtar Sözcükler: convex hull, hesaplamalı geometri, gift wrapping, graham scan, quickhull, divide&conquer, monotone chain, incremental convex hull

A Survey of Convex Hull Problem: Algorithms and Complexities Abstract: The problem of computing the convex hull of a set of points in the plane is the minimal convex set that contains all the points. Convex hull computation has been extensively studied in computational geometry and it has various applications such as computer graphics, CAD/CAM applications, collision detection, shape analysis, pattern recognition, image processing, etc. In this paper, we introduce convex hull problem and discuss its properties. Then we discuss the planar and 3-dimensional convex hull algorithms such as “gift-wrapping”, “Graham’s scan”, “QuickHull”, “Divide and conquer”, “Monotone chain” and “Incremental Convex Hull” algorithms. Finally, we give their run time complexities.

Keywords: Convex hull, computational geometry, gift wrapping, graham scan, quickhull, divide&conquer, monotone chain, incremental convex hull

1. Giriş:

Convex hull problemi düzlemde sonlu sayıda noktayı içine alan ve en küçük alanı kaplayan çokgeni oluşturma problemi olarak tanımlanmaktadır. Convex hull problemi hesaplamalı geometrinin birçok uygulamasında karşımıza çıkmaktadır. Bilgisayar grafikleri [1], CAD/CAM uygulamaları [2], çarpışma analizi [3], şekil analizi, örüntü tanıma [4], görüntü işleme [5] gibi birçok alanda kullanılmaktadır. Bu makalede convex hull problemini çözen çeşitli algoritmalar tanıtılmış, algoritmaları yazılmış, karmaşıklıkları analiz edilmiş ve düzlemde n adet nokta için bu algoritmalar ile convex hull problemini çözen ve görselleştiren bir uygulama geliştirilmiştir. Bu uygulama algoritma analizi gibi derslerde eğitim amaçlı olarak herhangi bir problemin çözümünde geliştirilebilecek algoritmaların görselleştirilmesi ve karşılaştırılmasında kullanılabilir.

2. Düzlemsel Convex Hull Probleminin Özellikleri:

S noktalar kümesi olsun. Kümedeki en büyük ve en küçük x ve y değerlerinin olduğu noktalara uç noktalar diyelim. Tüm noktaları içine alan en küçük çokgenin noktalar kümesini CH(S) olarak ifade edelim. Bu tanımlara göre convex hull problemi çözülürken aşağıdaki bazı özelliklerden faydalanılmaktadır:a) Çokgenin herhangi bir kenarı seçilince kalan bütün noktalar bu kenarı oluşturan doğru parçasının aynı yönünde kalır. Çoğu algoritma bu özelliğe göre çözüm yapmaktadır.

Her hangi bir noktanın ab doğru parçasının sağında veya solunda olduğunu anlamak için ccw (counterclockwise) yöntemi kullanılmaktadır. CCW Yöntemi:a ve b noktaları doğru parçasının uçları olsun. Eğer herhangi bir c noktasının ab doğru parçasının sağında veya solunda olduğu anlaşılmak istenirse ccw yöntemi aşağıdaki gibi kullanılır [6].

│ax ay 1│ccw(a,b,c) = │bx by 1│

│cx cy 1│Eğer determinant sonucu sıfırdan büyük ise c noktası ab doğru parçasının sağında, sıfırdan küçük ise solunda, sonuç sıfır ise a, b, c noktaları doğrusal anlamına gelmektedir. ccw yöntemi Şekil-1’de gösterilmiştir.

Şekil 1: ccw yöntemi.

Bu özellikten faydalanarak Şekil-2(a) ile gösterilen nokta kümesinde a ve b noktaları hariç kalan diğer tüm noktaların ab doğru parçasının aynı yönünde olduğu anlaşılabilir. b) Herhangi üç noktanın oluşturduğu üçgenin içinde kalan noktalar kesinlikle çokgenin gövdesinde yer alamazlar. Bu

Page 2: Convex hull - Akademik Bilişim · Web viewConvex hull computation has been extensively studied in computational geometry and it has various applications such as computer graphics,

şekilde muhtemel tüm üçlü noktalar denenerek çokgenin gövdesinde yer alamayacak tüm noktalar elenebilir. Şekil-2(b)’de elenmiş bazı noktalar gösterilmiştir. c) Nokta kümesinin uç noktaları (en küçük ve en büyük x ve y değerlerine sahip olan noktalar); kesinlikle çokgenin gövdesinde yer alır. Düzlemsel bir noktalar kümesinde nokta sayısı 4’ten büyük ise en az 4 tane uç nokta vardır. Şekil-2(c)’de gösterildiği gibi bu uç noktalar birleştirilerek başlangıç çokgeni oluşturulup içinde kalan noktalar elenebilir. d) Eğer noktaları x değerlerine göre küçükten büyüğe sıralarsak ve sırasıyla çokgenin gövdesini oluşturacak bir listeye eklersek eklediğimiz her nokta muhakkak çokgenin gövdesinde yer alacaktır. Önemli olan eklenecek noktanın hangi noktaların arasına ekleneceğini ve eklemeden sonra hangi noktaların gövdeden çıkarılması gerektiğini bulmaktır. Şekil-2(d)’de gösterildiği gibi 6. nokta eklenince 4. noktanın çıkarılması gerekecektir.e) Convex hull’un noktalarında ilerlerken sonraki nokta sürekli olarak önceki iki noktanın aynı tarafında yer alır. Şekil-2(e)’de gösterildiği gibi bu özellikten yararlanılarak sonraki noktalar sırasıyla bulunabilir. f) En küçük y koordinatlı nokta kesinlikle çokgenin gövdesinde olacağı bilinmektedir. Bu nokta gövdeye eklendikten sonra bir sonraki nokta kesinlikle tarama açısı en küçük olan nokta olacaktır. Bu şekilde bir sonraki nokta için yine tarama açısı en küçük olan nokta bulunabilir. Bu işlem başlangıç noktasına erişene kadar Şekil-2(f)’de gösterildiği gibi devam ettirilirse convex hull oluşturulmuş olur.

Şekil 2: Convex Hull oluşturma prensipleri.

3. Convex Hull Problemini Çözmek için Geliştirilmiş Algoritmalar:

Yukarıda bahsedilen özellikler çerçevesinde convex hull problemini çözen yedi tane algoritma açıklanacaktır.

3.1. Brute Force (Kaba Kuvvet) Yöntemi:

Özellik a’da belirtildiği gibi herhangi bir kenarın seçilmesi ile kalan diğer tüm noktaların bu doğru parçasının aynı yönünde kalması gerektiğinden bahsedilmişti. Brute-Force bu prensibe dayanarak olabilecek tüm nokta ikililerine göre kalan diğer tüm noktaları test eder ve böylece çokgenin tüm kenarlarını bulmuş olur. Düzlemsel bir noktalar kümesi için Brute Force algoritması aşağıda verilmiştir.

Input: S: noktalar kümesi n: nokta sayısıOutput: convex hull kenarları listesiBruteForce(S, n) CH ← Ø // boş liste for i ←1 to n for j ← 1 to n if i ≠ j for k ← 1 to n if j ≠ k Ʌ i ≠ k ccw(Si,Sj,Sk) < 0 break // veya > 0 if k = n // eğer döngü normal bitti ise CH.Add(Si,Sj) break return CH

Düzlemsel noktalar kümesi için Brute-Force algoritmasında iç içe üç tane döngü bulunmaktadır. Bundan dolayı 2 boyutlu düzlemde algoritmanın çalışma zamanı O(n3) olur. Eğer noktalar kümesi üç boyutlu uzayda olursa bu durumda problem çok yüzlü cismi oluşturma problemi olacaktır. Bu durumda muhtemel tüm üçlü noktaların muhtemel yüzeylerden biri olup olmadığı test edilecektir. Bu durumda üç boyutlu uzayda çalışma zamanı O(n4) olacaktır. Bu yöntem ile m boyutlu uzayda algoritmanın çalışma zamanı O(nm) olacaktır [7].

3.2. Divide & Conquer (Böl ve Fethet) Yöntemi:

Problemi iki alt probleme bölüp alt problemleri çözme prensibine dayanmaktadır. Küçük bir kümede convex hull problemini çözmek büyük bir kümede çözmekten çok daha kolay ve hızlı olacaktır. Sadece burada iki çokgenin birleştirilmesi için hızlı ve etkili bir yöntem bulunmalıdır[8].Bu metodu kullanmak için öncelikle noktaların x değerlerine göre (eşitse y değerlerine göre) küçükten büyüğe sıralanması gerekmektedir. Sıralama işlemi “merge sort” kullanılarak ϴ(nlgn) zamanda yapılabilir. Dolayısıyla “divide & conquer” metodu ile convex hull problemini çözmenin alt sınırı hiçbir zaman O(nlgn)’den daha iyi olmayacaktır. Bu yöntem ile özyinelemeli olarak nokta sayısı küçük eşit üç olana kadar noktalar kümesi sürekli ikiye bölünür. Bölme işlemi O(lgn) zamanda yapılır. Daha sonra bu alt nokta kümeleri çözülerek özyinelemeli olarak birleştirilir. Bu algoritmanın toplam çalışma zamanı T(n)=2T(n/2)+ϴ(n) olacaktır. ϴ(n) birleştirme zamanını ifade etmektedir. Eğer bu algoritma ile en fazla O(n) zamanda birleştirme işlemi sağlanabilirse algoritmanın toplam çalışma zamanı O(nlgn) olacaktır. Bu yönteminin genel algoritması aşağıda verilmiştir.

Input: S: x değerlerine göre sıralanmış noktalar kümesi p: alt sınır indeki, q: üst sınır indeksiOutput: convex hull noktaları listesiDivideSet (S, p, q) n ← q-p+1 // n: nokta sayısı if n ≤ 3 then return BruteForce(S,n) HA←DivideSet(S, p,⌊(p+q)/2⌋) HB←DivideSet(S, ⌈(p+q)/2⌉,q) return MergeCH (HA, HB)

Başlangıçta yöntem DivideSet(S, 1, N) şeklinde çağrılmalıdır. Algoritmada görüldüğü gibi küme özyinelemeli olarak sürekli

Page 3: Convex hull - Akademik Bilişim · Web viewConvex hull computation has been extensively studied in computational geometry and it has various applications such as computer graphics,

ortadan ikiye bölünmekte, daha sonra bölünen kümeler birleştirilmektedir. Şekil-8’de de gösterildiği gibi iki tane konveks çokgen birleştirmek için her iki çokgen için bir alt ve üst teğet bulmak gerekecektir. Bu teğetler bulunduktan sonra iki çokgen kolaylıkla birleştirilebilir.

Şekil 3: İki çokgeni birleştirme.

Aşağıda iki çokgeni birleştirme algoritması verilmiştir.

Input: HA: x değerleri küçük (soldaki) çokgen HB: x değerleri büyük (sağdaki) çokgen Output: CH convex hull noktaları listesiMergeCH (HA, HB) (a1, b1) ← AltTeğetBul(HA, HB) (a2, b2) ← ÜstTeğetBul(HA, HB) for i ← 1 to a1

CH.Add(HA[i]) for i ← b1 to b2

CH.Add(HB[i]) for i ← a2 to |HA| CH.Add(HA[i]) return CH

Alt veya üst teğetleri bulmak için A çokgenindeki en büyük x ve B çokgenindeki en küçük x değeri olan noktalar alınır. Bulduğumuz bu noktalardan birinin indeksi a, diğerinin indeksi b olsun ve bu noktaların oluşturduğu doğru parçasına ab diyelim. ab doğru parçasının hem A hem de B çokgeninin alt veya üst teğeti olması için a ve b indeksleri algoritmaya göre azaltılır veya arttırılır. Aşağıda alt teğet bulma algoritmasının işlem adımları verilmiş ve Şekil-4 üzerinde görselleştirilmiştir.

Şekil 4: İki çokgeni birleştirmek için alt teğet bulma adımları.

Input: HA: x değerleri küçük (soldaki) çokgen HB: x değerleri büyük (sağdaki) çokgen Output: a, b: hem HA hem de HB için alt teğet

olabilecek noktaların indeksleri.AltTeğetBul(HA,HB) a←EnBüyükX (HA) b←EnKüçükX (HB) pi ∈ HA Ʌ qj ∈ HB

while ccw(a,b,pi) > 0 Ʌ ccw(a,b,qj) > 0 do while(a,b,pi) > 0 a←a–1 (saat yönünde dön) while(a,b,qj) > 0 b←b+1 (saat yönü tersi dön) return (a,b)

Benzer şekilde üst teğeti bulmak istersek bu durumda a için saat yönünün tersinde b için ise saat yönünde hareket edilerek üst teğet bulunabilir.Bu yöntem ile sıralama O(nlgn), bölme O(lgn), birleştirme O(|A|+|B|) ≤ O(n) olacaktır. Dolayısıyla “Divide & Conquer” yöntemi convex hull oluşturma süresini O(nlgn) zamanda garanti etmektedir.

3.3. QuickHull Yöntemi:

1977 yılında Preparata ve Hong tarafından önerilmiştir[9]. Aslında QuickHull algoritması da quicksort algoritması gibi “divide & conquer” (böl ve fethet) prensibine göre çalışır. Teorik olarak ortalama çalışma zamanı ϴ(nlgn)’dir. En kötü durum için çalışma zamanı (eğer tüm noktalar konveks çokgenin üzerinde yer alacaksa) O(n2)’dir. Fakat pratikte hiçbir zaman tüm noktalar çokgenin gövdesinde yer almazlar. Convex Hull oluşturma problemi için pratikte en etkili yöntem QuickHull algoritmasıdır. Çokgenin gövdesinde kesinlikle yer alacak noktalardan herhangi üçünün oluşturacağı üçgenin içinde kalan tüm noktalar kesinlikle elenebilir. Bu prensibe göre çokgenin gövdesinde yer alamayacak noktaların tümü kademeli olarak elenebilir. QuickHull algoritmasının çözüm adımları aşağıda verilmiştir:1. En büyük ve en küçük x değerlerine sahip noktaları bul ve listeye ekle. Bunlar kümeyi ikiye bölmek için kullanılacak a ve b noktaları olsun. CH={a,b}2. a,b noktaları arasına bir çizgi çiz ve çizginin sağı ve solu olmak üzere noktaları iki ayrı kümeye ayır. 3. ab doğrusunun sol tarafında doğruya en uzak p noktasını bul ve listede a ve b noktaları arasına ekle. CH={a,p,b} 4. Bulunan nokta ile oluşacak üçgenin içinde kalan noktalar convex hull parçası olamazlar, bir sonraki adım için üçgenin içinde kalan noktaları ele. 5. Önceki iki adımı yeni oluşan iki doğru(ap ve pb) için tekrarla. 6. Sol tarafta nokta kalmayınca 3. adımdan ab doğrusunun sağ tarafı için çözmeye başla. Bu adımlar kolaylıkla üç boyutlu uzay için düzenlenebilir. Örneğin a ve b noktaları bulunduktan sonra bu noktalara en uzak c noktası bulunarak bu üç nokta için bir düzlem oluşturulabilir. Daha sonra bu düzleme en uzak d noktası bulunarak abd, acd ve bcd noktaları ile uzayda üçgenler oluşturulur. Bu işlemler her bir üçgenin oluşturduğu düzlem için özyinelemeli olarak tekrar ettirilirse sonuçta uzayda tüm noktaları içine alan çok yüzlü şekil oluşmuş olur. Yukarıdaki adımlara göre Şekil-5’te düzlemde noktalar kümesi için QuickHull algoritması görselleştirilmiştir.

Page 4: Convex hull - Akademik Bilişim · Web viewConvex hull computation has been extensively studied in computational geometry and it has various applications such as computer graphics,

Şekil 5: QuickHull algoritmasının adım adım görselleştirilmesi.

Düzlemde noktalar için QuickHull algoritması:Input: S noktalar kümesiOutput: CH convex hull noktaları listesiQuickHull(S) a ← EnKüçükX (S) b ← EnBüyükX (S) CH.Add(a,b) for i ←1 to |S| if ccw(a,b,S[i]) < 0 LS.Add(S[i]) // sol küme else RS.Add(S[i]) // sağ küme NoktaEkle (CH, a,b, LS) NoktaEkle(CH, b, a, RS) return CH

NoktaEkle(hull, a, b, S) // S alt küme Index ←IndexOf(b) p ←EnUzakNokta(ab, S) hull.Insert(Index,p)

for i ←1 to |S| if ccw(a,p, S[i]) < 0 then LAP.Add( S[i]) // ap’nin sol tarafı

for i ←1 to |S| if ccw(p,b, S[i]) < 0 then LPB.Add( S[i]) // pb’nin sol tarafı

NoktaEkle(a,p,LAP) NoktaEkle(p,b,LPB)

3.4. Graham Scan Yöntemi:

Yöntem ismini Ronald Graham’ın 1972 yılında yayınladığı makalesinden almaktadır [10]. Bir sonraki nokta her zaman iki önceki noktanın aynı yönünde olması prensibine dayanmaktadır. Burada ilk iki noktanın öncelikli olarak bulunması gerekmektedir. Bu yöntem ile çözüme başlamak için öncelikle koordinatı en küçük y değerine sahip olan nokta bulunur. Bu noktaya göre diğer tüm noktalar polar

açılarına göre sıraya konulur. Bir noktaya göre başka bir noktanın polar açısı tan-1 [(y2-y1)/(x2-x1)] şeklinde bulunabilir. En küçük açıya sahip nokta ikinci nokta olacaktır. Bu şekilde ilk iki nokta bulunmuş olur. Daha sonra eklenecek her nokta için sıraya konulmuş sonraki noktaya bakılır. Eğer yön değiştirme varsa yönün değiştiği nokta çıkarılır. Bu yöntem için bağlı-liste veya yığın (stack) veri yapısı kullanılabilmektedir. Eğer liste veri yapısı kullanılacaksa polar açılarına göre sıraya konulmuş tüm noktalar listeye eklenir ve üçüncü noktadan başlanarak her nokta için; önceki iki noktaya göre bir yön değiştirme varsa bu nokta listeden çıkarılır. Liste kullanarak “Graham Scan” algoritmasının işlem adımları aşağıda verilmiş ve Şekil-6 üzerinde üzerinde görselleştirilmiştir.

Input : S noktalar kümesiOutput: CH convex hull noktaları listesiGrahamScan (S) CH← Ø // boş liste p0 ← EnKüçükY(S) CH ← PolarSort(p0, S) for i ←2 to |CH|-1 while cww(CH[i-1],CH[i],CH[i+1]) ≤0 CH.RemoveAt(i) i←i-1 if i≤1 break return CH

Şekil 6: Graham Scan algoritmasının liste kullanılarak görselleştirilmesi.

Eğer yığın veri yapısı kullanılacaksa her noktaya her nokta yön durumuna göre yığına eklenir veya eklenilmez. Duruma göre yığına daha önce eklenmiş nokta yığından çıkarılabilir. Yığın veri yapısı kullanarak Graham Scan Algoritması aşağıda verilmiş ve işlem adımları Şekil-7 üzerinde görselleştirilmiştir.

Input : S noktalar kümesiOutput: CH convex hull noktaları için yığınGrahamScan (S) CH← Ø // boş yığın p0←EnKüçükY(S)

Page 5: Convex hull - Akademik Bilişim · Web viewConvex hull computation has been extensively studied in computational geometry and it has various applications such as computer graphics,

PolarSort(p0, S) CH.Push(p0), CH.Push(S[1]), CH.Push(S[2]) for i←3 to |S| Top←CH.Top(), Next←CH.Pop() while cww(Top,Next,S[i])≤0 Top←CH.Top() if |CH| ≤ 1 break Next←CH.Pop() CH.Push(Top) CH.Push(S[i]) return CH

Şekil 7: Graham Scan algoritmasının yığın veri yapısı kullanılarak adım adım görselleştirilmesi.

3.5. Gift Wrapping:

1973 yılında R.A. Jarvis tarafından geliştirilmiştir. Bu yöntemin ismi iki boyutlu durumlar için Jarvis March olarak ta anılmaktadır [11]. Bir sonraki nokta iki önceki noktanın oluşturduğu doğruya göre en az tarama açısına sahip nokta prensibine göre bulunmaktadır. Graham Scan metoduna göre avantajı başlangıçta noktaları sıralamaya gerek olmamasıdır. Yönteme başlarken en alt nokta (en küçük y değerine sahip nokta) bulunur. Bu noktaya göre diğer tüm noktaların tarama açıları bulunur. En az tarama açısı bir sonraki nokta olacaktır. Bu şekilde sürekli listeye eklenen son iki noktaya göre en küçük tarama açısı bulunarak sonraki nokta bulunmuş olur. Bu işlem başlanılan yere geri dönene kadar devam eder. İşlem O(n) zamanda minimum y noktasını bulur. Yine O(n) zamanda bir noktadan diğer tüm noktalara tarama açısı çıkarıp minimum tarama açısını bulur. Toplam h adet kenar noktası bulacaktır. Bulduğu her kenar noktası için bu işlemi yaparsa toplam çalışma zamanı O(hn) olacaktır. Her zaman h ≤ n olacağına göre bu algoritmanın üst sınırı en fazla O(n2) olacaktır, bu da tüm noktaların çokgenin gövdesinde olması anlamına gelmektedir ki pratikte bu durum pek rastlanılan bir durum değildir. Eğer h değeri n’ye göre çok küçük olursa bu algoritma çok etkili bir yöntem olacaktır. Gift Wrapping yönteminin işlem adımları aşağıda verilmiştir.

Input : S noktalar kümesiOutput: CH convex hull noktaları listesiGiftWrapping (S) CH← Ø // boş liste Pminy←EnKüçükY(S)

CH.Add (Pminy) lastAngle←0 Pcurrent = Pminy

repeat minRotAngle←10000 // büyük bir sayı for i←1 to |S| angle ← AngleOf(Pcurrent ,S[i]) rotAngle ← (2π – (lastAngle –angle)) if rotAngle < minRotAngle minRotAngle ←rotAngle minAngle ← angle Pnext ← S[i] lastAngle ← minAngle CH.Add(pNext) Pcurrent ← Pnext

until Pcurrent ≠ Pminy return CH

Şekil-8’de Gift Wrapping yönteminin işlem adımlarının görselleştirilmesi verilmiştir.

Şekil 8: Gift Wrapping algoritmasının adımlarının görselleştirilmesi.

3.6. Monotone Chain:

1979 yılında A.M. Andrew tarafından Graham Scan algoritmasına alternatif olarak sunulmuştur [12]. Andrew’e göre eğer bir sıralama yapılacaksa daha karmaşık olan açısal sıralama yapmak yerine daha basit olan koordinatlara göre sıralama yapmak daha az maliyetli olacaktır. Bu yöntem de Graham Scan gibi yığın veya liste veri yapıları kullanılarak kolay bir şekilde bilgisayar ortamında kodlanabilmektedir. Bu yöntem ile en soldan en sağa alttan ve üstten iki gövde oluşturularak convex hull oluşturulur. Yöntem ile çözüme başlarken; noktalar x değerlerine göre (eğer eşitse y değerlerine göre) sıraya dizilir. Önce ilk iki nokta (halka) listeye (zincire) eklenir. Tüm noktalar (halkalar) sırasıyla listeye (zincire) eklenecektir. Listeye eklemeden önce daha önce listeye eklenmiş olan son iki noktaya bakılır. Eğer bu iki noktaya göre eklenecek nokta sol tarafa düşüyorsa son eklenmiş nokta çıkarılır ve bu şarta bir daha bakılır, bu şart sağlanmadığı sürece listenin son elemanı çıkarılır. Şart sağlanınca sıradaki nokta eklenir ve bu şekilde son noktaya gelinceye kadar işlem devam eder. Son noktaya gelince alt gövde oluşmuş olacaktır. Aynı işlem bu kez sondan başa doğru üst gövde için yapılır.

Page 6: Convex hull - Akademik Bilişim · Web viewConvex hull computation has been extensively studied in computational geometry and it has various applications such as computer graphics,

Şekil 9: Monotone Chain algoritmasının adımlarının görselleştirilmesi.

Sıralama O(nlgn) zamanda yapıldıktan sonra alt ve üst gövdeler iki defa O(n) zamanda yapılabilmektedir. Dolayısıyla bu algoritmanın karmaşıklığı O(nlgn) olacaktır. Aşağıda “monotone chain” algoritmasının işlem adımları liste veri yapısı kullanılarak verilmiş ve işlem adımları Şekil-9 üzerinde görselleştirilmiştir.

Input : S noktalar kümesiOutput: CH convex hull noktaları listesiMonotoneChain (S) CH← Ø // boş liste Sort(S)

// alt zincir oluşturma for i←1 to |S| if |CH| ≥ 2 while cww(CH[Last-1],CH[Last],S[i])≤0 CH.RemoveLast() if |CH| < 2 break CH.Add(S[i]) // üst zincir oluşturma t ←|CH| for i← |S|-2 down to 1 if |CH| ≥ t while cww(CH[Last-1],CH[Last],S[i])≤0 CH.RemoveLast() if |CH| < 2 break CH.Add(S[i])

return CH

3.7. Incremental Convex Hull:

Bu metot ile çözüme başlamak için noktalar x (eğer eşitse y) değerlerine göre küçükten büyüğe sıralanır. Bu şekilde ilk üç nokta ile başlangıç çokgeni oluşturulur, daha sonra sıralanmış noktalar sırasıyla çokgene eklenmektedir. Her nokta

eklendikçe noktalardan bazıları çokgenin içinde kalacak dolayısıyla çokgenin gövdesinden çıkarılacaktır. Burada yapılan çözüm; eklenecek her bir nokta için, hangi noktaların arasına ekleneceği ve hangi noktaların çokgenden çıkarılacağıdır. Bu problemin çözümü prensip olarak “divide-and-conquer” metodundaki iki çokgenin birleştirilmesi problemine benzemektedir. Fakat burada ikinci çokgen her zaman tek noktadan oluşmaktadır. Bu yöntem sıralamaya bağlı olduğu için karmaşıklığın alt sınırı hiçbir zaman O(nlgn)’den daha iyi olmayacaktır. Şekil-10’da düzlemde n tane nokta için convex hull oluşturma adımları görselleştirilmiştir.

Şekil 10: “Incremental Convex Hull” algoritmasının adımlarının görselleştirilmesi.

Şekil-10’da gösterildiği gibi öncelikle noktalar x değerlerine eğer eşit ise y değerlerine göre sıralanmıştır. Daha sonra ilk üç nokta ile çözüme başlanmıştır. Sonrasında eklenecek nokta ile o ana kadar oluşmuş çokgen noktalarının tümünü alta ve üste alacak alt ve üst teğetler bulunur. Örnek olarak alt teğet bulma işlemi Şekil-11’de gösterilmiştir. İlk önce çokgenin en sağındaki nokta bulunur, bu noktanın indeksine a diyelim. Daha sonra yeni eklenecek nokta ile a indeksindeki bu nokta arasındaki doğru ccw algoritması ile test edilir. Eğer kalan tüm noktalar bir tarafta kalıyorsa alt teğet bulunmuştur, kalmıyorsa a indeksi bir eksiltilerek işlem tekrar edilir. Şekil-11’deki örnekte a indeksi üç defa azaltılarak alt teğet dört adımda bulunmuştur. Aynı işlem üst teğet için de yapılır. Fakat üst teğet için a indeksi bir arttırılarak ccw algoritması test edilir.

Şekil 11: “Incremental Convex Hull” algoritmasında alt teğetin bulunması.

Page 7: Convex hull - Akademik Bilişim · Web viewConvex hull computation has been extensively studied in computational geometry and it has various applications such as computer graphics,

“Incremental Convex Hull” algoritmasının işlem adımları aşağıda verilmiştir.

Input : S noktalar kümesiOutput: CH convex hull noktaları listesiIncrementalConvexHull (S) CH← Ø // boş liste Sort(S) // noktaları x değerlerine göre sırala // başlangıç çokgeni için noktalar listesini oluştur CH.Add(S[1], S[2], S[3])

for i←4 to |S| j←EnBüyükX(CH)

a = j while UpperTangent(S[i],CH[a], CH)= false if a ≠ j CH.RemoveAt(a) a = a-1

b = j while LowerTangent (S[i],CH[b], CH)=false if b ≠ j CH.RemoveAt(b) b = b+1

CH.Insert(S[i], BetweenIndexOf(a,b))

4. Sonuç ve Öneriler:

Bu çalışmada convex hull problemi tanıtılarak bu problemi çözen algoritmalar incelenmiş, çalışma zamanları asimptotik olarak analiz edilmiştir. Ayrıca algoritmaların daha da anlaşılır olması için çalışma adımları şekiller ile görselleştirilmiştir. Bu makalede anlatılan convex hull problemini çözen algoritmaların animasyon programları hazırlanmıştır. Bu program algoritma analizi gibi derslerde bir algoritmanın işlem adımlarını görselleştirmek için yardımcı bir kaynak olarak kullanılabilir. Ayrıca bu program bir sonraki çalışmada üç boyutlu uzayda convex hull problemi için bir alt yapı olarak kullanılacaktır.Tanıtılan convex hull algoritmaların çalışma zamanları asimptotik olarak Tablo-1’de listelenmiştir. Tablo-2’de her bir algoritma için program 103, 104, 105, 106 ve 107 adet nokta için çalıştırılmış ve çalışma süreleri ms cinsinden altlarına yazılmıştır. “Brute Force” yönteminde 106 ve 107 nokta için programın çalışması çok uzun sürdüğünden altlarına “N/A” yazılmıştır.

AlgoritmaZaman Karmaşıklığı

En iyi durum En kötü durum

Brute Force O(n3) O(n3)

Divide & Conquer O(nlgn) O(nlgn)QuickHull O(nlgn) O(n2)

Graham Scan O(nlgn) O(nlgn)Monotone Chain O(nlgn) O(nlgn)

Gift Wrapping O(nh) O(n2)Incremental Convex Hull

O(nlgn) O(nlgn)

Tablo 1: Convex hull problemi için algoritmaların asimptotik çalışma zamanları.

ALGORİTMANOKTA SAYISI

103 104 105 106 107

Brute Force 156 14139 2723598 N/A N/A

Divide &

Conquer16 16 156 1842 18318

QuickHull ≈0 3 31 360 3519

Graham Scan ≈0 47 484 5699 64184

Monotone

Chain≈0 6 63 807 9998

Gift Wrapping ≈0 31 424 4219 46502

Incremental

Convex Hull≈0 47 516 6012 78595

Sistem Özellikleri

İşletim Sistemi Windows 8.1 x64

Programlama

ortamıMicrosoft Visual Studio 2013

Programlama Dili C# (5.0 ) – (.NET Framework 4.5)

İşlemci Intel Core2 Quad Q8400 2.66 GHz

Sistem Belleği 4 GB (DDR3)

Tablo 2: Verilmiş her bir algoritma için convex hull probleminin belirtilen sistemdeki ms cinsinden çalışma süreleri.

Tablo 2’den anlaşıldığı gibi convex hull problemini çözen en etkili yöntemin QuickHull algoritması olduğu görülmüştür.Hazırlanan program Microsoft Visual Studio 2013 ortamında C# programlama dili kullanılarak geliştirilmiştir. Hazırlanan bu programın kaynak kodları ve çalıştırılabilir dosyası http://myo.bartin.edu.tr/akgul/index.php?ln1=myworks&ln2=myworks adresinden indirilebilmektedir. Çalışma kapsamında hazırlanan “Convex Hull Algoritmaları” programının ara yüzü Şekil-12’de verilmiştir.

Page 8: Convex hull - Akademik Bilişim · Web viewConvex hull computation has been extensively studied in computational geometry and it has various applications such as computer graphics,

Şekil 12: Çalışma kapsamında hazırlanan “Convex Hull Algoritmaları” programının ara yüzü.

5. Kaynaklar:

[1] B. Praveen, R. Wenger, R. Crawfis, Isosurface construction in any dimension using convex hulls, IEEE Transactions on Visualization and Computer Graphics 10 (2004) 130–141.

[2] Chennakesava R. Alavala, “CAD/CAM: Concepts and Applications”,PHI Learning, 2011.

[3] Liu, Rong, Hao Zhang and James Busby. 2008. "Convex hull covering of polygonal scenes for accurate collision detection in games." In Proceedings of graphics interface 2008. Windsor, Ontario, Canada: Canadian Information Processing Society.

[4] B. Yuan, C.L. Tan, Convex hull based skew estimation, Pattern Recognition 40 (2007) 456–475

[5] Zhang, X. and Tang Z., A Fast Convex Hull Algorithm for Binary Image, Informatica 34 (2010) 369-376, 2009

[6] Robert Sedgewick and Kevin Wayne, Geometric Primitives, Algorithms, 4th Ed., http://algs4.cs.princeton.edu/91primitives/

[7] J. O’Rourke. Computational Geometry in C (2nd ed.). Cambridge University Press, 1998.

[8] T. M. Chan. A minimalist’s implementation of the 3-d divide-and-conquer convex hull algorithm. Technical report, University of Waterloo, 2003.

[9] Franco P. Preparata, S.J. Hong. Convex Hulls of Finite Sets of Points in Two and Three Dimensions, Commun. ACM, vol. 20, no. 2, pp. 87–93, 1977.

[10] Graham, R.L. (1972). An Efficient Algorithm for Determining the Convex Hull of a Finite Planar Set. Information Processing Letters 1, 132-133

[11] Jarvis, R. A. (1973). "On the identification of the convex hull of a finite set of points in the plane". Information Processing Letters 2: 18–21.

[12] A.M. Andrew, "Another Efficient Algorithm for Convex Hulls in Two Dimensions", Info. Proc. Letters 9, 216-219 (1979)