একটি বহুভুজনে সম্পূর্ণরূপে অন্য একটি রয়েছে কিনা তা আমি কীভাবে নির্ধারণ করব?


9

আমার কাছে বহুভুজ রয়েছে। আমি উভয় বহুভুজ এর ভার্টেক্স স্থানাঙ্ক জানি। একটি সম্পূর্ণরূপে অন্যটির ভিতরে আছে কিনা তা যাচাই করার সর্বোত্তম উপায় কী? উদাহরণস্বরূপ, অ্যালগরিদমটি কেবল নীচের কালো ট্র্যাপিজয়েডকে অন্তর্ভুক্ত হিসাবে চিহ্নিত করতে হবে :

উদাহরণ বহুভুজ


আমি এখনই বিশদ উত্তর দিতে পারি না (পরে তাও করতে পারে) তবে সংঘাতের সনাক্তকরণের জন্য পৃথক অক্ষের উপপাদ্যের জন্য আপনার প্রয়োগটি একবার দেখে নেওয়া উচিত। আপনি কী চান তা সহজেই পরীক্ষা করতে অ্যালগরিদমকে কিছুটা সংশোধন করা যেতে পারে। উদাহরণস্বরূপ কোডজেয়ালোট.আর.কাইভারস
ট্র্যাভিসজি

1
বহুভুজের ভিতরে বহুভুজ সম্পর্কে আপনি কী বোঝেন তা আপনি ঠিক পরিষ্কার নন। যদি ক্ষুদ্র বহুভুজের সমস্ত পয়েন্টগুলি বৃহত্তর একটিতে থাকে তবে তাদের প্রত্যেকটির এক লাইনের পাশে থাকে তবে তারা কি একে অপরের সাথে থাকে? i47.tinypic.com/4i0sgg.jpg
স্পিডিগনজালেস

@ স্পিডিগনজালেস, এটি ভিতরে বলা হয় los
ব্যবহারকারী960567

উত্তর:


5

এমন একটি পদ্ধতির জন্য প্রচুর উত্স স্নিপেট রয়েছে যা " বহুভুজের অভ্যন্তরে পয়েন্ট " জন্য পরীক্ষা করে । বহুবিধ জন্য জর্দানের বক্ররেখা উপপাদ্য থেকে মূলনীতিটি এসেছে ( 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


1
যখন বহিরাগত বহুভুজটি অবতল থাকে তখন এটি মিথ্যা ধনাত্মক প্রত্যাবর্তন করবে।
সাম হোচেভার

2
যথেষ্ট মজাদার, যখন টিওড্রন এবং নাইট 666 এর স্বতন্ত্রভাবে ভুল হয়, যখন একত্রিত হয়, তাদের একটি সঠিক উত্তর দেওয়া উচিত। যদি বহুভুজের সমস্ত বিন্দু অন্যের ভিতরে থাকে এবং যদি তাদের লাইনগুলি ছেদ না করে, তবে প্রথম বহুভুটি সম্পূর্ণ অন্যটির অভ্যন্তরে is
হ্যাকওয়ার্থ

সত্য, এটি মিথ্যা ধনাত্মক ফেরত দেয়, এটির পাশাপাশি অ্যাকাউন্টের প্রান্তগুলিও নেওয়া উচিত।
teodron

এটি সঠিক উত্তর বলে মনে হচ্ছে। আমি মনে করি দ্বিতীয় লুপের শর্তটি পরীক্ষা করার দরকার নেই।
user960567

এটি শেষ পয়েন্ট ছেদগুলির জন্য বা প্রান্তগুলি ওভারল্যাপ হয়ে গেলে কাজ করে না।
ব্র্যান্ডন কোহন

2

প্রতিটি লাল রেখার সাথে একটি লাইন ছেদ করার চেষ্টা করুন। সিউডোকোডে:

// 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
}

তবে, আপনি দেখতে পাচ্ছেন যে, আপনি পরীক্ষা করতে আরও বহুভুজ যুক্ত করার সাথে এই সমাধানটি ধীর হয়ে যাবে। একটি ভিন্ন সমাধান হতে পারে:

  • একটি সাদা রঙের সাথে পিক্সেল বাফারে কনটেইনার বহুভুজটি রেন্ডার করুন।
  • একটি শিশু রঙিন বহুভুজ একটি সাদা রঙ সহ একটি পৃথক পিক্সেল বাফারে রেন্ডার করুন।
  • একটি এক্সওআর মাস্ক দিয়ে বহুভুজ বাফারের উপর ধারক বাফারটি মাস্ক করুন।
  • সাদা পিক্সেল সংখ্যা গণনা; যদি এটি 0 এর চেয়ে বেশি হয় তবে বহুভুজ সম্পূর্ণ পাত্রে ধারণ করে না।

এই সমাধানটি খুব দ্রুত, তবে এটি আপনার প্রয়োগের উপর নির্ভর করে (এবং আপনার চেকের ফলাফলের সাথে আপনি কী করতে চান) কোন সমাধান আপনার পক্ষে সবচেয়ে ভাল কাজ করে।


1
সম্পূর্ণরূপে থাকা বহুভুজগুলি চিহ্নিত করার জন্য লাইন ছেদগুলি পর্যাপ্ত হবে না।
কাইলোটন

1
প্রশ্ন: যদি বহুভুজ সম্পূর্ণরূপে বিচ্ছিন্ন হয় তবে কোনও প্রান্ত ছেদ করবে না। এই ক্ষেত্রে এটি কাজ করবে? দ্বিতীয়, গ্রাফিক্স ভিত্তিক পদ্ধতির সত্যই কাজ করা উচিত!
teodron
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.