2010-09-02 16 views

cevap

15

Bunu yakın zamanda yapmak zorundaydım. Sadece poligonda yürümek, diyagramınızdaki gibi içbükey çokgenler için çalışmayacaktır. Aşağıda, Greiner-Hormann çokgen kırpma algoritmasından esinlenen algoritmamın bir taslağı yer almaktadır. Bölme, poligon kırpmadan daha kolay ve daha zordur. Daha kolay, sadece bir doğrultu veya başka bir çokgen yerine bir çizgiye karşı klibi; daha zor çünkü her iki tarafı da tutmalısın.

Create an empty list of output polygons 
Create an empty list of pending crossbacks (one for each polygon) 
Find all intersections between the polygon and the line. 
Sort them by position along the line. 
Pair them up as alternating entry/exit lines. 
Append a polygon to the output list and make it current. 
Walk the polygon. For each edge: 
    Append the first point to the current polygon. 
    If there is an intersection with the split line: 
     Add the intersection point to the current polygon. 
     Find the intersection point in the intersection pairs. 
     Set its partner as the crossback point for the current polygon. 
     If there is an existing polygon with a crossback for this edge: 
      Set the current polygon to be that polygon. 
     Else 
      Append a new polygon and new crossback point to the output lists and make it current. 
     Add the intersection point to the now current polygon. 
+3

Herkes Java'da kodu paylaşabilirse, bu çok yardımcı olacaktır! – michael

1

Mükemmel şekilde mümkündür. Bunun için Java2d kullandığınızı kabul ediyorum. İçinde kesişenler olarak adlandırılan bir yöntem buldunuz. Bunu kullanarak bunu yapabilirsiniz.

Çokgen uygulamasının this uygulanmasını değiştirmeniz ve bir Line2D nesnesini geçen ve bir dizi çokgenleri (böylece aynı çizgi kesiminin sonsuz çokgenler oluşturabilmesi nedeniyle mümkündür) bir özelleştirici yöntemi yazmak zorunda kalabilirsiniz - zikzak çokgen varsay) veya boş.

+0

Yanıt için teşekkürler, ancak bunu yapmayı (hatta ilgili) nasıl yapacağımı bile bilmiyorum. Çokgen çizgilerinin her birinin kesiştiği çizgi ile ilgili olabilir. (ve şeklini bölerek). – aegamesi

13

Bu mümkündür, ancak çokgen dışbükey değilse ve onu bir çizgi boyunca bölmek potansiyel olarak ikiden fazla çokgene yol açar.

Çokgen kenarlarını katlayın ve her kenar için çizginin kesişip kesişmediğini belirleyin. Böyle ilk kenarı bulun. Başka bir kenar bulana kadar geçiş yapmaya devam edin, ancak yol boyunca karşılaştığınız her şeyi yeni bir çokgene ekleyin (ilk kenarın "bu taraftaki" ile aynı çizgiye bölünen kısmı ve son kenar için de dahil). Son olarak, yeni Poligona bir kapatma kenarı ekleyin. Şimdi kenarları işlemeye devam edin - hattın diğer tarafında, aynı şekilde başka bir Çokgen yaratın. Artık çizgide iki tane çokgen var. Aynı teknik, eğer dikkatliyseniz, çokgensel olmayan çokgeni çoklu katlara bölmekle işe yarayacaktır.

Çokgenin köşe çizgisini geçen çizgi ve çokgeni kesişmeyen çizgi gibi köşe durumlarına dikkat edin.

Düzenleme: Xan'ın işaret ettiği gibi, bu, tüm dışbükey olmayan durumları düzgün bir şekilde ele almayacaktır. Bu, algoritmaya küçük bir değişiklikle düzeltilebilir. Kapatma kenarını yukarıda açıklandığı gibi eklemeden önce, orijinal çokgenin başka bir kenarının bu kenarı keseceğini kontrol etmelisiniz; eğer öyleyse, sadece bu kenara kadar kapanır ve bu noktadan daha fazla kenar işlemeye devam edersiniz.

+0

Teşekkürler. Muhtemelen – aegamesi

+0

zamanını alır almaz yapacağım şey bu tekniğin içbükey çokgenlere çok kolay uzandığını düşünmüyorum. C harfinin taslağını dikey çizgi ile bölmeyi düşünün. Sol tarafta iki örtüşen, yarım diskli çokgenler olacak. – xan

+0

xan, doğru, bu ele alınması gereken başka bir durumdur. Bölme çizgisini geçtiğinizde, daha önce oluşturduğunuz bir çokgenin içinde olmadığınızı kontrol etmeniz gerekir; ya da daha doğrusu, sentezlediğiniz kenarın başka bir kenarı geçmediğinden emin olun. – davmac

2

Tek ihtiyacınız olan bir çokgen kırpma alogrithem. Burada bir genel bakış görüyorsunuz: Polygon clipping Burada öğrenebileceğiniz penty uygulamaları var.

İlgili konular