কোন ত্রিভুজ পয়েন্ট রয়েছে তা সন্ধান করা হচ্ছে


16

ধরুন আমি একটি 2D nonoverlapping ত্রিভুজ গঠিত জাল আছে , এবং পয়েন্ট একটি সেট { P আমি } এম আমি = 1 ⊂ -এর সাথে এন = 1 টি কে । প্রতিটি বিন্দু কোন ত্রিভুজটি অন্তর্ভুক্ত তা নির্ধারণ করার সর্বোত্তম উপায় কী?{Tk}k=1N{pi}i=1Mk=1NTK

উদাহরণস্বরূপ, নীচের চিত্রটিতে আমাদের কাছে , p 2T 4 , p 3T 2 রয়েছে , সুতরাং আমি একটি ফাংশন চাই যা f কে তালিকার ফায়ার ( পি 1 , পি 2 , পি 3 ) = [ 2 , 4 , 2 ]p1T2p2T4p3T2ff(p1,p2,p3)=[2,4,2]

এখানে চিত্র বর্ণনা লিখুন

মতলব ফাংশন পয়েন্টলোকেশন রয়েছে যা ডেলাউন মেসের জন্য আমি যা চাই তা করে তবে এটি সাধারণ জঞ্জাল ব্যর্থ হয়।

আমার প্রথম (বোবা) চিন্তার সমস্ত নোড জন্য, হয় , খুঁজে বের করতে সব ত্রিভুজ মাধ্যমে লুপ যা ত্রিভুজ পি আমি হয় যাইহোক, এই হল অত্যন্ত অদক্ষ হয় -। আপনি প্রতি বিন্দু জন্য প্রতি ত্রিভুজ মাধ্যেমে লুপ করতে থাকতে পারে, তাই এটি O ( N M ) এর কাজ নিতে পারে ।pipiO(NM)

আমার পরবর্তী চিন্তার জন্য সব পয়েন্ট হয় নিকটতম জাল নোড মাধ্যমে নিকটতম-প্রতিবেশী অনুসন্ধান খুঁজে, তাহলে সেই নিকটতম নোড সংযুক্ত ত্রিভুজ মাধ্যমে সন্ধান। এই ক্ষেত্রে, কাজটি O ( a M l o g ( N ) ) হবে , যেখানে a জালের যে কোনও নোডের সাথে সংযুক্ত সবচেয়ে বেশি ত্রিভুজ রয়েছে। এই পদ্ধতির সাথে বেশ কয়েকটি সমাধানযোগ্য তবে বিরক্তিকর সমস্যা রয়েছে,piO(aMlog(N))a

  • এটির জন্য একটি দক্ষ নিকটতম-প্রতিবেশী অনুসন্ধান (অথবা এটিতে একটি লাইব্রেরি সন্ধান করা) বাস্তবায়ন করা দরকার, যা একটি অনানুষ্ঠানিক কাজ হতে পারে।
  • এটিতে প্রতিটি নোডের সাথে কোন ত্রিভুজগুলি সংযুক্ত রয়েছে তার একটি তালিকা সংরক্ষণ করতে হবে, বর্তমানে আমার কোডটি সেট করা হয়নি - এখনই কেবল নোড স্থানাঙ্কের একটি তালিকা এবং উপাদানগুলির একটি তালিকা রয়েছে।

সামগ্রিকভাবে এটি অবহেলা বলে মনে হচ্ছে এবং আমি মনে করি এর থেকে আরও ভাল উপায় থাকা উচিত। এটি অবশ্যই একটি সমস্যা হতে পারে যা প্রচুর উত্থাপিত হয়, তাই আমি ভাবছিলাম যে নোডগুলি কী রয়েছে তাত্ত্বিকভাবে বা উপলব্ধ গ্রন্থাগারের দিক থেকে কোনটি ত্রিভুজগুলি সন্ধানের জন্য সবচেয়ে ভাল উপায়ের পরামর্শ দিতে পারে কিনা তা আমি ভাবছিলাম।

ধন্যবাদ!

উত্তর:


16

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

