দ্রুত চলমান অবজেক্টের জন্য ষড়ভুজ সংঘর্ষ সনাক্তকরণ?


39

একটি বস্তুর একটি অবস্থান এবং একটি গতি ভেক্টর রয়েছে। সাধারণত দুটি অবস্থানের সংঘর্ষ হয় কিনা তা যাচাই করার জন্য কেবলমাত্র অবস্থানটি ব্যবহৃত হয়, এটি খুব দ্রুত চলমান বস্তুর জন্য সমস্যাযুক্ত কারণ এটি ঘটতে পারে যে বস্তুটি এত তাড়াতাড়ি চালিত হয় যে এটি প্রথম সংঘর্ষের পরীক্ষায় প্রথম বস্তুর সামনে এবং এর পিছনে রয়েছে দ্বিতীয় সংঘর্ষের চেক।

বাউন্ডিংবক্সের সংঘাত ব্যর্থ

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

হেক্সাগন কলিজন উইন

সুতরাং আমার ধারণাটি কোনও বিন্দু প্রসারিত করার পরিবর্তে কেন একটি আয়তক্ষেত্র প্রসারিত করবেন না? এটি একটি ষড়ভুজ ফলাফল।

এখন, এতক্ষণ ভাল। তবে আমি আসলে কীভাবে চেক করব যে এই জাতীয় দুটি হেক্সাগন ছেদ করে? মনে রাখবেন যে এগুলি হেক্সাগনের অত্যন্ত নির্দিষ্ট।

ষড়ভুজ স্পেসিফিকেশন

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


(এ লাইনে) এর জন্য (বি তে রেখা) যদি (লাইনগুলি ক্রস হয়) সংঘর্ষ হয় - তবে এ ক্ষেত্রে বি বা বি তে এটিকে আবরণ করা যায় না। হুঁ। =)
জারি কম্প্পা

4
আপনি বাক্সে প্রতিশ্রুতিবদ্ধ? আপনি যে বাক্সগুলি আঁকেন সেগুলি যথাযথতার ন্যূনতম ক্ষতি সহ চেনাশোনাগুলি দ্বারা প্রতিনিধিত্ব করা যেতে পারে তবে তুলনামূলকভাবে সহজ সংঘর্ষের আগের মতো। সুইপেট বৃত্তের সংঘর্ষ সনাক্তকরণের জন্য অনুসন্ধান করুন। যদি আপনার দৈর্ঘ্য / প্রস্থের অনুপাত 1 থেকে দূরে সরে যায় তবে এটি কম আকর্ষণীয় হবে।
স্টিভ এইচ

@ স্টিভেএইচ আমি সর্বাধিক নমনীয় সমাধানের সন্ধান করছি, সুতরাং দৈর্ঘ্য / প্রস্থের অনুপাতটি একটি বিরাট ব্যাপার।
এপিআই-বিস্ট

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

2
আমি এর আগে এটি চেষ্টা করে দেখিনি তবে মনে হয় 2 ডি স্পেসে হেক্সাগনগুলির পরিবর্তে আপনি 2 ডি-তে আন্দোলন 3 ডি স্পেসে ভলিউম হিসাবে ভাবতে পারেন যেখানে একটি অক্ষ সময় হয়। তারপরে আপনি (x, y, টি) স্থানাঙ্কগুলি সহ দুটি 3 ডি পলিহেড্র ছেদ করছেন। যদি দুটি শক্ত বস্তু ছেদ করে তবে আপনি সর্বনিম্ন টি মানটি পেতে চান। আপনি বি এর সমস্ত স্থানাঙ্ককে এ এর ​​রেফারেন্স ফ্রেমে রূপান্তর করে কিছুটা সহজ করতে পারেন। আমি এটি বাস্তবায়ন করি নি তবে আমি এটিই শুরু করেছি।
amitp

উত্তর:


34

সমাধানটি প্রত্যাশার চেয়ে সহজ is কৌশলটি হ'ল আপনার হেক্সাগন কৌশলটির আগে মিনকোভস্কি বিয়োগ ব্যবহার করা ।

