একাধিক বহুভুজ জন্য বহুভুজ অ্যালগরিদম মধ্যে পয়েন্ট


11

আমি একটি গুগল মানচিত্র এটিতে বহুগুচ্ছ সহ।

আমি এখানে আগ্রহী এমন একটি সমস্যা রয়েছে: একটি লম্বা, এলএনজি পয়েন্ট দেওয়া, এই পয়েন্টের মধ্যে থাকা বহুভুজগুলি নির্ধারণ করার সর্বোত্তম উপায় কোনটি?

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


আমি গুগল ম্যাপস এপিআই সম্পর্কে খুব বেশি কিছু জানি না, তবে ব্রাউজারটি এর মতো বড় কোয়েরি করার জন্য সেরা জায়গা না হয়ে ওঠে। পোস্টজিআইএস (ফ্রি), আরক সার্ভার বা ওরাকল স্পেশিয়াল এর চেয়ে অনুরোধগুলি আরও ভাল পরিচালনা করে tend
canisrufus

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

নিম্নলিখিত ইউআরএলে বহুভুজের বিন্দু সম্পর্কে কথা বলা হয়েছে .. (আমি কখনই এটি ব্যবহার করি নি) .. চেষ্টা করে দেখুন .. এটি কিছু আদর্শ দিতে পারে। eriestuff.blogspot.com/2008/02/…

3
এখানে আমার বাধ্যতামূলক মন্তব্যটি হল যে "পয়েন্ট-ইন-বহুভুজ" একটি গোলকের কোনও বিন্দুটির জন্য কোনও অর্থবোধ করে না, যেহেতু একটি গোলকের বহুভুজ কেবল গোলকটিকে দুটি অংশে বিভক্ত করে, যার উভয়কেই 'অভ্যন্তরীণ' বলার অধিকার রয়েছে। উত্তর বা দক্ষিণ মেরুটি কি 'ভিতরে' বহুভুজকে সংজ্ঞায়িত করে বহুভুজ? মনে রাখবেন, ল্যাট-
লংটি কার্তেসিয়ান

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

উত্তর:


12

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

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

ভেক্টর বহুভুজের ডেটা

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

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

(3) অনেকগুলি বহুভুজ উল্লম্ব এবং স্থির বহুভুজ (যা বহুভুজ স্তর খুব কমই পরিবর্তিত হবে)। অনুসন্ধানকে সমর্থন করার জন্য কোনও ডেটা স্ট্রাকচার প্রাক্কম্প্ট করুন (যা কোনও লাইন সুইপ বা চতুর্ভুজ অ্যালগরিদমের উপর ভিত্তি করে হতে পারে )। এই অ্যালগরিদমগুলির পূর্বনির্মাণের ব্যয় হ'ল ও (পি * লগ (পি)), তবে প্রশ্নের ব্যয় হ'ল ও (কিউ * লগ (পি)) হয়ে যায়, সুতরাং মোট ব্যয় হয় ও ((পি + কিউ) * লগ ( পি))।

কিছু উন্নতি বিশেষ ক্ষেত্রে যেমন উপলব্ধ

(ক) সমস্ত বহুভুজ উত্তল হয় ( বহুভুজগুলি আরও দ্রুত করা যায় ),

