প্রথমত, অক্ষ-সংযুক্ত আয়তক্ষেত্রগুলির ক্ষেত্রে, কেভিন রেডের উত্তরটি সবচেয়ে ভাল এবং অ্যালগরিদমটি সবচেয়ে দ্রুত।
দ্বিতীয়ত, সরল আকারের জন্য, সংঘর্ষ সনাক্তকরণের জন্য আপেক্ষিক বেগ (নীচে যেমন দেখানো হয়েছে) এবং পৃথক অক্ষের উপপাদ ব্যবহার করুন। এটি আপনাকে বলবে যে রৈখিক গতির ক্ষেত্রে কোনও সংঘাত ঘটে কিনা (কোনও আবর্তন নেই)। এবং যদি ঘূর্ণন থাকে তবে এটি সঠিক হওয়ার জন্য আপনার একটি ছোট টাইমস্টেপ দরকার। এখন, প্রশ্নের উত্তর দিতে:
দুটি উত্তল আকারের ছেদ হয় কিনা তা সাধারণ ক্ষেত্রে কীভাবে বলা যায়?
আমি আপনাকে একটি অ্যালগরিদম দেব যা কেবলমাত্র হেক্সাগন নয়, সমস্ত উত্তল আকারের জন্য কাজ করে।
ধরুন এক্স এবং ওয়াই দুটি উত্তল আকার। তারা ছেদ করে যদি কেবলমাত্র যদি তাদের বিন্দুতে কোন মিল থাকে, অর্থাৎ একটি বিন্দু x ∈ X এবং একটি বিন্দু y ∈ Y যেমন x = y । আপনি যদি স্থানটিকে ভেক্টর স্পেস হিসাবে বিবেচনা করেন, তবে এটি x - y = 0 বলার সমান । এবং এখন আমরা এই মিনকোভস্কি ব্যবসায় পেতে পারি:
Minkowski সমষ্টি এর এক্স এবং ওয়াই সব সেট এক্স + Y জন্য এক্স ∈ এক্স এবং ওয়াই ∈ ওয়াই ।
এক্স এবং ওয়াইয়ের জন্য একটি উদাহরণ
এক্স, ওয়াই এবং তাদের মিনকভস্কির যোগফল, এক্স + ওয়াই
ধরুন (-Y) হ'ল y- y এর জন্য সমস্ত -y এর সেট , তারপরে পূর্ববর্তী অনুচ্ছেদটি দেওয়া হলে X এবং Y ছেদ করে যদি এবং কেবল এক্স + (-Y) 0 থাকে , তবে এটি উত্স ।
পার্শ্ব মন্তব্য: আমি কেন এক্স - ওয়াইয়ের পরিবর্তে এক্স + (-ওয়াই) লিখব ? ওয়েল, গণিত, একটি অপারেশন Minkowski পার্থক্য বলা হয় কারণ একজন এবং বি যা কখনও লেখা আছে এক্স - ওয়াই এখনো কিছুই সব সেট কি আছে এক্স - Y জন্য এক্স ∈ এক্স এবং ওয়াই ∈ ওয়াই (প্রকৃত Minkowski পার্থক্যটি আরও কিছুটা জটিল)।
সুতরাং আমরা X এবং -Y এর মিনকোভস্কির যোগফল গণনা করতে এবং এটির উত্স রয়েছে কিনা তা অনুসন্ধান করতে চাই। অন্য যে কোনও বিন্দুর তুলনায় উত্সটি বিশেষ নয়, যাতে উত্সটি কোনও নির্দিষ্ট ডোমেনের মধ্যে রয়েছে কিনা তা খুঁজে পেতে আমরা একটি অ্যালগরিদম ব্যবহার করি যা আমাদের জানাতে পারে যে প্রদত্ত কোনও বিন্দু সেই ডোমেনের অন্তর্ভুক্ত কিনা।
X এবং Y এর মিনকোভস্কি যোগফলের একটি দুর্দান্ত সম্পত্তি রয়েছে যা হ'ল যদি X এবং Y উত্তল হয়, তবে এক্স + ওয়াইও হয়। এবং কোনও বিন্দু উত্তল সেটের সাথে সম্পর্কিত কিনা তা সন্ধান করা যদি সেই সেটটি উত্তল (পরিচিত) না হত তবে তার চেয়ে অনেক সহজ।
আমরা সম্ভবত x y X এবং y ∈ Y এর জন্য সমস্ত এক্স - ওয়াই এর গুণন করতে পারি না কারণ এই জাতীয় পয়েন্ট x এবং y এর অসীমতা রয়েছে তাই আশা করা যায় যেহেতু এক্স , ওয়াই এবং এক্স + ওয়াই উত্তল, আমরা কেবল ব্যবহার করতে পারি "বাহ্যতমতম" বিন্দুগুলি X এবং Y এর আকারগুলি সংজ্ঞায়িত করে , যা তাদের শীর্ষগুলি, এবং আমরা এক্স + ওয়াইয়ের বহিরাগত পয়েন্টগুলি এবং আরও কিছু পেতে পারি।
এই অতিরিক্ত পয়েন্টগুলি এক্স + ওয়াইয়ের বহিরাগত দিকগুলি দ্বারা "ঘিরে" রয়েছে যাতে তারা সদ্য প্রাপ্ত উত্তল আকৃতিটি সংজ্ঞায়িত করতে অবদান রাখে না। আমরা বলি যে তারা পয়েন্টগুলির সেটটির " উত্তল হাল " সংজ্ঞা দেয় না । সুতরাং আমরা যা করি তা হ'ল চূড়ান্ত অ্যালগরিদমের প্রস্তুতির জন্য আমরা সেগুলি থেকে মুক্তি পেয়েছি যা আমাদের জানায় যে উত্সটি উত্তল স্তরের মধ্যে রয়েছে কিনা।
এক্স + ওয়াইয়ের উত্তল হাল। আমরা "অভ্যন্তরীণ" শীর্ষকোষগুলি সরিয়েছি।
আমরা তাই পেতে
প্রথম, নিষ্পাপ অ্যালগরিদম
boolean intersect(Shape X, Shape Y) {
SetOfVertices minkowski = new SetOfVertices();
for (Vertice x in X) {
for (Vertice y in Y) {
minkowski.addVertice(x-y);
}
}
return contains(convexHull(minkowski), Vector2D(0,0));
}
লুপগুলিতে স্পষ্টতই জটিলতা O (mn) থাকে যেখানে এম এবং এন প্রতিটি আকারের উল্লম্বের সংখ্যা। minkoswki
সেট রয়েছে MN সর্বাধিক উপাদান। convexHull
অ্যালগরিদম একটি জটিলতা যে উপর নির্ভর করে রয়েছে অ্যালগরিদম আপনি ব্যবহার , এবং আপনার জন্য তাগ করতে হে (ট লগ (ট)) যেখানে ট পয়েন্ট সেট আকার, তাই আমাদের ক্ষেত্রে আমরা পেতে হে (MN লগ (MN) ) । contains
অ্যালগরিদম একটি জটিলতা প্রান্ত (2D) অথবা উত্তল জাহাজের কাঠাম মুখে (3D মধ্যে) সংখ্যা সঙ্গে রৈখিক যে, তাই এটি সত্যিই আপনার শুরু আকার উপর নির্ভর করে আছে, কিন্তু এটা তার চেয়ে অনেক বেশী হবে না হে (MN) ।
আমি আপনাকে contains
উত্তল আকারের জন্য অ্যালগরিদমের জন্য গুগল করব , এটি একটি দুর্দান্ত সাধারণ। সময় পেলে আমি এখানে এটি রাখতে পারি।
তবে এটির সংঘর্ষ শনাক্তকরণ আমরা করছি, তাই আমরা এটিকে অনেকটা অনুকূল করতে পারি
আমরা মূলত দুটি সংস্থা ছিল একটি এবং বি একটি timestep সময় ঘূর্ণন ছাড়া চলন্ত DT (আমি কি আপনার ছবি দিকে তাকিয়ে বলতে পারেন থেকে)। আসুন কল বনাম একজন এবং V বি নিজ নিজ গতি একটি এবং বি , যা সময়কাল আমাদের timestep সময় ধ্রুবক হয় DT । আমরা নিম্নলিখিত পেতে:
এবং, যেমন আপনি আপনার ছবিগুলিতে ইঙ্গিত করেছেন, এই মৃতদেহগুলি স্থানান্তরিত হওয়ার সাথে সাথে অঞ্চলগুলিতে (বা 3 ডি-তে খণ্ডগুলি) জুড়ে চলেছে :
এবং এগুলি টাইম টেপের পরে এ ' এবং ' বি হিসাবে শেষ হয় ।
আমাদের নিষ্পাপ অ্যালগরিদমটি এখানে প্রয়োগ করতে, আমাদের কেবল স্যুইপ করা ভলিউমগুলি গণনা করতে হবে। তবে আমরা এটি করছি না।
এর রেফারেন্স ফ্রেমে বি , বি (duh!) শিখতে সরাতে না। আর একজন আছে একটি নির্দিষ্ট বেগ বি থেকে সম্মান সঙ্গে আপনি কম্পিউটিং দ্বারা পেতে বনাম একজন বনাম - বি (আপনি, বিপরীতটি কি করতে পারেন আপেক্ষিক বেগ গনা বি এর রেফারেন্স ফ্রেমে একটি )।
বাম থেকে ডানে: বেস রেফারেন্স ফ্রেমের বেগ; আপেক্ষিক বেগ; আপেক্ষিক বেগ গণনা।
সংক্রান্ত দ্বারা বি নিজস্ব রেফারেন্স ফ্রেমে অচল হিসাবে, আপনি শুধুমাত্র ভলিউম গনা আছে একটি এটা সময় চলে আসে যেমন মাধ্যমে sweeps DT তার আপেক্ষিক বেগ সঙ্গে বনাম একজন - বনাম বি ।
এটি মিনকোভস্কি যোগফলের (কখনও কখনও প্রচুর পরিমাণে) ব্যবহার করার জন্য উল্লম্বের সংখ্যা হ্রাস করে।
আরেকটি সম্ভাব্য অপ্টিমাইজেশন হল এমন একটি বিন্দু যেখানে আপনি দেহের একটির দ্বারা বিচ্ছিন্ন ভলিউমটি গণনা করছেন, আসুন এটিকে বলে দিন You আপনাকে এগুলি তৈরি করে সমস্ত উল্লম্বগুলি অনুবাদ করতে হবে না Only কেবলমাত্র প্রান্তগুলি (3 ডি তে মুখযুক্ত) যার বাহ্যিক স্বাভাবিক "মুখ" ঝাড়ু দিক। অবশ্যই আপনি লক্ষ করেছেন যে ইতিমধ্যে আপনি যখন আপনার বয়ে যাওয়া অঞ্চলগুলি স্কোয়ারের জন্য গণনা করেছেন। কোনও সাধারণ তার ঝাঁকুনির দিক দিয়ে তার বিন্দু পণ্যটি ব্যবহার করে ঝাড়ু দিকের দিকে যাচ্ছে কিনা তা ইতিবাচক হতে হবে তা আপনি বলতে পারেন।
ছেদগুলি সম্পর্কিত আপনার প্রশ্নের সাথে শেষ অপ্টিমাইজেশনের কোনও সম্পর্ক নেই যা আমাদের ক্ষেত্রে সত্যই কার্যকর। এটি আমাদের উল্লেখ করা সেই তুলনামূলক বেগ এবং তথাকথিত পৃথক অক্ষ পদ্ধতি ব্যবহার করে। অবশ্যই আপনি এটি সম্পর্কে ইতিমধ্যে জানেন।
ধরুন আপনি জানেন ব্যাসার্ধ এর একটি এবং বি তাদের সম্মান সঙ্গে ভরের সেন্টার (অর্থাৎ ভর কেন্দ্রে এবং তা থেকে প্রান্তবিন্দু সুদূরতম মধ্যে দূরত্ব,), এরকম:
সংঘর্ষ কেবল তখনই ঘটতে পারে যখন A এর সীমানা বৃত্ত বি এর সাথে মিলিত হয় । আমরা এখানে যে এটা হবে না দেখুন, এবং পথ থেকে দূরত্ব গনা যে কম্পিউটার বলতে সি বি থেকে আমি নিচের ছবি হিসেবে এবং নিশ্চিত এটি ব্যাসার্ধ এর সমষ্টি চেয়ে বড় করতে একটি এবং বি । এটি বড় হলে কোনও সংঘর্ষ নেই। যদি এটি ছোট হয়, তবে সংঘর্ষ হবে।
এই আকার যে বরং দীর্ঘ সঙ্গে খুব ভাল কাজ করে না, কিন্তু স্কোয়ার অথবা অন্য সব আকার ক্ষেত্রে, এটা একটি খুব ভাল অনুসন্ধানমূলক এর সংঘর্ষের বাতিল করতে ।
পৃথক অক্ষ উপপাদ্য প্রয়োগ বি এবং ভলিউম দ্বারা মোটামুটি একটি অবশ্য আপনাকে বলতে কিনা সংঘর্ষের ঘটবে না। সম্পর্কিত অ্যালগরিদমের জটিলতা প্রতিটি উত্তল আকারের শীর্ষের সংখ্যাগুলির যোগফলের সাথে লিনিয়ার, তবে আসলে সংঘর্ষটি হ্যান্ডেল করার সময় আসার সময় এটি কম জাদুকর is
আমাদের নতুন, আরও ভাল অ্যালগরিদম যা সংঘাতগুলি সনাক্ত করতে সাহায্যকারী ছেদগুলি ব্যবহার করে , তবে এখনও কোনও সংঘর্ষ ঘটে কিনা তা জানানোর জন্য পৃথক অক্ষের উপপাদকের মতো এখনও ভাল নয়
boolean mayCollide(Body A, Body B) {
Vector2D relativeVelocity = A.velocity - B.velocity;
if (radiiHeuristic(A, B, relativeVelocity)) {
return false; // there is a separating axis between them
}
Volume sweptA = sweptVolume(A, relativeVelocity);
return contains(convexHull(minkowskiMinus(sweptA, B)), Vector2D(0,0));
}
boolean radiiHeuristic(A, B, relativeVelocity)) {
// the code here
}
Volume convexHull(SetOfVertices s) {
// the code here
}
boolean contains(Volume v, Vector2D p) {
// the code here
}
SetOfVertices minkowskiMinus(Body X, Body Y) {
SetOfVertices result = new SetOfVertices();
for (Vertice x in X) {
for (Vertice y in Y) {
result.addVertice(x-y);
}
}
return result;
}