এখানে তাদের বেগ সঙ্গে, আপনার আয়তক্ষেত্র A এবং B হয় vAএবং vB। মনে রাখবেন vAএবং vBআসলে বেগ নয়, এগুলি হ'ল একটি ফ্রেমের সময় ভ্রমণ distance

ধাপ 1

এখন আয়তক্ষেত্র B কে একটি বিন্দু P এর সাথে প্রতিস্থাপন করুন এবং A এর সাথে আয়তক্ষেত্র C = A + (- B) দিয়ে আয়তক্ষেত্র করুন, যার A এবং B এর মাত্রার যোগফল রয়েছে মিনকোভস্কি সংযোজন বৈশিষ্ট্যগুলি জানিয়েছে যে বিন্দু এবং নতুন আয়তক্ষেত্রের মধ্যে সংঘর্ষ ঘটে যদি এবং কেবলমাত্র দুটি মূল আয়তক্ষেত্রের মধ্যে সংঘর্ষ ঘটে:

ধাপ ২

তবে যদি আয়তক্ষেত্র C ভেক্টর ধরে চলে যায় vAএবং P বিন্দুটিকে ভেক্টরের সাথে vBনিয়ে যায় তবে রেফারেন্স ফ্রেমের একটি সাধারণ পরিবর্তন আমাদেরকে বলে যে এটি আয়তক্ষেত্র সি হিসাবে এখনও রয়েছে, এবং P বিন্দুতে সরানো হয়েছে vB-vA:

ধাপ 3

তারপরে নতুন রেফারেন্স ফ্রেমে সংঘর্ষ কোথায় ঘটে তা জানাতে আপনি একটি সাধারণ বাক্স-সেগমেন্ট ছেদ সূত্র ব্যবহার করতে পারেন।

শেষ পদক্ষেপটি যথাযথ রেফারেন্স ফ্রেমে ফিরে যাওয়া। ভেক্টরের দৈর্ঘ্য দ্বারা বৃত্তাকার ছেদ হওয়া অবধি বিন্দু দিয়ে ভ্রমণ হওয়া দূরত্বকে বিভাজন করুন vB-vAএবং আপনি sএরূপ মান পাবেন 0 < s < 1। সংঘর্ষের সময়ে ঘটে s * Tযেখানে Tআপনার ফ্রেমের সময়কাল।

ম্যাডশোগোর মন্তব্য :
মিস্টার বিস্টের নিজস্ব উত্তরের একটিটির চেয়ে এই কৌশলটির একটি বিশাল সুবিধা হ'ল যদি কোনও আবর্তন না ঘটে তবে "মিনকোভস্কি বিয়োগ" এ + (- বি) পরবর্তী সমস্ত টাইমস্টেপের জন্য একবার গণনা করা যায় !

শুধুমাত্র অ্যালগরিদম যে সব সময় লাগে তাই এই (Minkowski সমষ্টি, জটিলতা হে (MN) যেখানে মি মধ্যে ছেদচিহ্ন সংখ্যা একটি এবং এন মধ্যে ছেদচিহ্ন সংখ্যা বি ) শুধুমাত্র একবার ব্যবহার করা যাবে, কার্যকরীভাবে সংঘর্ষের সনাক্তকরণ একটি constant- উপার্জন সময়ের সমস্যা!

পরে, আপনি নিশ্চিত হয়ে গেছেন যে A এবং B আপনার দৃশ্যের বিভিন্ন অংশে রয়েছে (আপনার চতুষ্কোণ?) এবং এর পরে আর সংঘর্ষ হবে না you

বিপরীতে, মিস্টার বিস্টের পদ্ধতির প্রতিটি সময় পদক্ষেপে বেশ কয়েকটি গণনা প্রয়োজন।

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

তবে এগুলি কেবল তখনই কার্যকর হয় যদি A বা B উভয়ই ঘোরাফেরা করে না এবং উভয় উত্তল হয়। যদি ঘূর্ণন থাকে বা আপনি অবতল আকার ব্যবহার করেন তবে আপনাকে অবশ্যই স্যুইপেট ভলিউম / অঞ্চলগুলি ব্যবহার করতে হবে।
মন্তব্য শেষ