(খ) সমস্ত বহুভুজ অভ্যন্তরীণগুলি বিচ্ছিন্ন , এক্ষেত্রে আপনি তাদের ইউনিয়নকে একক বহুভুজ বলে মনে করতে পারেন (যা সোজা দক্ষ অ্যালগরিদম যেমন ত্রিভুজানের উপর ভিত্তি করে, এবং

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

(d) পয়েন্টের সংখ্যাটি বড়। তাদের বাছাইয়ের সময়টির উন্নতি হতে পারে। উদাহরণস্বরূপ, বাম থেকে ডানদিকে লাইন সুইপ পয়েন্ট-ইন-বহুভুজ অ্যালগরিদম প্রয়োগ করার সময়, আপনি পয়েন্টগুলি তাদের প্রথম স্থানাঙ্কের মধ্যে সাজান, আপনি একই সময়ে বহুভুজ প্রান্তের উপর দিয়ে ঝাঁকুনির মাধ্যমে পয়েন্টগুলি সরিয়ে ফেলতে পারবেন। আমি জানি না যে এই ধরনের একটি অপ্টিমাইজেশন প্রকাশিত হয়েছে। তবে যা প্রকাশিত হয়েছে তা হ'ল সমস্ত বিন্দু এবং বহুভুজের অনুভূমিকের মিলন একটি সীমাবদ্ধ ত্রিভুজায়ন সম্পাদন করা : একবার ত্রিভুজ সম্পূর্ণ হয়ে গেলে, অভ্যন্তরীণ পয়েন্টগুলি চিহ্নিত করা দ্রুত হওয়া উচিত। গুণগত ব্যয় O (Q * লগ (কিউ) + (পি + কিউ) * লগ (পি + কিউ) হিসাবে স্কেল করবে।

রাস্টার বহুভুজ ডেটা

এটি অবিশ্বাস্যরকম সহজ: বহুভুজ স্তরটি বাইনারি সূচক রাস্টার হিসাবে দেখুন (1 = বহুভুজের অভ্যন্তরে, 0 = বাইরে)। (এটির জন্য রাস্টার মানগুলি অভ্যন্তরীণ / বাহ্যিক সূচকগুলিতে রূপান্তর করতে একটি সন্ধানের টেবিলের প্রয়োজন হতে পারে)) প্রতিটি পয়েন্ট অনুসন্ধানে এখন রাস্টার সেলের সূচীকরণের জন্য ও (1) প্রচেষ্টা প্রয়োজন এবং এর মানটি পড়তে হবে। মোট প্রচেষ্টা ও (কিউ) Q

সাধারণভাবে

একটি দুর্দান্ত সংকর সমাধানঅনেকগুলি স্ট্যাটিক ভেক্টর বহুভুজের ক্ষেত্রে (উপরে ভেক্টর কেস 3) বহুভুজনকে প্রথমে জরিমানা করতে পারে, সম্ভবত একটি মোটা রেজোলিউশন দিয়েও, এবার বহুভুজের সীমানার কোনও অংশ ছেদ করে এমন কোনও কোষকে আলাদা করে (তাদের 2 টির মান দিন, বলুন) । একজন রাস্টার প্রোব (দাম: ও (1)) ব্যবহারের ফলে সাধারণত একটি নির্দিষ্ট উত্তর পাওয়া যায় (পয়েন্টটি ভিতরে বা বাইরের হিসাবে পরিচিত) তবে মাঝে মাঝে অনির্দিষ্ট উত্তর দেয় (পয়েন্টটি এমন একটি কোষে পড়ে যার মাধ্যমে কমপক্ষে একটি প্রান্ত থাকে) পাস), সেক্ষেত্রে আরও ব্যয়বহুল ও (লগ (পি)) ভেক্টর কোয়েরি করা হয়। এই পদ্ধতিতে রাস্টারটির জন্য কিছু বাড়তি স্টোরেজ ব্যয় আনা হয়, তবে অনেক ক্ষেত্রে এমনকি একটি ছোট রাস্টার (এক এমবি 2000 দ্বারা 2000 রাস্টারকে অনুমতি দেয় যে 0,1,2, নাল-মানগুলি সংরক্ষণ করে) গণনার সময় বিশাল সুবিধা প্রদান করতে পারে । asymptotically,


7

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


1

পোস্টগিসে এস T_ আইন্টারেক্টস সূচকগুলি প্রথমটি বহুভুজের সীমানা বাক্সের ভিতরে রয়েছে কিনা তা খুঁজে বের করার জন্য সূচি ব্যবহার করে এবং তারপরে সত্যিকার অর্থে বহুভুজের ভিতরে রয়েছে কিনা তা পরীক্ষা করে দেখুন। এটি দ্রুত, প্রায়শই খুব দ্রুত।

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

/ Nicklas

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