2016-02-01 10 views
6

मुझे पॉलीगॉन पर दिए गए वर्टेक्स से दिखाई देने वाले बहुभुजों पर सभी शीर्षकों को खोजने का प्रयास करने में समस्या हो रही है। अब तक मैंने जो लिखा है उसके साथ मुझे सीमित सफलता मिली है।पॉलीगॉन पर अन्य सभी बहुभुज शीर्षकों के लिए एक कशेरुक के लिए "रेखा की दृष्टि"

मैं दिखाई कोने करने के लिए किरणों उत्पन्न कर सकते हैं, लेकिन केवल तभी मेरी मूल बिंदु का उपयोग कर एक शीर्ष पर नहीं है निम्नलिखित:

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

यह पिछले दृष्टिकोण है मैंने कोशिश की। मुझे यकीन है कि इस तरह से भयानक है, अगर कोई मुझे सही दिशा में इंगित कर सकता है तो इससे कम भयानक हो सकता है कि मैं इसकी सराहना करता हूं।

+0

क्या आपने नौकरी करने के लिए मौजूदा पुस्तकालयों की कोशिश की है? शायद ऐसा कुछ: https://code.google.com/archive/p/straightedge/। जो कार्य आप हल कर रहे हैं वह अपेक्षाकृत जटिल है, और इसके लिए बहुत सारे प्रयास की आवश्यकता हो सकती है, इसलिए, जब तक आप इसे शोध उद्देश्यों के लिए नहीं कर रहे हैं, तो मैं आपको कुछ ऐसा खोजने का सुझाव दूंगा जो पहले से ही ऐसा करता है। – user3707125

+0

मैं मौजूदा कार्यान्वयन का उपयोग करने से बचना चाहता हूं क्योंकि यह दुर्भाग्यवश एक सप्ताह में एक परियोजना का एक हिस्सा है। हालांकि यह साफ है। – Battleroid

+0

यह जावाएफएक्स नहीं है, लेकिन वहां उपयोग की जाने वाली कक्षाएं ('Line2D' आदि) दोनों एपीआई में मौजूद हैं, और यह कुछ डीबगिंग विकल्पों (जैसे सभी स्कैनलाइनों को पेंट करने का विकल्प) के साथ एक एमसीवीई है: http://stackoverflow.com/a/23 9 71327/3182664 – Marco13

उत्तर

4

यही है काफी कुछ कोड आप वहाँ गया विश्लेषण करने के लिए, विशेष रूप से टिप्पणी के बिना। हालांकि, इस सवाल ने मुझे इस विषय के बारे में उत्सुक बना दिया, इसलिए मैंने इसके बारे में कुछ पढ़ा और दृश्य के सभी लाइन खंडों के खिलाफ स्कैनलाइन और ब्रूट-फोर्स चेक का उपयोग करके इसके साथ खिलवाड़ किया। ईमानदारी से यह बहुत अच्छा और प्रदर्शन कर दिया। शायद यह मदद करता है मैं इसे कैसे किया जैसा कि आप देख रहे हैं:

लाइनों (दीवारों) जो एक शुरुआत और समाप्त वेक्टर से मिलकर
  • बनाने (किसी भी कोण के साथ किसी भी लाइन ठीक रहेगा)
  • दृष्टिकोण के आसपास स्कैन लाइनों बनाने
  • सभी लाइनों के खिलाफ स्कैन लाइनों दृश्य में प्रत्येक अन्तर्विभाजक बिंदु के लिए
  • हिट परीक्षण है कि एक दृष्टिकोण के सबसे करीब है खोजने के
  • कनेक्ट सभी अन्तर्विभाजक अंक

यह करना आसान था, खासकर जब आप वेक्टर गणना का उपयोग करते हैं।

यह like this on youtube दिखता है।

स्क्रीनशॉट:

enter image description here

scanlines (नीला) दिखाई साथ

:

enter image description here

लेकिन ध्यान में रखना कृपया कि यह सब रेखा खंड के खिलाफ केवल जानवर बल परीक्षण है। निश्चित रूप से ई जैसे अनुकूलन के लिए कमरा है। जी। दृश्य बिंदु के खिलाफ सभी सेगमेंट की दूरी की गणना करना, खंडों को क्लिप करना आदि। @ कुबज़ेटो के उत्तर पर एक नज़र डालें।

यदि आप यही चाहते हैं, तो आप this gist पर स्रोत पा सकते हैं। आपके लिए तर्क और प्रासंगिक Algorithm.java में है।

अतिरिक्त जानकारी, क्योंकि आपके कोड में "दुश्मन रेखा" शब्द है जो मुझे लगता है कि आपको इसे एक गेम के लिए चाहिए: जब आप बस अपने सभी चौराहे बिंदुओं को जोड़ते हैं और स्कैनलाइन की संख्या से उन्हें विभाजित करते हैं और लक्ष्य पर जाते हैं, आप स्वचालित रूप से this जैसे आंदोलन प्राप्त करेंगे।

+0

निश्चित स्कैन लाइन गिनती (और इस प्रकार, उनके बीच एक निश्चित कोण) समस्याएं पैदा कर सकती है। बड़ी दूरी में वस्तुओं के लिए, नमूना त्रुटियां प्रकट हो सकती हैं। बाधाओं की संख्या के आधार पर, एक विकल्प है: आप केंद्र से लाइनों को सभी लाइन एंडपॉइंट्स पर ले कर स्कैनलाइन बना सकते हैं, और दोनों दिशाओं में उन्हें एक छोटे से "ईपीएसलॉन" द्वारा घुमा सकते हैं। यह अभी भी थोड़ा कच्चा प्रतीत हो सकता है, लेकिन मैंने इसे http://stackoverflow.com/a/23971327/3182664 में उपयोग किया और यह काफी अच्छी तरह से काम करता है। – Marco13

संबंधित मुद्दे