4
দেখতে বরং একটি আকর্ষণীয় পদ্ধতির মতো দেখে মনে হচ্ছে, আমি এখনও এটি 100% উপলব্ধি করতে পারি না, যখন বস্তুটি সত্যিই ছোট এবং দুটি লাইনের মধ্যবর্তী হয় তখন কী ঘটে? i.imgur.com/hRolvAF.png
এপিআই-বিস্ট

-1: এই পদ্ধতিটি কোনওভাবেই আপনার সংঘর্ষের ঘটনা নিশ্চিত হওয়ার অনুমতি দেয় না। এটা শুধুমাত্র আপনি কি নিশ্চিতরূপে এটা হতে পারবেন না ঘটতে, কেস যেখানে সেগমেন্ট এবং Extruded ভলিউম কি মধ্যে না ছেদ করে। তবে এটি সম্পূর্ণভাবে সম্ভব যে তারা ছেদ করে এবং এখনও কোনও সংঘর্ষ নেই। দোষটি হ'ল "এখন আপনি সংঘর্ষটি কোথায় ঘটেছে" তা সিদ্ধান্ত নিতে আপনি [...] সাধারণ সেগমেন্ট-সেগমেন্ট ছেদটি ব্যবহার করতে পারেন part অংশ।
jrsala

2
@madshogo আপনি ঠিক বলেছেন আমি ধরে নিয়েছি যে বস্তুর আকারের তুলনায় টাইমস্টেপটি যথেষ্ট ছোট ছিল যে এটি কোনও সমস্যা হবে না তবে সাধারণ ক্ষেত্রে এটি অবশ্যই খুব দৃust় নয়। আমি এটি ঠিক করার চেষ্টা করব।
সাম হোচেভার

@ সামহোসেভর আপনি যদি উত্তরটি সংশোধন করতে পারেন তবে দুর্দান্ত।
এপিআই-বিস্ট

1
@ লুইস সর্বদা হ্যাঁ এবং না ... সমস্ত যুক্তি কাজ করে, তবে আপনাকে সময়ের vB-vAসাথে সাথে g(t)-f(t)কোথায় fএবং gএ এবং বি এর অবস্থানগুলি নিয়ে প্রতিস্থাপন করতে হবে । যেহেতু এটি এখন আর সরল রেখা নয়, আপনাকে একটি বাক্স সমাধান করতে হবে - প্যারামেট্রিক বক্ররেখা ছেদ করার সমস্যা।
সাম হোচেভার

17

প্রথমত, অক্ষ-সংযুক্ত আয়তক্ষেত্রগুলির ক্ষেত্রে, কেভিন রেডের উত্তরটি সবচেয়ে ভাল এবং অ্যালগরিদমটি সবচেয়ে দ্রুত।

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


দুটি উত্তল আকারের ছেদ হয় কিনা তা সাধারণ ক্ষেত্রে কীভাবে বলা যায়?

আমি আপনাকে একটি অ্যালগরিদম দেব যা কেবলমাত্র হেক্সাগন নয়, সমস্ত উত্তল আকারের জন্য কাজ করে।

ধরুন এক্স এবং ওয়াই দুটি উত্তল আকার। তারা ছেদ করে যদি কেবলমাত্র যদি তাদের বিন্দুতে কোন মিল থাকে, অর্থাৎ একটি বিন্দু 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;

}

2

আমি মনে করি না যে 'ষড়ভুজ' ব্যবহার করা সমস্ত সহায়ক। অক্ষ-সংযুক্ত আয়তক্ষেত্রগুলির জন্য সঠিক সংঘর্ষ পাওয়ার জন্য একটি স্কেচ এখানে দেওয়া হয়েছে:

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

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


3
আপনি আপনার স্কেচটি ভুলে গেছেন।
MichaelHouse

2
@ বাইট ৫6 না, আমার অর্থ এটি একটি অ্যালগরিদমের স্কেচ, এমনকি সিউডোকোডও নয়।
কেভিন রেড

আচ্ছা বুঝলাম. আমার ভুল.
MichaelHouse

