मेरे पास 2 बहुभुज हैं। मुझे पता है कि दोनों बहुभुजों के शीर्ष निर्देशांक हैं। यह जांचने का सबसे अच्छा तरीका है कि क्या एक दूसरे के अंदर पूरी तरह से है? उदाहरण के लिए, एल्गोरिथ्म को केवल नीचे दिए गए काले ट्रेपोज़ॉइड को पहचानना चाहिए :
मेरे पास 2 बहुभुज हैं। मुझे पता है कि दोनों बहुभुजों के शीर्ष निर्देशांक हैं। यह जांचने का सबसे अच्छा तरीका है कि क्या एक दूसरे के अंदर पूरी तरह से है? उदाहरण के लिए, एल्गोरिथ्म को केवल नीचे दिए गए काले ट्रेपोज़ॉइड को पहचानना चाहिए :
जवाबों:
एक विधि के लिए कई स्रोत स्निपेट हैं जो " बहुभुज के अंदर बिंदु " के लिए एक परीक्षण करते हैं । यह सिद्धांत जॉर्डन के वक्र प्रमेय से बहुभुज ( http://www-cgrl.cs.mcgill.ca/~godfried/teaching/cg-projects/97/Octavian/compgeom.html ) पर आता है।
भोला तरीका होगा: उस विधि होने, इसे कॉल PointInsidePolygon(Point p, Polygon poly)
:
bool isInside = true;
for each (Point p in innerPoly)
{
if (!PointInsidePolygon(p, outerPoly))
{
isInside = false; // at least one point of the innerPoly is outside the outerPoly
break;
}
}
if (!isInside) return false;
// COMPULSORY EDGE INTERSECTION CHECK
for each (innerEdge in innerPoly)
for each (outerEdge in outerPoly)
{
if (EdgesIntersect(innerEdge, outerEdge))
{
isInside = false;
break;
}
}
return isInside;
सैद्धांतिक रूप से, यह आपके बहुभुज के लिए किसी भी परिदृश्य को याद नहीं करना चाहिए, लेकिन यह इष्टतम समाधान नहीं है।
"एज" केस टिप्पणी
PointInsidePolygon(..)
यदि बिंदु बहुभुज की सीमा पर है, तो वापस लौटना चाहिए (या तो एक किनारे पर है या एक शीर्ष पर है)
EdgesIntersect(..)
यदि innerEdge
एक सबसेट (ज्यामितीय रूप से बुद्धिमान) है, तो उसे वापस लौटना चाहिए outerEdge
। इस मामले में, किनारे स्पष्ट रूप से प्रतिच्छेद करते हैं, लेकिन एल्गोरिथ्म के उद्देश्य के लिए, हमें यह इंगित करने की आवश्यकता है कि चौराहा isInside
चर के पीछे शब्दार्थ को नहीं तोड़ रहा है
सामान्य टिप्पणीकार :
एज बनाम एज चौराहे की जाँच के बिना, जैसा कि टिप्पणियों में बताया गया है, दृष्टिकोण कुछ अवतल बहुभुजों के लिए झूठी सकारात्मक लौटा सकता है (जैसे वी आकार का क्वाड और आयताकार - आयत का वी आकार के अंदर इसके सभी कोने हो सकते हैं, लेकिन इसे देखें , इस प्रकार कम से कम कुछ क्षेत्रों के बाहर)।
आंतरिक बहुभुज के कोने के कम से कम एक के लिए एक के बाद एक बाहरी के अंदर होने की जाँच करता है, और अगर कोई इंटरसेक्टिंग किनारों नहीं हैं, तो इसका मतलब है कि हालत संतुष्ट होने के बाद मांगी गई है।
प्रत्येक लाल रेखा के साथ एक लाइन चौराहा करने की कोशिश करें। छद्मकोश में:
// loop over polygons
for (int i = 0; i < m_PolygonCount; i++)
{
bool contained = false;
for (int j = 0; j < m_Polygon[i].GetLineCount(); j++)
{
for (int k = 0; k < m_PolygonContainer.GetLineCount(); k++)
{
// if a line of the container polygon intersects with a line of the polygon
// we know it's not fully contained
if (m_PolygonContainer.GetLine(k).Intersects(m_Polygon[i].GetLine(j)))
{
contained = false;
break;
}
}
// it only takes one intersection to invalidate the polygon
if (!contained) { break; }
}
// here contained is true if the polygon is fully inside the container
// and false if it's not
}
हालांकि, जैसा कि आप देख सकते हैं, यह समाधान धीमा हो जाएगा क्योंकि आप जांच करने के लिए अधिक बहुभुज जोड़ते हैं। एक अलग समाधान हो सकता है:
यह समाधान बहुत तेज़ है, लेकिन यह आपके कार्यान्वयन पर निर्भर करता है (और आप अपने चेक के परिणाम के साथ क्या करना चाहते हैं) क्या समाधान आपके लिए सबसे अच्छा काम करता है।