আপনি 2 বক্ররেখার নিকটতম বিন্দুটি কীভাবে গণনা করবেন?


15

একটি রেখার বিন্দু এবং একটি চতুষ্কোণ বেজিয়র বক্ররেখা দেওয়া, আপনি কীভাবে তাদের নিকটতম বিন্দু গণনা করবেন? .... একইভাবে, 2 টি বক্ররেখার পয়েন্ট দেওয়া, আপনি কিভাবে নিকটতম পয়েন্ট পাবেন?

এখানে চিত্র বর্ণনা লিখুন


2
আমি বিশ্বাস করি এই প্রশ্নটি একটি ভাল শুরু।
সাম হোচেভার

উত্তর:


3

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

ধারণা নিম্নোক্ত:

  • বাজিয়ার বক্ররেখার নমুনা করুন, সেই নমুনার নিকটতম বিন্দুটি সন্ধান করুন
  • সন্ধানের পয়েন্টটির আশেপাশে একটি প্রতিবেশের নমুনা করুন, একটি নতুন নিকটতম পয়েন্ট সন্ধান করুন
  • বিন্দু আর বেশি পরিবর্তন না হওয়া পর্যন্ত চালিয়ে যান

বেজিয়ার বক্ররেখা থেকে রেখার দূরত্বের জন্য অ্যালগরিদম

বাজিয়ার বক্ররেখা F(t)নিয়ন্ত্রণ পয়েন্ট এবং একটি পৃথক পৃথক পরামিতি ব্যবহার করে একটি ফাংশন দ্বারা প্যারাম্যাট্রিস হয় t। উত্পন্ন পয়েন্টের সংখ্যা গুরুত্বহীন।

লাইনটি দুটি পয়েন্ট দ্বারা প্যারামেট্রিসড হয় Aএবং B

  1. SAMPLES = 10উদাহরণস্বরূপ যাক

  2. t0 = 0এবং দিয়ে শুরু করুনt1 = 1

  3. দিন dt = (t1 - t0) / SAMPLES

  4. যদি dt < 1e-10(বা অন্য কোনও নির্ভুল শর্ত আপনি উপযুক্ত দেখেন), তবে অ্যালগরিদম শেষ হয়ে যায় এবং উত্তরটি হয়F(t0)

  5. SAMPLES + 1বাজিয়ার বক্ররেখার পয়েন্টগুলির একটি তালিকা গণনা করুন:

    • L[0] = F(t0)
    • L[1] = F(t0 + dt)
    • L[2] = F(t0 + 2 * dt)
    • ...
    • L[SAMPLES] = F(t0 + SAMPLES * dt)
  6. Lসূচকের সাথে কোন পয়েন্টটি iরেখার সবচেয়ে কাছাকাছি এটি সন্ধান করুন। আপনার জানা কোনও পয়েন্ট / লাইন দূরত্বের পদ্ধতিটি ব্যবহার করুন , উদাহরণস্বরূপ বর্গক্ষেত্র ||AB^L[i]A||² / ||AB||²যেখানে ^ক্রস পণ্যকে বোঝায় এবং ||…||এটি দূরত্ব distance

  7. যদি i == 0, সেট i = 1; যদি i == SAMPLES, সেটi = SAMPLES - 1

  8. যাক t1 = t0 + (i + 1) * dtএবংt0 = t0 + (i - 1) * dt

  9. ৩ য় ধাপে ফিরে যান।

বাজিয়ার বক্ররেখা থেকে বেজিয়ার বক্ররেখার দূরত্বের জন্য অ্যালগরিদম

এবার আমাদের কাছে দুটি বেজিয়ার বক্ররেখা রয়েছে, F(t)এবং এর মাধ্যমে প্যারামিটারাইসড রয়েছে G(t)

  1. SAMPLES = 10উদাহরণস্বরূপ যাক

  2. দিয়ে শুরু করুন t0 = 0, t1 = 1, s0 = 0এবংs1 = 1

  3. দিন dt = (t1 - t0) / SAMPLES

  4. দিন ds = (s1 - s0) / SAMPLES

  5. যদি dt < 1e-10(বা অন্য কোনও নির্ভুল শর্ত আপনি উপযুক্ত দেখেন), তবে অ্যালগরিদম শেষ হয়ে যায় এবং উত্তরটি হয়F(t0)

  6. যদি এটি লুপের প্রথম রান হয়:

    6.1। SAMPLES + 1পয়েন্টগুলির একটি তালিকা গণনা করুনFউপরের ( উপরে দেখুন )।

    6.2। একটি তালিকা গণনা করুনSAMPLES + 1পয়েন্টগুলির করুন G

    6.3। কোনটি পয়েন্টের একে অপরের নিকটবর্তী তা সন্ধান করুন।

    6.4। আপডেট t0, t1, s0, s1উপরোক্ত আলোচনা থেকে দেখা যায়।

  7. ইএলএসই : বিকল্পভাবে F বা পয়েন্টের উপরে পয়েন্টের একটি তালিকা গণনা করুন G, তারপরে কোন পয়েন্টটি Fসবচেয়ে নিকটে G(s0)এবং আপডেট হবে t0এবং t1, অথবা কোনটি বিন্দুটির Gনিকটতম F(t0)এবং আপডেট s0এবংs1

  8. ৩ য় ধাপে ফিরে যান।

সমস্যা

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

তবে আমি যেমন বলেছি, আরও শক্তিশালী সমাধানগুলি সম্পর্কে আপনি চিন্তাভাবনা শুরু করার আগে, আপনাকে প্রথমে simple সাধারণগুলির সাথে পরীক্ষা করা উচিত।


0