এটি আসলে সবচেয়ে সহজ পদ্ধতি। আমি এটি প্রয়োগের জন্য সংশ্লিষ্ট কোড যুক্ত করেছি।
পাশা

1

আমি মনে করি না আয়তক্ষেত্রের চেয়ে বেশি দিক দিয়ে বহুভুজগুলির সংঘর্ষ গণনা করার সহজ উপায় আছে। আমি এটিকে লাইন এবং স্কোয়ারের মতো আদিম আকারে ভেঙে দেব:

function objectsWillCollide(object1,object2) {
    var lineA, lineB, lineC, lineD;
    //get projected paths of objects and store them in the 'line' variables

    var AC = lineCollision(lineA,lineC);
    var AD = lineCollision(lineA,lineD);
    var BC = lineCollision(lineB,lineC);
    var BD = lineCollision(lineB,lineD);
    var objectToObjectCollision = rectangleCollision(object1.getRectangle(), object2.getRectangle());

    return (AC || AD || BC || BD || objectToObjectCollision);
}

অবজেক্টের পাথ এবং শেষের অবস্থার চিত্র

পূর্ববর্তী গণনার সময় যা যাচাই করা উচিত ছিল আমি কীভাবে প্রতিটি বস্তুর সূচনা-পরিস্থিতি উপেক্ষা করব তা নোট করুন


3
এটির সাথে সমস্যাটি হ'ল যদি বস্তুর আকারগুলি অনেক বেশি হয় তবে ছোট বস্তু কোনও সংঘর্ষের সূত্রপাত না করেই বড় অবজেক্টের পথের অভ্যন্তরে যেতে পারে।
এপিআই-বিস্ট

0

এক্সিস থিওরেম আলাদা করুন

পৃথক অক্ষের উপপাদ্যটি বলে "আমরা যদি এমন একটি অক্ষ খুঁজে পাই যেটির উপর দুটি উত্তল আকারগুলি ছেদ না করে তবে দুটি আকারের ছেদ হয় না" বা আইটিটির জন্য আরও অনুশীলনযোগ্য:

"দুটি উত্তল আকৃতি কেবল তখন ছেদ করে যদি তারা সমস্ত সম্ভাব্য অক্ষকে ছেদ করে।"

অক্ষ সারিবদ্ধ আয়তক্ষেত্রগুলির জন্য ঠিক 2 টি সম্ভাব্য অক্ষ রয়েছে: x এবং y। তবে উপপাদ্যটি আয়তক্ষেত্রের মধ্যে সীমাবদ্ধ নয়, এটি কেবলমাত্র অন্যান্য অক্ষগুলিকে যুক্ত করে কোনও উত্তল আকারে প্রয়োগ করতে পারে যার উপর আকারগুলি ছেদ করতে পারে। বিষয় সম্পর্কে আরও তথ্যের জন্য এন এর বিকাশকারী দ্বারা এই টিউটোরিয়ালটি দেখুন: http://www.metanetsoftware.com/technique/tutorialA.html#section1

প্রয়োগ করা হয়েছে এটি দেখতে এরকম দেখাচ্ছে:

axes = [... possible axes ...];
collision = true;
for every index i of axes
{
  range1[i] = shape1.getRangeOnAxis(axes[i]);
  range2[i] = shape2.getRangeOnAxis(axes[i]);
  rangeIntersection[i] = range1[i].intersectionWith(range2[i]);
  if(rangeIntersection[i].length() <= 0)
  {
    collision = false;
    break;
  }
}

অক্ষগুলি সাধারণ ভেক্টর হিসাবে উপস্থাপিত হতে পারে।

একটি পরিসীমা 1-মাত্রিক লাইন। শুরুটি সর্বনিম্ন প্রজেক্ট পয়েন্টে সেট করা উচিত, বৃহত্তম প্রজেক্ট পয়েন্টের সমাপ্তি।

এটি "ঝাড়ু" আয়তক্ষেত্রে প্রয়োগ করা হচ্ছে

