উত্তর:
এখানে আমার চেষ্টা। নিম্নলিখিত অ্যালগরিদমগুলি নিখুঁত থেকে অনেক দূরে , তবে এগুলি সহজ এবং আমি বিশ্বাস করি আপনার এইটি দিয়ে শুরু করা উচিত, তারা আপনার পরিস্থিতিতে কাজ করে কিনা তা পরীক্ষা করে দেখুন এবং আরও দ্রুত এবং / বা আরও নির্ভুল কিছুতে স্যুইচ করুন।
ধারণা নিম্নোক্ত:
বাজিয়ার বক্ররেখা F(t)
নিয়ন্ত্রণ পয়েন্ট এবং একটি পৃথক পৃথক পরামিতি ব্যবহার করে একটি ফাংশন দ্বারা প্যারাম্যাট্রিস হয় t
। উত্পন্ন পয়েন্টের সংখ্যা গুরুত্বহীন।
লাইনটি দুটি পয়েন্ট দ্বারা প্যারামেট্রিসড হয় A
এবং B
।
SAMPLES = 10
উদাহরণস্বরূপ যাক
t0 = 0
এবং দিয়ে শুরু করুনt1 = 1
দিন dt = (t1 - t0) / SAMPLES
যদি dt < 1e-10
(বা অন্য কোনও নির্ভুল শর্ত আপনি উপযুক্ত দেখেন), তবে অ্যালগরিদম শেষ হয়ে যায় এবং উত্তরটি হয়F(t0)
।
SAMPLES + 1
বাজিয়ার বক্ররেখার পয়েন্টগুলির একটি তালিকা গণনা করুন:
L[0] = F(t0)
L[1] = F(t0 + dt)
L[2] = F(t0 + 2 * dt)
L[SAMPLES] = F(t0 + SAMPLES * dt)
L
সূচকের সাথে কোন পয়েন্টটি i
রেখার সবচেয়ে কাছাকাছি এটি সন্ধান করুন। আপনার জানা কোনও পয়েন্ট / লাইন দূরত্বের পদ্ধতিটি ব্যবহার করুন , উদাহরণস্বরূপ বর্গক্ষেত্র ||AB^L[i]A||² / ||AB||²
যেখানে ^
ক্রস পণ্যকে বোঝায় এবং ||…||
এটি দূরত্ব distance
যদি i == 0
, সেট i = 1
; যদি i == SAMPLES
, সেটi = SAMPLES - 1
যাক t1 = t0 + (i + 1) * dt
এবংt0 = t0 + (i - 1) * dt
৩ য় ধাপে ফিরে যান।
এবার আমাদের কাছে দুটি বেজিয়ার বক্ররেখা রয়েছে, F(t)
এবং এর মাধ্যমে প্যারামিটারাইসড রয়েছে G(t)
।
SAMPLES = 10
উদাহরণস্বরূপ যাক
দিয়ে শুরু করুন t0 = 0
, t1 = 1
, s0 = 0
এবংs1 = 1
দিন dt = (t1 - t0) / SAMPLES
দিন ds = (s1 - s0) / SAMPLES
যদি dt < 1e-10
(বা অন্য কোনও নির্ভুল শর্ত আপনি উপযুক্ত দেখেন), তবে অ্যালগরিদম শেষ হয়ে যায় এবং উত্তরটি হয়F(t0)
।
যদি এটি লুপের প্রথম রান হয়:
6.1। SAMPLES + 1
পয়েন্টগুলির একটি তালিকা গণনা করুনF
উপরের ( উপরে দেখুন )।
6.2। একটি তালিকা গণনা করুনSAMPLES + 1
পয়েন্টগুলির করুন G
।
6.3। কোনটি পয়েন্টের একে অপরের নিকটবর্তী তা সন্ধান করুন।
6.4। আপডেট t0
, t1
, s0
, s1
উপরোক্ত আলোচনা থেকে দেখা যায়।
ইএলএসই : বিকল্পভাবে F
বা পয়েন্টের উপরে পয়েন্টের একটি তালিকা গণনা করুন G
, তারপরে কোন পয়েন্টটি F
সবচেয়ে নিকটে G(s0)
এবং আপডেট হবে t0
এবং t1
, অথবা কোনটি বিন্দুটির G
নিকটতম F(t0)
এবং আপডেট s0
এবংs1
।
৩ য় ধাপে ফিরে যান।
ডিজাইন অনুসারে, এই অ্যালগরিদমগুলি সর্বদা স্থানীয় সর্বনিম্নে রূপান্তরিত হয়। যাইহোক, কোনও গ্যারান্টি নেই যে তারা সর্বোত্তম সমাধানে রূপান্তর করবে। বিশেষত, বেজিয়ার কার্ভ অ্যালগরিদম মোটেই খুব ভাল নয় এবং দুটি স্থানে অনেকগুলি স্থানে একে অপরের কাছাকাছি থাকার ক্ষেত্রে আপনি দুর্ভাগ্যক্রমে দীর্ঘ শটটি দিয়ে সমাধানটি মিস করতে পারেন।
তবে আমি যেমন বলেছি, আরও শক্তিশালী সমাধানগুলি সম্পর্কে আপনি চিন্তাভাবনা শুরু করার আগে, আপনাকে প্রথমে simple সাধারণগুলির সাথে পরীক্ষা করা উচিত।
1) সবকিছুকে একটি অক্ষরে অনুবাদ করুন, সুতরাং এক বিন্দুটির দৈর্ঘ্য গণনা করার পরিবর্তে, 'লাইন', 'লাইন', বলুন, ওয়াই-অ্যাক্সিস।
তারপরে, আহ, একটি বেজিয়ার বক্ররেখা দেওয়া আমি বলব এটি নিয়ন্ত্রণ পয়েন্টের সংখ্যা পর্যন্ত।
যদি এখানে তিনটি থাকে, (শুরু, 'নিয়ন্ত্রণ' এবং শেষ) আমি কিছু ধরণের স্ক্যান করতাম (প্রতিটি কয়েক শতাংশ বলুন এবং তারপরে নিকটতমগুলির মধ্যে সংশোধন করান (একটি 'বাইনারি' পদ্ধতির সাথে বলুন))।
আরও দফায় আমি যে দম্পতির (নিকটতম ওয়াই-অ্যাক্সিস অনুবাদ করা হয়েছিল) চেষ্টা করেছিলাম।
আমি নিশ্চিত যে কোনও গণিত-লোক আপনাকে সঠিক সমাধান দিতে পারে (গণিতে) তবে আপনি যদি কোনও ভিডিও গেমের / সমাধান খুঁজে পেতে চান তবে কিছুটা ঠিক সমাধানের সাথে আপনি আরও ভাল হতে পারেন কারণ আসল সমাধানটিতে বেশ কয়েকটি উত্তর থাকতে পারে ( আমি প্রসেসিং পাওয়ার সম্পর্কেও বলছি না)।
অ্যালগরিদমিস্ট ব্লগ পৃষ্ঠা থেকে কিছু উত্তর , যা প্রদত্ত চতুষ্কোণীয় বেজিয়ার বক্ররেখায় সঠিকভাবে নিকটতম পয়েন্টটি খুঁজে পায়।
ডেমো ।
বেজিয়ার বক্ররেখার জন্য - সরল রেখার ক্ষেত্রে, উত্তরটি সন্ধান করার সর্বাধিক সঠিক উপায় হল নিম্নলিখিতটি করা: