2016-02-01 21 views
6

Çokgen üzerindeki belirli bir noktadan görülebilen çokgenler üzerindeki tüm köşeleri bulmaya çalışırken sorun yaşıyorum. Şimdiye kadar yazdıklarım ile sınırlı başarı elde ettim.Tüm diğer çokgen köşelere çokgen üzerinde bir köşe için "Görüş Hattı"

Ben görünür köşeler için ışınları üretebilir ama benim orijin noktası kullanarak bir tepe üzerinde değil yalnızca aşağıdaki:

private ArrayList<Polyline> getGloballyVisible(Point2D origin, ArrayList<Polygon> polys) { 
    ArrayList<Polyline> visible = new ArrayList<>(); 

    for (Polygon target : polys) { 
     ArrayList<Polyline> targetVisibleLines = getVisiblePointsOnPolygon(origin, target); 
     ArrayList<Polygon> subTargetPolygons = new ArrayList<>(polys); 
     subTargetPolygons.remove(target); 
     ArrayList<Polyline> subTargetEdges = getEdges(subTargetPolygons); 

     lineCheck: for (Polyline line : targetVisibleLines) { 
      for (Polyline enemyLine : subTargetEdges) { 
       ArrayList<Point2D> linePoints = toPoints(line.getPoints()); 
       ArrayList<Point2D> enemyLinePoints = toPoints(enemyLine.getPoints()); 
       if (linesIntersect(linePoints.get(0), linePoints.get(1), enemyLinePoints.get(0), enemyLinePoints.get(1))) { 
        continue lineCheck; 
       } 
      } 
      visible.add(line); 
     } 
    } 
    return visible; 
} 

Full code here, please don't laugh.

Sample Result

Bu son yaklaşım Denedim. Eminim bu yol korkunç, eğer birisi beni doğru yöne yönlendirebilirse, bu yüzden onu daha az korkunç yapabilirim.

+0

İşi yapmak için var olan kitaplıkları denediniz mi? Belki böyle bir şey: https://code.google.com/archive/p/straightedge/. Çözdüğünüz görev görece karmaşıktır ve çok fazla çaba gerektirebilir, bu nedenle araştırma amacıyla bunu yapmadıkça, bunu zaten yapan bir şey bulmanızı öneririm. – user3707125

+0

Mevcut uygulamaların kullanılmasından kaçınmak istiyorum çünkü bu, bir projenin bir kısmı maalesef haftada bir. Bu temiz olsa da. – Battleroid

+0

JavaFX değil, ancak burada kullanılan sınıflar ('Line2D' vb.) Her iki API’da da var ve bazı hata ayıklama seçeneklerine sahip bir MCVE (örn. Tüm tarama satırlarını boyama seçeneği): http://stackoverflow.com/a/23971327/3182664 – Marco13

cevap

4

özellikle Yorum içermeyen, analiz etmek. Bununla birlikte, bu soru beni konuyla ilgili meraklandırdı, bu yüzden biraz okudum ve tarama çizgileri kullanarak ve sahnenin tüm bölümlerine karşı kaba kuvvet kontrolü kullanarak onun etrafında oynadım. İlginç bir şekilde, çok iyi ve performans gösterdi. Belki de nasıl yaptığımı görmek için yardımcı olur:

  • oluşturmak çizgileri bir başlangıç ​​ve bir bitiş vektörü oluşur (duvarlar)
  • görünüm nokta etrafında tarama çizgileri oluşturmak (herhangi bir açıyla herhangi bir satır yapacak)
  • tüm kesişen noktaları bağlamak bakış noktasına en yakın olanı bulmak her kesişen noktası için sahnede
  • tüm hatlar karşı tarama hatları isabet sınamak

Özellikle vektör hesaplamasını kullandığınızda yapmak çok kolaydı.

like this on youtube görünüyor.

Ekran Görüntüsü: görünür scanlines (mavi) ile

enter image description here

:

enter image description here

Ama bu tüm satır kesimleri karşı tek kaba kuvvet testi olduğunu unutmamak ediniz. Elbette e gibi optimizasyona yer var. g. Tüm segmentlerin görüş açısına göre hesaplanması, bölümlerin kırpılması vb., @ kubuzetto'nun yanıtına bir göz atın.

Aradığınızı bulamıyorsanız, kaynağı this gist adresinde bulabilirsiniz. Mantık ve sizin için uygun olan Algorithm.java.

Ek bilgileriniz, kodunuz "enemyLine" kelimesini içerdiğinden, bu oyun için ihtiyacınız olduğunu düşündüğünüz anlamına gelir: Tüm kesişim noktalarınızı topladığınızda ve bunları tarama hatları sayısına bölerek hedefe doğru hareket ettiğinizde, otomatik olarak this gibi hareket alırsınız.

+0

Sabit tarama satırı sayısı (ve dolayısıyla aralarında sabit bir açı) sorunlara neden olabilir. Daha uzak mesafedeki nesneler için örnekleme hataları görünebilir. Engellerin sayısına bağlı olarak, bir alternatif var: Merkezden çizgileri tüm satır uç noktalarına alarak ve her iki yönde de küçük bir "epsilon" ile döndürerek tarama çizgileri oluşturabilirsiniz. Bu hala biraz kaba görünebilir, ancak http://stackoverflow.com/a/23971327/3182664 adresinde kullandım ve oldukça iyi çalışıyor. – Marco13

İlgili konular