সম্পাদনা : আমার এক প্রান্তের যুক্তিসঙ্গত ধ্রুবক সহ প্রান্তের হপিং হওয়া উচিত , সুতরাং এটি এম পয়েন্টগুলির জন্য ( এম লগ এন ) হবে । তবে, যদি আপনি লোকাল অনুসারে আপনার পয়েন্টগুলি সাজান (যেমন হিলবার্ট কার্ভ অর্ডার করার আগে) ব্যবহার করে, আপনি রানটাইমকে আরও কমানোর জন্য পূর্বের ক্যোয়ারির ত্রিভুজ দিয়ে প্রতিটি নতুন ক্যোয়ারী শুরু করতে পারেন (আমি সিএস তাত্ত্বিক নই তাই আমি পারি ' বিগ-ও কী হবে তা আপনাকে বলবেন না)।O(logN)O(MlogN)M

সম্পাদনা 2 : এই পিডিএফটি এমন একটি "হাঁটাচলা" স্কিমের বর্ণনা দিয়ে পাওয়া গেছে যা সমাপ্তির গ্যারান্টিযুক্ত এবং আরও নিখুঁত পদ্ধতির পর্যালোচনা করে।

চতুষ্কোণ ব্যবহারের আরেকটি বিকল্প হ'ল ট্রায়াঙ্গুলেশন হায়ারার্কি ব্যবহার করা। অলিভিয়ার ডেভিলার্স দেখুন। উন্নত বর্ধিত র‌্যান্ডমাইজড ডেলাউন ট্রায়াঙ্গুলেশন। প্রোকে। 14 তম আনু। এসিএম সিম্পোস। Comput। জিম।, পৃষ্ঠা 106-115, 1998. এটি ডেলাউন ট্রায়ঞ্জুলেশনের পক্ষে সেরা কাজ করে তবে ডেলাউন-না-এর জন্যও কাজ করতে পারে।

মূলত আপনি পয়েন্ট অবস্থানের গতি বাড়ানোর জন্য যা কিছু করুন তার জন্য সহায়ক তথ্য কাঠামো নির্মাণের প্রয়োজন হবে। চতুষ্কোণ বা অন্য কিছু স্থানিক মহকুমার ক্ষেত্রে আপনাকে মহকুমা গাছটি তৈরি করা দরকার। এজ-হপিংয়ের ক্ষেত্রে আপনাকে ত্রিভুজ সংলগ্ন টপোলজিকাল কাঠামো তৈরি করতে হবে। ত্রিভঙ্গীকরণ শ্রেণিবিন্যাসের জন্য মোটা ত্রিভুজগুলির একটি গাছ তৈরি করাও দরকার।


ভিক্টর - আপনি এমন কোনও ওপেন-সোর্স কোড জানেন যা প্রান্ত-হপিং পদ্ধতির প্রতিবিম্বিত করে? এটি দেখতে খুব সুন্দর লাগছে এটি আমার মামলার জন্য খুব ভাল সমাধান হতে পারে। (ট্রেনজুয়ালার জাল গ্রিডে বর্তমান ক্ষেত্রগুলি দ্বারা চালিত কণা ট্র্যাকিং মডেল)
ক্রিস বার্কার

এর জন্য আমার কোড রয়েছে এবং আমি এটি আপনার কাছে পাঠাতে পারি; এটি সি / সি ++ এ রয়েছে। এটি পরিষ্কার করার এবং এখনও এটি গিতুবে পোস্ট করার সময় নেই। আমি এটি আমার জীবনে কমপক্ষে দু'বার লিখতে হয়েছিল, একবার অর্ধবিজ্ঞানের ডেটা কাঠামো দিয়ে, আবার কোয়েডজ সহ, তবে এটি সহজেই ব্যবহার করা যেতে পারে যখন সেগুলি উপলভ্য হয় না এবং আপনাকে নিজে টপোলজিকাল কাঠামো তৈরি করতে হবে। আমার ওয়েবসাইটের জন্য আমার প্রোফাইল পৃষ্ঠাতে দেখুন, যেখানে আপনি যোগাযোগের তথ্য পেতে পারেন। আমরা এটি আরও অফলাইনে আলোচনা করতে পারি।
ভিক্টর লিউ

আমি হিলবার্ট কার্ভ অর্ডারিং এবং এলোমেলো ত্রিভুজ ওয়াক ব্যবহার করে মতলবটিতে এটি বাস্তবায়ন সমাপ্তের কাছাকাছি। এটি গবেষণা কোড: অপ্টিমাইজড নয়, ডকুমেন্টেড নয়, ইত্যাদি, তবে এখনও বেশ দ্রুত - আপনার আগ্রহী হলে আমি আপনাকে কোডটি দিতে পারি।
নিক অ্যালজার

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

@ ক্রিস - স্কাইকম্পে স্বাগতম! স্কিকম্পের গৃহকর্মের অংশ হিসাবে, আমি আপনার উত্তরগুলি এবং পরবর্তী কথোপকথনটি ভিক্টরের উত্তরের মন্তব্য হিসাবে স্থানান্তরিত করেছি। আমরা সাইটে আপনার অংশগ্রহণের অপেক্ষায় রয়েছি।
অ্যারন আহমদিয়া

8

আমি নিশ্চিত না যে আপনার সমাধানটি আসলে সঠিক। আপনার এই নোডগুলি রয়েছে এমন পরিস্থিতিটি বিবেচনা করুন:

  • উ: (-৩, ১)
  • বি: (0, 2)
  • সি: (3, 1)
  • ডি: (0, -5)

ত্রিভুজগুলি রয়েছে এবিসি এবং এসিডি। এখন বি মূলটির নিকটতম বিন্দু, তবে উত্সটি ত্রিভুজ এসিডিতে রয়েছে, যার বি নেই which

O(NM)

আমি একটি চতুষ্কোণী নির্মাণের বিকল্পটি বিবেচনা করব যা এতে ত্রিভুজগুলি রয়েছে। অর্থাৎ, আপনার একটি চতুষ্পদ গাছ রয়েছে যা প্রতিটি নোডে সঞ্চয় করে (যা একটি বাউন্ডিং বাক্সের সাথে মিলে যায়):

  • যে স্থানাঙ্কে বাক্সটি বিভক্ত হচ্ছে, বা বিকল্পভাবে, চারটি সাবট্রির বাউন্ডিং বাক্সগুলি;
  • সাবট্রিতে পয়েন্টার;
  • ত্রিভুজগুলির সেট যা এই আয়তক্ষেত্রের সীমানা বাক্সের মধ্যে সম্পূর্ণরূপে পড়ে তবে চারটি সাবট্রির কোনওর মধ্যে পুরোপুরি নয়। অন্য কথায়, ত্রিভুজগুলি যা চৌকোত্রের দুটি উপ-বিভাজন রেখার যে কোনও বিভাগের সাথে ছেদ করে।

nnlognO(NM)


হুম তুমি ঠিক বলেছ। অন্যদিকে, ত্রিভুজটি যদি ডেলাউনই হত তবে আমি মনে করি নিকটবর্তী প্রতিবেশী কাজ করবে। এটি আমি যা করার চেষ্টা করছি তার জন্য এটি খুব বাধাজনক তবে ডেলাউনয়ে ক্ষেত্রে দ্বৈত ভোরোনাই চিত্রটি বিবেচনা করুন - ভোরোনাই কোষগুলি নোডের নিকটে অবস্থিত পয়েন্টগুলির সেট এবং ডেলাউনয় ত্রিভুজগুলির প্রান্তগুলি সমস্ত ভোরোনাইয়ের প্রান্তগুলি পূরণ করে are কোণের ডান কোণে, সুতরাং যে কোনও বিন্দু অবশ্যই তার নিকটতম নোডের সাথে যুক্ত একটি ত্রিভুজের মধ্যে থাকা উচিত। আমি ভাবছি যদি মাতলাবের পয়েন্টলোকেশন ফাংশনটি হুডের নীচে এভাবে কাজ করে ..?
নিক অ্যালজার

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.