Şekil döndürmeyi verimli bir şekilde nasıl hesaplayabilirim?


13

Resim 1 Resim 2

Bir bayt matrisi (bitmap benzeri matris) ile temsil edilen bir Şekil var . Örnek Şekil üzerinde gösterilmektedir Picture 1.

Amaç bazı Verilen en iyi dönme açısını bulmaktır Şekil . Şekil iyi açısı, X ve Y eksenlerine paralel olan ve inscribes dikdörtgen ile döndürüldüğü zaman Şekil küçük bir alana sahiptir.

Şekle yazılan dikdörtgenler resimlerde açık gri olarak gösterilir. Şekilde Picture 2ideal dönüşün saat yönünde yaklaşık 30 derece olduğunu görebilirsiniz.

Şimdi, algoritmanın bu açıyı nasıl bulacağını biliyorum, ama bana göre çok verimsiz. Bu böyle devam ediyor:

  1. 0 ile 45 arasındaki açılardan geçin.
  2. Mevcut açı için, her şekil noktası için yeni, döndürülmüş, konum hesaplayın
  3. Şekil (minimum ve maksimum x, y) içeren dikdörtgen sınırlarını bulun ve şimdiye kadarki en iyi eşleşmediyse kaydedin
  4. Sonraki açı

Bu bir tür kaba kuvvet yöntemidir ve küçük figürler için iyi ve makul derecede hızlı çalışır. Ancak, 10 milyon noktaya kadar rakamlarla çalışmam gerekiyor ve algoritmam yavaşlıyor.

Bu sorun için iyi bir algoritma ne olurdu?

Yanıtlar:


20

Görünüşe göre , doğrusal zaman Döner kaliperler algoritmasını kullanarak keyfi olarak hizalanmış minimum sınırlama kutusunu bulabilirsiniz .

Sınırlayıcı kutuya sahip olduğunuzda, sadece kenarlardan birinin eğimini hesaplayarak dönüş açısını belirlemeniz gerekir.


Bu harika bir çözüm, çok iyi bir çözüm.
InformedA

Harika, zaten puanları x ve y'ye göre sıraladığım için, bu en.wikibooks.org/wiki/Algorithm_Implementation/Geometry/… ile dışbükey gövde bulabilir ve gövde noktaları ile mevcut algoritmayı kullanabilirim.
Dusan

12

Yaklaşımınızın ilk adımı kusurludur - 0 ile 45 arasında sonsuz sayıda gerçek değer vardır, bu nedenle "bunlar arasında geçiş yapmak" mantıklı değildir. Ancak, algoritmanız onarılabilir:

  • çokgenin dışbükey gövdesini bul

  • dışbükey gövdenin dış kenarları tarafından verilen sınırlı sayıda (!) açı

  • şimdi bu açıları kullanarak 2 ila 4. adımları uygulayın.

Bu işe yarar çünkü minimum çevreleyen dikdörtgenin dışbükey gövdenin dış kenarlarından birine dokunması gerektiği gösterilebilir.


Evet, tam da bunu yapacağım, Dan'ın cevabının yardımı ile zaten buldum. Teşekkür ederim.
Dusan

@Dusan: Diğer cevabın aynı yaklaşımı açıkladığından emin değilim, bu yüzden çözümü daha basit bir şekilde, umarım biraz daha açık bir şekilde tarif etmeye çalıştım. Burada bir açıklama buldum
Doc Brown

Evet, haklısınız, yaklaşımınız çok daha somut, daha basit ve daha net, ama aynı yaklaşımı Dan'ın cevabında verilen ipuçlarıyla kendim sonuçlandırdım, bu yüzden ona bir kabul verdim. Umarım cevabınız çok daha fazla oy alır. Alınmadım. Şerefe!
Dusan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.