কিভাবে একটি পথ দৈর্ঘ্য নির্ধারণ করবে?


11

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

হালনাগাদ:

পথটি কার্টেসিয়ান বিমানে উপস্থাপিত হয় (2 ডি)।


উত্তর:


7

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

কয়েক মাস আগে আমি বক্ররেখাটিকে "ছোট" বিভাগগুলিতে বিভক্ত করার এবং তাদের দৈর্ঘ্য যুক্ত করার প্রস্তাবিত পদ্ধতির ব্যবহার করে এটি প্রয়োগ করেছি। একটা সি ++ প্রয়োগের একটি উদাহরণ এখানে


11

বেজিয়ার বক্রের দৈর্ঘ্য পরিমাপ করা শক্ত। আপনি যদি সামান্য অসম্পূর্ণতা মনে করেন না, তবে একটি সহজ সমাধান হ'ল সরল রেখাসমূহের সাথে বেজিয়ার বক্ররেখা আনুমানিক করা এবং রেখার দৈর্ঘ্যের যোগফল গণনা করা। আপনি যত বেশি বিভাগ তৈরি করবেন, তত কাছাকাছি পরিমাণে উত্তম।


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

একটি সহজ উপায় হ'ল কেবল বি (0) থেকে বি (1) পর্যন্ত পয়েন্টগুলির রৈখিক বিতরণ ব্যবহার করা ... অনেকটা এমন কিছুর মতো যা আপনি আসলে বক্ররেখা প্লট করতে ব্যবহার করবেন। ড্যানের উত্তরে উত্স কোডটি দেখুন।
বাম্মজ্যাক

আমি ডাউন-ভোটের ব্যাখ্যাটির প্রশংসা করব, আমার উত্তরে আমি কী উন্নতি করতে পারবো তা জানতে ...
বামমজ্যাক

7

উচ্চতর অর্ডার (অর্থাত্ 1 ম অর্ডারের বেশি) স্প্লাইন দৈর্ঘ্যের প্যারামিটারাইজেশন আনুমানিক করতে হবে; এটি সরাসরি উপস্থাপন করা যায় না, সুতরাং এর সরাসরি সমাধান খুঁজে পাওয়া সহজ নয় এই বিষয়টি সত্য।

কিছু বিদ্যমান বাস্তবায়ন (কপি-পেস্ট কোড):

লেখকদের মতে চেবিশেভ আনুমানিক ব্যবহারগুলি ব্যবহার করে , বক্রের আকার বাড়ার সাথে যথাযথতা বৃদ্ধি পায়। পৃষ্ঠা 7-8 সিউডোকোড দেখুন, বাকীটি অন্যান্য অ্যালগরিদমের বিবরণ যা তারা তাদের পদ্ধতির উপর ভিত্তি করে যা আপনি উপেক্ষা করতে পারেন। অনলাইন অনেকগুলি রেফারেন্স এই পদ্ধতিটিকে একটি ভাল হিসাবে উল্লেখ করে।

এই সংক্ষিপ্ত পদ্ধতির এছাড়াও দেখুন ।


5

এটি @ বমজ্যাকের উত্তরের মন্তব্যে মন্তব্য হিসাবে শুরু হয়েছিল, তবে খুব দীর্ঘ হয়েছে।

আমার কতগুলি বিভাগ থাকতে হবে তা আমি কীভাবে নির্ধারণ করতে পারি

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

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

একটি সাধারণত টি = 0.5 তে বিভক্ত হয়, তবে ডি ক্যাস্তেলজাউয়ের অ্যালগোরিদম যে কোনও বিন্দুতে বিভাজন করতে দেয়, সুতরাং আপনার কাছে যদি Ctr থেকে C_3 এবং C_2 নিয়ন্ত্রণ পয়েন্ট সহ একটি ঘনক Bézier থাকে তবে C_1 এর চেয়ে শেষের পয়েন্টগুলির মধ্যে লাইন বিভাগটি আরও কাছাকাছি থাকলে আপনি দেখতে পাচ্ছেন যে বিভাজক 1/3 বা 2/3 এর মধ্যে একটি আরও কঠোর সীমানা দেয়। আমি বীজগণিতের মধ্য দিয়ে কাজ করি নি যা ভাল হবে তা প্রমাণ করার জন্য, তবে আপনি যদি পরীক্ষা করতে চান এবং রিপোর্ট করতে পারেন যদি আপনি চান। অন্য কিছু না হলে, আমি এটি নির্দেশ করতে চেয়েছিলাম যে বিকল্পটি রয়েছে।


3

প্যারামিট্রাইজড কার্ভের দৈর্ঘ্য গণনা করা স্কয়ারটি ((ডিএক্স / ডিটি) ² + (ডিজি / ডিটি) ²) এর ইন্টিগ্রাল গ্রহণের মাধ্যমে করা যেতে পারে, যেখানে ডিএক্স / ডিটি বক্ররের এক্স-উপাদানটির ডেরিভেটিভ এবং ডাই / dt হ'ল বক্ররেখার y- উপাদানটির ডেরাইভেটিভ। বেজিয়ার-স্প্লাইনের ক্ষেত্রে এই দুটিই সমান, যেহেতু সমীকরণটি কোনও মাত্রায় বাড়ানো যেতে পারে।

কিউবিক বেজিয়ার-স্প্লাইনের সূত্রটি নিম্নলিখিতটি: বি (টি) = (1 - টি) * পি 0 + 3 (1 - টি) *t * পি 1 + 3 (1 - টি) টি * পি 2 + টি³ পি 3 যেখানে পি 0 P3 মাধ্যমে নিয়ন্ত্রণ পয়েন্ট হয়।

ওল্ফ্রাম | আলফা অনুসারে, এই সূত্রটির উত্স: d (B (t)) / dt = 3 (t (t (p3 - P0) + P2 (2 - 3t) + P1 (3t² - 4t + 1))

এখন আপনি এটিকে আবার একটি বক্রাকার দৈর্ঘ্যের সমীকরণে রেখে দিতে পারেন এবং t = 0 থেকে t = 1 থেকে অবিচ্ছেদ্য গণনা করতে পারেন দুর্ভাগ্যক্রমে, ওল্ফ্রাম | যখন আমি এটি করার চেষ্টা করি তখন আলফা বার হয়ে যায়। আপনি তবে সংখ্যার একীকরণ করতে পারেন।

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