বক্ররেখার সাথে সংঘর্ষ সনাক্তকরণ


12

আমি একটি 2 ডি গেম নিয়ে কাজ করছি যেখানে আমি চলমান চেনাশোনা এবং কিছু ধরণের স্ট্যাটিক কার্ভের (সম্ভবত বেজিয়ার কার্ভ) মধ্যে সংঘর্ষ সনাক্তকরণ করতে চাই।

বর্তমানে আমার গেমটি স্ট্যাটিক জ্যামিতি হিসাবে কেবল সরল রেখাগুলি বৈশিষ্ট্যযুক্ত এবং আমি বৃত্ত থেকে রেখাগুলির দূরত্ব গণনা করে সংঘর্ষ সনাক্তকরণটি করছি এবং বৃত্তের ব্যাসার্ধের চেয়ে দূরত্ব কম হলে ক্ষেত্রে বৃত্তটি রেখার বাইরে বের করে আছি।

আমি আপেক্ষিক সোজা উপায়ে এই ধরণের সংঘর্ষ সনাক্তকরণ কীভাবে করব? আমি উদাহরণস্বরূপ জানি যে বক্স 2 ডি বেজিয়ার কার্ভগুলির সাথে সংঘর্ষ সনাক্তকরণের বৈশিষ্ট্যযুক্ত। আমার একটি পূর্ণ বৈশিষ্ট্যযুক্ত সংঘর্ষ শনাক্তকরণ ব্যবস্থার দরকার নেই, আমি যা বর্ণনা করেছি তা করতে পারে এমন কিছু।


আপডেট: দুর্দান্ত উত্তরের জন্য অনেক ধন্যবাদ! আপনার বর্ণিত পদ্ধতিটি পুরোপুরি বুঝতে আমাকে বেজিয়ার কার্ভগুলি পড়তে হবে। তারপরে আমি তোমার কাছে ফিরে আসব।

উত্তর:


6

29/09/2012 - 23:20

আমি এখানে একটি গিট রেপো তৈরি করেছি: https://github.com/ArthurWulfWhite/Bezier- দূরত্ব /

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

শুভকামনা!

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


আপনি যদি বেজিয়ারকে পুনরাবৃত্তভাবে বিভাগগুলিতে বিভক্ত করার এবং সেগুলির সাথে সংঘর্ষের জন্য অনুসন্ধান করার পরিকল্পনা করেন তবে আমি 100,100 অ্যারে (গ্রিড) তৈরি করার এবং প্রতিটি বিভাগকে নিকটস্থ চারটি স্কোয়ারে রাখার পরামর্শ দিচ্ছি, সুতরাং আপনাকে কেবল 4 / 10,000 এর সাথে সংঘর্ষের জন্য পরীক্ষা করতে হবে প্রতিটি ফ্রেম অংশ।

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

পুরানো উত্তর: খাঁটি উপায়।

বৃত্তের কেন্দ্র এবং বক্ররেখার নিকটতম বিন্দুর মধ্যবর্তী দূরত্বের মধ্য দিয়ে দূরত্ব পরীক্ষা করে আপনি দেখতে পারেন যে কোনও বৃত্তটি বেজিয়ার বক্রের সাথে সংঘর্ষ করছে কিনা actually

দূরত্বের সমীকরণ (সাধারণভাবে)

ব্যাখ্যা:

বেজিয়ার সমীকরণ:

q(t) = (1-t) * ((1-t) * start.(x,y) + t * control.(x,y)) + t*(t * control.(x,y) + (1 - t) * end.(x,y))

এটি (কিছুটা বীজগণিত সহ) পর্যন্ত সংক্ষিপ্ত করা যায় - আমি বাদ পড়ব x (x, y) পঠনযোগ্যতার জন্য (তারা এখনও পয়েন্ট, এক নম্বর নয়)

q(t) = (start -2 * cont + end) t^2 + (-2 * start + 2 * control) + start

বিন্দু (x, y) থেকে দূরত্ব হ'ল:

sqrt ((q(t).x - point.x)^2 + (q(t).y - point.y)^2)

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

এর জন্য মূলগুলি খুঁজে বের করার জন্য আপনার যে ডেরাইভেটিভ দরকার তা হ'ল:

ধরে নেওয়া হচ্ছে: a = start b = control c = end d = cirlce Center point

ওল্ফ্রাম আলফা ব্যবহার করে ডেরিভেটিভ

জটিল অংশটি এই পয়েন্টগুলিকে গুণ করছে, আপনাকে ডট পণ্য ব্যবহার করতে হবে।

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

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

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

ব্যাসার্ধ যদি সর্বনিম্ন দূরত্বের চেয়ে ছোট হয় তবে সংঘর্ষ হয়।