প্রশ্নের হেক্সাগনটি বস্তুর এএবিবি "ঝুলিয়ে" তৈরি করে। সুইপিং কোনও আকৃতিতে ঠিক একটি সম্ভাব্য সংঘর্ষের অক্ষ যুক্ত করে: আন্দোলন ভেক্টর।

shape1 = sweep(originalShape1, movementVectorOfShape1);
shape2 = sweep(originalShape2, movementVectorOfShape2);

axes[0] = vector2f(1.0, 0.0); // X-Axis
axes[1] = vector2f(0.0, 1.0); // Y-Axis
axes[2] = movementVectorOfShape1.normalized();
axes[3] = movementVectorOfShape2.normalized();

এখন পর্যন্ত এত ভাল, এখন আমরা ইতিমধ্যে দুটি ষড়ভুজের ছেদটি কিনা তা পরীক্ষা করে দেখতে পারি। কিন্তু এটা আরও ভাল পায়.

এই দ্রবণটি কোনও উত্তল আকারের জন্য (উদাহরণস্বরূপ ত্রিভুজগুলির) এবং কোনও ঝাড়ু উত্তল আকৃতির জন্য (উদাহরণস্বরূপ সুইপড অক্টাগন) কাজ করবে। তবে আকারটি যত জটিল হবে তত কম কার্যকর হবে।


বোনাস: যেখানে যাদু ঘটে।

যেমনটি আমি বলেছি কেবলমাত্র অতিরিক্ত অক্ষ হ'ল আন্দোলনকারী ভেক্টর। গতিবেগটি সময়কে গতিবেগের দ্বারা বৃদ্ধি করা হয়, সুতরাং এক অর্থে তারা কেবল স্থান অক্ষ নয়, তারা সময়-স্থানের অক্ষ।

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

shapeRange1 = originalShape1.getRangeOnAxis(axes[2]);
shapeRange2 = originalShape2.getRangeOnAxis(axes[3]);
// Project them on a scale from 0-1 so we can compare the time ranges
timeFrame1 = (rangeIntersection[2] - shapeRange1.center())/movementVectorOfShape1.project(axes[2]);
timeFrame2 = (rangeIntersection[3] - shapeRange2.center())/movementVectorOfShape2.project(axes[3]);
timeIntersection = timeFrame1.intersectionWith(timeFrame2);

আমি যখন এই প্রশ্নটি জিজ্ঞাসা করেছি তখনই আমি ইতিমধ্যে এই আপসটি মেনে নিয়েছি যে এই পদ্ধতির সাথে কয়েকটি বিরল মিথ্যা ইতিবাচকতা থাকবে। তবে আমি ভুল ছিলাম, এই বার ছেদটি পরীক্ষা করে আমরা পরীক্ষা করতে পারি যে সংঘর্ষটি "প্রকৃতপক্ষে" ঘটেছে কিনা এবং আমরা সেগুলি দিয়ে এই মিথ্যা ধনাত্মকগুলি বাছাই করতে পারি:

if(collision)
{
  [... timeIntersection = see above ...]
  if(timeIntersection.length() <= 0)
    collision = false;
  else
    collisionTime = timeIntersection.start; // 0: Start of the frame, 1: End of the frame
}

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


1
আপনার সমাধানের সন্ধানের জন্য অভিনন্দন! তবে আমি আগেই বলেছি: হেক্সাগন ছেদ করার অর্থ এই নয় যে সংঘর্ষ হবে। সংঘর্ষের সময়টি আপনি যা চান তা গণনা করতে আপনি আপনার পদ্ধতিটি ব্যবহার করতে পারেন, যদি কোনও সংঘর্ষ না হয় তবে এটি খুব কার্যকর নয়। দ্বিতীয়ত, আপনি আপেক্ষিক গতি ব্যবহার করতে পারেন যাতে কেবল 1 টি ভাসমান ভলিউম গণনা করতে হবে এবং SAT ব্যবহার করার সময় গণনাগুলি সরল করতে হবে। অবশেষে, আপনার "ছেদ করার সময়" কৌশলটি কীভাবে কাজ করে সে সম্পর্কে আমার কাছে মোটামুটি ধারণা আছে, কারণ সম্ভবত আপনি আপনার সূচিগুলি shapeRange1 == shapeRange2আপনার কোডের মতো দেখতে মিশে গেছেন , তাই না?
jrsala

