0-poligonu çizimi (Pillow / Numpy)

Merhabalar. Harita mühendisliğinde okumaktayım ve bir proje geliştirmekteyim. Geliştirdiğim proje haritacılıkta yol yapımında kullanılan 0 poligonu adı verilen bir yolun bilgisayar tarafından çizilmesini sağlamak. Bir miktar yol aldım ancak sıkıntılarım var ve bir türlü aşamıyorum.

Programın Amacı: İzohips haritası üzerinde başlangıç ve bitiş noktalarını birbirine bağlamak.
Programın Altın Kuralları:

1.Yükselti Eğrisi atlanmayacak. (Siyah eğrilerin her biri bir eş yükselti eğrisi bknz)
2.Seçilecek her nokta başlangıç noktasına eşit mesafede olmak zorundadır.(bknz)
3. Şayet 2. maddedeki kural dahilinde nokta tespit edilemez ise kademeli olarak büyültülerek sonraki noktanın tespiti sağlanmalı ve ardından başlangıç durumuna geri çevrilmelidir.

Program Kaynak Kodu:
https://paste.ubuntu.com/p/xwJ9w5tWvp/

Referans Görsel :

Şimdiden Yardımınız için teşekkür ederim.

Bu referans resmi kafamı karıştırdı. Daha önce gördüğüm hartalar şunlar gibi
basitti.
Fakat bu haritada ne yükseklik belirli ne de yükselme yönü zaten bir çok eğri de kapalı değil. O yüzden biraz açıklık getirirseniz daha kolay yardımcı olabileceğimi sanıyorum.

1 Beğeni

Şöyleki başlangıç noktası mavi renkte ve bitiş noktası kırmızı renkte. Yükseklik değerleri ve artış değerleri önemsiz. Asıl olay mavi de başlayıp kırmızı da bitirmek, yahut kırmızıya belirli bir uzaklıkta bitirmek ki buda bu görsel için 63 px. Altın kurallar ihlal edilmediği sürece geriye kalan tüm detaylar önemsiz. Teşekkürler.

Oncelikle sikintilarinin ne oldugunu bulman lazim. Bulman icin gereken sorulari diger tarafa yazmistim, burada daha da basitlestireyim:

  • Problem cozumu var mi?
  • Problemin cozumu varsa daha once yapilmis mi?
  • Daha once yapildiysa literature gecmis mi?
  • Gecmisse, sen literaturdeki bir algoritmayi mi kullanacaksin, sifirdan algoritma gelistirmeye mi calisiyorsun?
  • Literaturdeki bir algoritmayi kullanacaksan, hangisini kullanacaksin?
2 Beğeni

1-
Harita üzerinde el ile bu işlem yapılmaktadır ve 0 poligonu adı altındadır.
2-
yazılımsal olarak daha önce kodlayan görmedim
3-
literaturde bulunmamakta
4-
0 dan programı geliştirmeye çalışıyorum

Sıkıntım ise şu:
Başlangıç (mavi) bitiş(kırmızı) noktaları arası güzergah altın kurallar dahilinde çizilmemekte.

O zaman senin anlatman lazim.
Elle nasil yapiliyor bu islem harita uzerinde?

Bir de, literature gecmediyse “0 poligonu” ismini kim verdi? Kendisinden yardim alarak baslanabilir, o yuzden soruyorum. Neden poligon, neresi 0 onu soylese bile kafasindaki algoritmayla ilgili fikir sahibi olabiliriz.

Sorun şuradaki bu işlem bilgisayar ortamında yapılan bir işlem değildir. Bilgisayar ortamında yapılmasını sağlayan CBS uygulamaları “yükseklik” verisi gerektirir. Bu veri olmaksızın programların çalışması sağlanmamaktadır.