কোণটি বৃত্তের কেন্দ্র এবং বেজিয়ারের নিকটতম বিন্দুর মধ্যে প্রায় একটি।

বলা হচ্ছে, যদি আপনি সত্যিই সংঘর্ষের পদার্থবিজ্ঞানের সাথে একটি গেম তৈরি করতে চান তবে আমি আপনাকে বেজিয়ারের উপর দিয়ে পুনরাবৃত্তি করার পরামর্শ দিচ্ছি

    q(t) = (1-t) * ((1-t) * start.(x,y) + t * control.(x,y)) + t*(t * control.(x,y) + (1 - t) * end.(x,y))

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


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

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

প্রায়শই নতুন কিছু বাস্তবায়নের ক্ষেত্রে অপ্রত্যাশিত চ্যালেঞ্জ এবং 2 ডি পদার্থবিজ্ঞান এপিআই ব্যবহার করার সৌন্দর্যের ক্ষেত্রে এটি হ'ল এটি যে কোনও প্রোগ্রামিং ভাষা ব্যবহার করার মতো, এটি শিখতে কয়েক ঘন্টা ব্যয় করা ছাড়া আপনার পক্ষ থেকে বিশেষ প্রচেষ্টা প্রয়োজন হয় না এবং ফলাফল খুব সন্তোষজনক।
আতুরস্যামস

আমি এখনই আরও কয়েকটি বিশদ যুক্ত করেছি, শুভকামনা। :)
আতুরস্যামস

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

7

এটি করতে, আমি চাই:

  • বেজিয়ার কার্ভটি কয়েকটি লাইন বিভাগে বিভক্ত করুন এবং সেগুলি সংরক্ষণ করুন।

  • এই সমস্ত বিভাগগুলিকে পুরো বক্ররেখার জন্য অক্ষরেখার সীমানা বাক্সে রাখুন।

সংঘর্ষ সনাক্তকরণ:

1) গোলকটি মূল সীমানা বাক্সের ভিতরে রয়েছে কিনা তা পরীক্ষা করুন। যদি না, কোন সংঘর্ষ।

২) অন্যথায়, উপরে গণনা করা পৃথক বিভাগগুলির কোনওটি গোলকের সাথে সংঘর্ষে রয়েছে কিনা তা পরীক্ষা করুন। উইকিপিডিয়া থেকে লাইন – গোলক ছেদ করার নিবন্ধটি দেখুন ।

সম্পাদনা করুন: আপনার যদি উচ্চ নির্ভুলতার প্রয়োজন হয় এবং ভাল পারফরম্যান্স চান, আপনি পুরো বক্ররেখার জন্য একটি প্রধান সীমাবদ্ধ বাক্সও তৈরি করতে পারেন, তারপরে দুটি বিভাগে বক্রাকে ভাগ করুন (যেমন: [0.0 - 0.5]এবং [0.5 - 1.0])। তাদের মধ্যে প্রত্যেকের জন্য একটি bouding বক্স তৈরি করুন, তারপর আবার দুটি অংশ (সুতরাং দান এই অংশ প্রতিটি বিভক্ত [0 - 0.25], [0.25 - 0.5]এবং [0.5 - 0.75], [0.75 - 1.0])। যতক্ষণ না আপনি পর্যাপ্ত নির্ভুলতায় না পৌঁছান ততক্ষণ এভাবে চলুন। শেষের দিকে আপনার কাছে binary treeমূল বক্ররেখার বাক্স বাক্সের সাথে একটি মূল বাক্স এবং পাতায় লাইন বিভাগ থাকবে। গাছে অনুসন্ধান করা O(log n)পরিবর্তে আপনাকে দেবে O(n)(যেখানে n= বক্ররেখার রেখাংশের সংখ্যা)


এই সমাধানটি আমার কাছে বোধগম্য হয় এবং এটি অবশ্যই বোঝা সহজ এবং আমি এটির সাথে সমাধান করতে পারি। তবে আমি আরও কৌতূহলযুক্ত যদি আরও "খাঁটি" বিকল্প উপস্থিত থাকে।
20:56 এ প্যালডাইপাইন্ড

5

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

এই নিবন্ধটি এটি একটি বিন্দু পর্যন্ত কভার করে: http://students.cs.byu.edu/~tom/557/text/cic.pdf

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

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


আমি নিবন্ধটি এখনও পড়িনি। তবে আমি কীভাবে একটি রেখা এবং বেজিয়ার বক্ররেখার চৌরাস্তা থেকে একটি বৃত্ত এবং বেজিয়ারের মধ্যে ছেদ করতে পারি? একটি চেনাশোনা এবং বহুভুজের বিরুদ্ধে সংঘাতের পরীক্ষা করা আমার কাছে কিছুটা জটিল sounds
প্যালডাইপাইন্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.