আমার কাছে বহুভুজ রয়েছে। আমি উভয় বহুভুজ এর ভার্টেক্স স্থানাঙ্ক জানি। একটি সম্পূর্ণরূপে অন্যটির ভিতরে আছে কিনা তা যাচাই করার সর্বোত্তম উপায় কী? উদাহরণস্বরূপ, অ্যালগরিদমটি কেবল নীচের কালো ট্র্যাপিজয়েডকে অন্তর্ভুক্ত হিসাবে চিহ্নিত করতে হবে :
আমার কাছে বহুভুজ রয়েছে। আমি উভয় বহুভুজ এর ভার্টেক্স স্থানাঙ্ক জানি। একটি সম্পূর্ণরূপে অন্যটির ভিতরে আছে কিনা তা যাচাই করার সর্বোত্তম উপায় কী? উদাহরণস্বরূপ, অ্যালগরিদমটি কেবল নীচের কালো ট্র্যাপিজয়েডকে অন্তর্ভুক্ত হিসাবে চিহ্নিত করতে হবে :
উত্তর:
এমন একটি পদ্ধতির জন্য প্রচুর উত্স স্নিপেট রয়েছে যা " বহুভুজের অভ্যন্তরে পয়েন্ট " জন্য পরীক্ষা করে । বহুবিধ জন্য জর্দানের বক্ররেখা উপপাদ্য থেকে মূলনীতিটি এসেছে ( 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
পরিবর্তনশীলটির পিছনে শব্দার্থকে ভঙ্গ করছে না is
জেনারেল রেমাকার্স :
প্রান্ত বনাম প্রান্ত চৌরাস্তা চেক ব্যতীত, মন্তব্যে উল্লিখিত হিসাবে, পদ্ধতির কিছু অবতল বহুভুজ (যেমন একটি ভি আকারের কোয়াড এবং একটি আয়তক্ষেত্রের জন্য) মিথ্যা ধনাত্মক প্রত্যাবর্তন হতে পারে - আয়তক্ষেত্রটির V এর আকারের অভ্যন্তরের সমস্ত সূচি থাকতে পারে তবে এটি ছেদ করে , এভাবে কমপক্ষে বাইরের কিছু অঞ্চল থাকা)।
অন্তরের বহুভুজের অন্ততপক্ষে একটি বহির্মুখীটি বাইরের দিকের অভ্যন্তরের জন্য যাচাই করার পরে এবং যদি কোনও ছেদযুক্ত প্রান্ত না থাকে, তার অর্থ শর্তটি পরিতৃপ্ত হয় means
প্রতিটি লাল রেখার সাথে একটি লাইন ছেদ করার চেষ্টা করুন। সিউডোকোডে:
// 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
}
তবে, আপনি দেখতে পাচ্ছেন যে, আপনি পরীক্ষা করতে আরও বহুভুজ যুক্ত করার সাথে এই সমাধানটি ধীর হয়ে যাবে। একটি ভিন্ন সমাধান হতে পারে:
এই সমাধানটি খুব দ্রুত, তবে এটি আপনার প্রয়োগের উপর নির্ভর করে (এবং আপনার চেকের ফলাফলের সাথে আপনি কী করতে চান) কোন সমাধান আপনার পক্ষে সবচেয়ে ভাল কাজ করে।