@ মদশোগো এখন আরও বোধ করা উচিত।
এপিআই-বিস্ট

পরিসীমা স্বাভাবিককরণের জিনিসটি কীভাবে কাজ করে তা আমি এখনও বুঝতে পারি না তবে আমার ধারণা এটি কারণ এটি আমার একটি ছবি প্রয়োজন। আমি আশা করি এটি আপনার পক্ষে কাজ করে।
jrsala

-2

যতক্ষণ সুইপ্ট এলাকাসমূহ উভয় বন্ধ থাকে (প্রান্তরেখাগুলি দ্বারা গঠিত সীমানায় কোনও ফাঁক নেই), নিম্নলিখিতগুলি কাজ করবে (কেবল আপনার সংঘর্ষের পরীক্ষাগুলি লাইন-লাইন এবং পয়েন্ট-রেক্ট / পয়েন্ট-ট্রিতে হ্রাস করুন):

  1. তাদের প্রান্ত স্পর্শ না? (লাইন-লাইন সংঘর্ষগুলি) স্যুইপ করা অঞ্চলের কোনও প্রান্ত-রেখাটি অন্য অদলবদলের যে কোনও প্রান্তরেখার সাথে ছেদ করেছে কিনা তা পরীক্ষা করুন। প্রতিটি বিচ্ছিন্ন অঞ্চলটির 6-পক্ষ রয়েছে।

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

আপনি কোন পরীক্ষাটি প্রথমে করেন তা প্রতিটিটির সম্ভাবনার উপর নির্ভর করে (সবচেয়ে সাধারণভাবে একটি ঘটনাকে প্রথমে করুন)।

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


কোনও একটি আয়তক্ষেত্র যদি সত্যিই ক্ষুদ্র হয় এবং দুটি প্রান্তরেখার মধ্যবর্তী স্থানের মধ্যে চলে যায় তবে কাজ করে না।
jrsala

@madshogo আমি কেবল আমার প্রতিক্রিয়াতে যুক্ত করেছি। এখনই একটি সম্পূর্ণ সমাধান হওয়া উচিত।
অ্যাক্সন

1
"অক্ষগুলি সারিবদ্ধ আকারগুলি ব্যবহার করুন (পয়েন্ট-রেক্টট এবং পয়েন্ট-ট্রাই)": আপনি কীভাবে অক্ষের সাথে একটি ত্রিভুজ বা একটি "পয়েন্ট-ত্রিভুজ" (যার অর্থ যাই হোক না কেন) সারিবদ্ধ করেন? "যাতে বৃহত্তর অক্ষটি-সংযুক্ত থাকে": আপনি কীভাবে বলতে পারেন কোনটি অন্যটির চেয়ে বড়? আপনি তাদের অঞ্চল গণনা করবেন? "এটি আপনার হেক্সকে ট্রিস এবং পুনরায় আবরণে ছড়িয়ে দেওয়ার জন্য সম্পন্ন হয়েছে?": কোন হেক্স? দুই আছে. "(বা আপনি যদি আমাকে এটির জন্য চিত্রিত করতে চান তবে এই প্রতিক্রিয়াটিকে উচ্চারণ করুন)": আপনি কি গুরুতর ??
jrsala

"আপনি কীভাবে অক্ষের সাহায্যে একটি ত্রিভুজটি সারিবদ্ধ করেন?" উত্তর: সুইপট এরিয়া বানিয়ে আপত্তিটির পথ সারিবদ্ধ করুন। একটি কিনুন এবং ট্রিগ ব্যবহার করুন। "আপনি কীভাবে বলতে পারেন কোনটি অন্যটির চেয়ে বড়?" উত্তর: উদাহরণস্বরূপ, আয়তক্ষেত্রের দুটি তির্যক বিপরীত বিন্দুর (হেক্সের মাঝখানে) মধ্যবর্তী দূরত্বটি ব্যবহার করুন। "কোন হেক্স?" উ: বড়টি।
অ্যাক্সন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.