1) সবকিছুকে একটি অক্ষরে অনুবাদ করুন, সুতরাং এক বিন্দুটির দৈর্ঘ্য গণনা করার পরিবর্তে, 'লাইন', 'লাইন', বলুন, ওয়াই-অ্যাক্সিস।

তারপরে, আহ, একটি বেজিয়ার বক্ররেখা দেওয়া আমি বলব এটি নিয়ন্ত্রণ পয়েন্টের সংখ্যা পর্যন্ত।

যদি এখানে তিনটি থাকে, (শুরু, 'নিয়ন্ত্রণ' এবং শেষ) আমি কিছু ধরণের স্ক্যান করতাম (প্রতিটি কয়েক শতাংশ বলুন এবং তারপরে নিকটতমগুলির মধ্যে সংশোধন করান (একটি 'বাইনারি' পদ্ধতির সাথে বলুন))।

আরও দফায় আমি যে দম্পতির (নিকটতম ওয়াই-অ্যাক্সিস অনুবাদ করা হয়েছিল) চেষ্টা করেছিলাম।

আমি নিশ্চিত যে কোনও গণিত-লোক আপনাকে সঠিক সমাধান দিতে পারে (গণিতে) তবে আপনি যদি কোনও ভিডিও গেমের / সমাধান খুঁজে পেতে চান তবে কিছুটা ঠিক সমাধানের সাথে আপনি আরও ভাল হতে পারেন কারণ আসল সমাধানটিতে বেশ কয়েকটি উত্তর থাকতে পারে ( আমি প্রসেসিং পাওয়ার সম্পর্কেও বলছি না)।


পুনশ্চ. 2 টি বক্ররেখা, এটি সম্পর্কে চিন্তাও করবেন না (নিয়ন্ত্রণ পয়েন্টের সংখ্যা অনুযায়ী আপনি কিছু পেতে পারেন (কমপক্ষে যতটা সম্ভব ..))
ভালমন্ড

0

অ্যালগরিদমিস্ট ব্লগ পৃষ্ঠা থেকে কিছু উত্তর , যা প্রদত্ত চতুষ্কোণীয় বেজিয়ার বক্ররেখায় সঠিকভাবে নিকটতম পয়েন্টটি খুঁজে পায়।

ডেমো

এখানে চিত্র বর্ণনা লিখুন


হ্যাঁ, দুর্দান্ত ডেমো উত্তর কোথায়?
আনকো

1
আমি অনুমান করি যে তিনি আমাদের ডেমোটির উত্সটি দেখতে চেয়েছিলেন: অ্যালগোরিদমিসট.এন
ডেগ্রাফা

0

বেজিয়ার বক্ররেখার জন্য - সরল রেখার ক্ষেত্রে, উত্তরটি সন্ধান করার সর্বাধিক সঠিক উপায় হল নিম্নলিখিতটি করা:

  1. সমস্যার রূপান্তর করুন যাতে সোজা লাইন সর্বদা Y = 0 এ অনুভূমিক থাকে। এটি একটি উপযুক্ত অ্যাফাইন ম্যাট্রিক্স দ্বারা সমস্ত নিয়ন্ত্রণ পয়েন্টকে গুণ করে is (আমি ধরে নিচ্ছি যে আপনি 3 টি নির্দিষ্ট এন্ট্রি সহ 3x3 ম্যাট্রিক্সের সাথে প্লেনটির অ্যাফাইন ট্রান্সফর্মেশনগুলি উপস্থাপনের সাথে পরিচিত are)
  2. নিয়ন্ত্রণ পয়েন্টগুলির Y স্থানাঙ্কগুলি পরীক্ষা করুন। যদি তাদের সবার একই চিহ্ন না থাকে তবে লাইনটির সাথে একটি ছেদ হতে পারে। বেজিয়ার কার্ভের Y অংশের শিকড়গুলি গণনা করুন। বহুবর্ষের জন্য আপনি যে কোনও রুট সন্ধানের পদ্ধতি ব্যবহার করতে পারেন, সাহিত্যে সেগুলির প্রচুর পরিমাণ রয়েছে। উদাহরণস্বরূপ, গুগল "উত্তল হুল মার্চিং" - এটি বেজিয়ার রেখাচিত্রগুলিতে ব্যবহৃত বহুপদীগুলির জন্য যুক্তিসঙ্গতভাবে ভাল পদ্ধতি। আপনি যে প্রত্যেকটি রুট খুঁজে পান তা রেখার সাথে ছেদ করার সময় মূল্য, যেখানে দূরত্বটি শূন্য - আপনার কাজ শেষ is
  3. সমস্ত ওয়াই কর্ডের যদি একই চিহ্ন থাকে তবে বেজিয়ার কার্ভের Y অংশের ডেরিভেটিভ গণনা করুন। আপনি পয়েন্টগুলির এক্স স্থানাঙ্কগুলি উপেক্ষা করতে পারেন, যেহেতু এগুলি কোনও পার্থক্য করে না - লক্ষ্য রেখাটি অনুভূমিক। সেই ডেরাইভেটিভের শিকড় সন্ধান করুন। এগুলি সেই সময়ের মান যেখানে রেখার সাথে স্থানীয়ভাবে বক্ররেখা থাকে।
  4. পূর্ববর্তী ধাপে আপনি যে সমস্ত শেকড় খুঁজে পেয়েছেন তার জন্য সুস্পষ্টভাবে বেজিয়ার বক্ররেখার মূল্যায়ন করুন এবং সেই শিকড়টির প্রতিবেদন করুন যা লাইনটি থেকে সবচেয়ে ছোট দূরত্ব দেয়। আপনার শেষ পয়েন্টগুলিও পরীক্ষা করতে হবে - এগুলি কোনও মূলের চেয়ে কম দূরত্ব দিতে পারে।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.