Literatürde 0 poligonu olarak geçen işlem "el " ile yapılmakta bu sebep ile bilgisayar ortamında yükseklik verisi kullanmaksızın yapıldığına dair bir veri bulunmamaktadır. 0 poligon denme sebebi yarma dolgu işlemi barındırmaksızın düşük maliyet ile yolun yapılması gerek güzergah kılavuzu şekilde tanımyalabilirim. “0” ın burada bir önemi yok. Poligon olma sebebi kırıklar ile başlangıç ve bitiş noktası arasında bir poligon çizildiği için poligon

Programın mantığı basit. Fakat benim yazım yeteneğimi aşıyor.
->Başlangıç (mavi nokta) dan bitiş (kırmızı nokta) e bir hat çizilecek. Adım adım eğrileri takip edecektir. Altın kurallar dahilinde devam etmesi gerekmetedir.
-Kurallar
1.Yükselti Eğrisi atlanmayacak. (Siyah eğrilerin her biri bir eş yükselti eğrisi bknz )
2.Seçilecek her nokta başlangıç noktasına eşit mesafede olmak zorundadır.(bknz )
3. Şayet 2. maddedeki kural dahilinde nokta tespit edilemez ise kademeli olarak büyültülerek sonraki noktanın tespiti sağlanmalı ve ardından başlangıç durumuna geri çevrilmelidir.

noktalar arası ulaşımın sağlandığı görselim budur. fakat burada yol olamayacak kadar saçma şekillerde hareketler bulunmaktadır. 178 adımda tamamlanan görsel şudur:


Bu sonuca ulaştığım kodlar şunlardır.
https://paste.ubuntu.com/p/PrNGxWSTSM/

  1. adım her zaman uygulanmamalı.

  2. adım ne anlatıyor? Onu da geniş geniş açıklarsanız kodları okumaya geçebiliriz.

Buyrun daha açık bir şekilde ifade edebileceğim bir yolum bulunmamakta.

Yazdığınız algoritma paftadaki yükselti eğrilerinin değerlerini bilmeden nasıl çizim yaptıracaksınız. İllaki her egrinin yükselti değerini vermeniz gerekir. Yapacağınız algoritma yükseklik değerlerini bilmeden nerenin tepe olduğunu nasıl anlayacak. En azından ana yükselti değerlerini girmelisiniz.

Proje zaten bu yükseklik değeri bilinmeden 2 boyutlu görselden 0 poligonu çizmek.

Hocam benimde demek istediğim yükselti değerlerini bilmeden nasıl çizebilir uygulama en uygun yolu illaki bir data vermek gerek.

Bu yüzden rengi data olarak kullanmaya karar verdim zaten hocam :frowning:

Renkler kullanılsa bile yükseltilerin artma değerlerine önemli 50 50 mi artıyor 250 250 mi artıyor.

20 20 artıyor ölçek o şekilde ayarlandı ve eğimde pixel - metre dönüşüm hesabı yapışarak hrsaplandı ve işleme dahil edildi.

Şu ana kadarki çalışmalarımda elde edilen en iyi yol şu görselsedir.

Poligonun kapali olmasi gerektigi icin sordum. Acaba algoritmada kullanilan baska cizgiler mi var?

Ingilizcesi nedir bu terimin?

Elle nasil yapiliyor?

Utku merhaba. Sanıyorum bu 0 poligonu çizme konusunu fakültede daha önce yüz yüze konuşmuştuk seninle. Öncelikle problemi daha iyi tanımlayalım ki 0 poligonu, haritacılık vb. bilmeyen ama çok iyi yazılım bilen insanlar daha kolay yardımcı olabilsin.

Problemi basitçe tanımlayacak olursak;
1- Elimizde bir adet eşyükselti eğrili haritamız var ve bu harita üzerinde A ve B noktalarımız var. Amaç A noktasından B noktasına belli kurallara uyarak en kısa mesafede gitmek.
2- Öncelikle pergel açıklığı dediğimiz bir değer var. Varsayalımki bu değer 2 cm. (Bunu kodlar arasına elle biz yazacağız ya da daha sonradan bunu hesaplayacak basit bir kod ekleyeceğiz, şimdilik önemli değil.)
3- A noktasından B’ye doğru her seferinde 2 cm ilerleyeceğiz ve varış noktamız (B yönüne doğru giderken) sıradaki ilk eğrinin üzeri olmak zorunda (sıradaki eğriyi atlayıp bir sonraki eğriye geçmek yasak). Mesela A noktasından 2 cm ileri gitmek istediğimde sıradaki eğri üzerinde 5 farklı noktaya gidebiliyorum. Yazılım bunlardan B’ye en yakın olanını seçecek ve A’dan oraya doğru bir çizgi çizecek (doğal olarak bu çizginin boyu 2 cm olacak). Diyelimki seçti ve çizdi, bu noktaya 1 diyelim.
4- Şimdi de 1 numaralı noktadan B’ye doğru sıradaki ilk eğrinin üzerine gelecek şekilde 2 cm gidecek. Diyelimki yine 3-4 alternatif var, B’ye en yakın olanı seçecek ve bu nokta ile 1 numaralı nokta arasına çizgi çizecek. Bu da 2. noktamız olsun.
5- Yazılım 4. işlemi yeterince tekrarlayarak B noktasına kadar gidecek.
6- Yazılımın geldiği son nokta B noktasının üzerindeyse ya da o son nokta ile B noktasının arası başlangıçta belirtilen pergel açıklığından (2cm) daha kısa ise o nokta ile B’yi birleştirecek.

Özetle bu şekilde tanımlayabiliriz.

Çözüm önerim ise şu şekilde:
1- A noktasından başlayıp B yönüne doğru 2 cm yarıçaplı bir yarım çember çiz.
2- Bu yarım çember üzerinde 2 mm’de bir renk okuması yaptır. Eğer okuduğun renk siyah ise alt1, al2, alt3 gibi numaralar ver. Daha sonra bu alt1, alt2 noktalarının B ile arasındaki mesafeyi hesapla. Hangi mesafe daha kısa ise o alt isimli nokta B’ye daha yakındır onu seç. (diyelimki alt2 daha yakın)
3- Kontrol amacıyla A noktası ve alt2 arasındaki 2 cm’lik uzunluk üzerinde 2mm’de bir yine renk okuması yaptır. Eğer okuduğun değerlerde siyahı yakalarsan demekki eğri atlamışsındır bu durumda alt2’yi iptal et. alt1, alt3 gurubundan B’ye en yakın 2. noktayı al ve onunla A arasında 2mm’de bir renk okut. Eğer siyahı yakalarsan iptal et diğer noktaya geç. Eğer siyah çıkmazsa demekki eğri atlamamışsındır ve bu nokta doğru noktadır.
4- 2. ve 3. adımı yeteri kadar tekrar edersen sonuca ulaşırsın.
5- Seçtiğin alt noktası ile B arasındaki mesafeyi her adımda kontrol ettir. Eğer 2 cm’den kısa ise ikisini birleştir ve program sonlansın.

Hem haritacı hem de amatör bir yazılımcı olarak benim çözümüm bu şekilde. Daha profesyonel çözümler olabilir.

Kolay gelsin.

EK OLARAK: Bildiğin üzre A noktasından veya aradaki diğer alt noktalarından 2 cm ileride herhangi bir eğri olmayabilir. Bu durumda da 2 cm’i 1mm arttır tekrar ara yoksa 1mm daha arttır tekrar ara şeklinde bir sonraki eğri 2 cm’den uzakta da olsa en kısa mesafe ile oraya gitmiş olursun.

2 Beğeni

Hocam tekrardan merhabalar. Aslında söylrdiğiniz yöntemi tamamen uyguladım ancak azımsanmayacak bir sıkıntı yaşıyorum.


Burada olduğu gibi dolambaçlar yaşanıyor bunu çözemedim.