একটি দ্রুত এবং নোংরা উপায়টি পুনরাবৃত্তাকার গোলাকার মহকুমা ব্যবহার করে । পৃথিবীর পৃষ্ঠের ত্রিভুজ্যরণ দিয়ে শুরু করে, প্রতিটি ত্রিভুজকে একটি দীর্ঘদিক থেকে তার দীর্ঘতম প্রান্তের মাঝখানে বিচ্ছিন্নভাবে বিভক্ত করুন। (আদর্শভাবে আপনি ত্রিভুজটি দুটি সমান ব্যাসের অংশ বা সমান-অঞ্চল অংশগুলিতে বিভক্ত করবেন, তবে যেগুলি কিছু স্পষ্টভাবে গণনা জড়িত তাই আমি কেবল দিকগুলি ঠিক অর্ধেকে বিভক্ত করি: এর ফলে বিভিন্ন ত্রিভুজগুলি শেষ পর্যন্ত আকারে কিছুটা পৃথক হয়, তবে যা এই অ্যাপ্লিকেশনটির জন্য গুরুত্বপূর্ণ বলে মনে হচ্ছে না))
অবশ্যই আপনি এই উপ-বিভাগটি একটি ডেটা কাঠামোয় বজায় রাখবেন যা ত্রিভুজটি দ্রুত সনাক্ত করতে দেয় যাতে কোনও নির্বিচারে বিন্দু থাকে। একটি বাইনারি গাছ (পুনরাবৃত্ত কলগুলির উপর ভিত্তি করে) দুর্দান্তভাবে কাজ করে: প্রতিবার ত্রিভুজটি বিভক্ত হয়ে গেলে সেই ত্রিভুজটির নোডে গাছটি বিভক্ত হয়। বিভাজক সমতল সম্পর্কিত ডেটা ধরে রাখা হয়, যাতে আপনি দ্রুত নির্ধারণ করতে পারেন যে কোনও ধরণের বিন্দুটি বিমানের কোন দিকে রয়েছে: এটি নির্ধারণ করবে যে গাছের বামে বা ডানদিকে ভ্রমণ করবে কিনা।
(আমি কি "প্লেন" বিভক্ত করার কথা বলেছি? হ্যাঁ - যদি পৃথিবীর পৃষ্ঠকে একটি গোলক হিসাবে মডেল করে এবং জিওসেন্ট্রিক (x, y, z) স্থানাঙ্ক ব্যবহার করে, তবে আমাদের বেশিরভাগ গণনা তিনটি মাত্রায় হয় যেখানে ত্রিভুজের দিকগুলি টুকরো টুকরো হয় গোলকের ছেদগুলি তার উত্সের মধ্য দিয়ে প্লেনগুলি দিয়ে This এটি গণনাগুলি দ্রুত এবং সহজ করে তোলে)
আমি একটি গোলকের এক অক্ট্যান্টের পদ্ধতিটি দেখিয়ে ব্যাখ্যা করব; অন্য সাতটি অক্ট্যান্ট একই পদ্ধতিতে প্রক্রিয়াজাত করা হয়। এই জাতীয় অক্ট্যান্ট একটি 90-90-90 ত্রিভুজ। আমার গ্রাফিকগুলিতে আমি একই কোণে বিস্তৃত ইউক্লিডিয়ান ত্রিভুজগুলি আঁকব: তারা ছোট না হওয়া পর্যন্ত এগুলি খুব ভাল দেখাচ্ছে না তবে এগুলি সহজে এবং দ্রুত আঁকতে পারে। অক্ট্যান্টের সাথে সম্পর্কিত ইউক্লিডিয়ান ত্রিভুজ এখানে: এটি প্রক্রিয়াটির সূচনা।
যেহেতু সমস্ত পক্ষের সমান দৈর্ঘ্য রয়েছে তাই এলোমেলোভাবে একটিকে "দীর্ঘতম" এবং বিভাগে বিভাজন হিসাবে বেছে নেওয়া হয়েছে:
নতুন ত্রিভুজগুলির প্রত্যেকটির জন্য এটি পুনরাবৃত্তি করুন:
N পদক্ষেপের পরে আমাদের 2 ^ n ত্রিভুজ হবে। 10 টি পদক্ষেপের পরে পরিস্থিতি এখানে রয়েছে, অক্ট্যান্টে 1024 ত্রিভুজ দেখানো হয়েছে (এবং পুরো ক্ষেত্রের মধ্যে 8192):
আরও একটি উদাহরণ হিসাবে, আমি এই অক্ট্যান্টের মধ্যে একটি এলোমেলো পয়েন্ট তৈরি করেছি এবং ত্রিভুজটির দীর্ঘতম দিকটি 0.05 রেডিয়ানের কম না পৌঁছানো পর্যন্ত মহকুমা গাছটি ভ্রমণ করেছি। (কার্তেসিয়ান) ত্রিভুজগুলি প্রব পয়েন্টটি লাল দেখানো হয়েছে।
ঘটনাক্রমে, বিন্দুর অবস্থানটি অক্ষাংশের এক ডিগ্রি (প্রায়) সংকীর্ণ করতে, আপনি খেয়াল করতে পারেন যে এটি প্রায় 1/60 রেডিয়ান এবং সুতরাং প্রায় (1/60) covers 2 / (পাই / 2) = 1/6000 এর কভার মোট পৃষ্ঠ। যেহেতু প্রতিটি মহকুমা প্রায় ত্রিভুজ আকারকে অর্ধেক করে দেয়, তাই অষ্টান্টের প্রায় 13 থেকে 14 টি মহকুমা কৌশলটি সম্পাদন করবে। এটি খুব বেশি গণনা নয় - যেমন আমরা নীচে দেখব - গাছটি একেবারেই না সঞ্চয় করা, তবে উড়তে মহকুমা সঞ্চালনকে দক্ষ করে তোলে। শুরুতে আপনি লক্ষ করবেন যে বিন্দুটি কী অবস্থিত - এটি তার তিনটি স্থানাঙ্কের চিহ্ন দ্বারা নির্ধারিত হয়, যা একটি তিন-অঙ্কের বাইনারি সংখ্যা হিসাবে রেকর্ড করা যায় - এবং প্রতিটি পদক্ষেপে আপনি মনে রাখতে চান যে বিন্দুটি মিথ্যা কিনা ত্রিভুজটির বাম (0) বা ডান (1) এ। এটি অন্য 14-সংখ্যার বাইনারি নম্বর দেয়। আপনি এই কোডগুলি ইচ্ছামত পয়েন্টগুলিতে গ্রুপ করতে ব্যবহার করতে পারেন।
(সাধারণত, দুটি কোড যখন আসল বাইনারি সংখ্যার কাছাকাছি থাকে তবে সংশ্লিষ্ট পয়েন্টগুলি কাছাকাছি থাকে; তবে পয়েন্টগুলি এখনও কাছাকাছি থাকতে পারে এবং উল্লেখযোগ্যভাবে আলাদা কোড থাকতে পারে। উদাহরণস্বরূপ, এক মিটারের ব্যবধানে দুটি পয়েন্ট বিবেচনা করুন: তাদের কোডগুলিও আলাদা হতে হবে) বাইনারি পয়েন্টের আগে, কারণ তারা বিভিন্ন অক্টেন্টে রয়েছে This এই জাতীয় জিনিসটি স্থানের কোনও নির্দিষ্ট বিভাজন নিয়ে অনিবার্য)
আমি এটি প্রয়োগ করতে গণিত 8 টি ব্যবহার করেছি : আপনি আপনার পছন্দসই প্রোগ্রামিং পরিবেশে বাস্তবায়নের জন্য এটি যেমন-তে বা সিউডোকোড হিসাবে নিতে পারেন।
বিমানটি 0-Ab পয়েন্ট পি এর কোন দিকে রয়েছে তা নির্ধারণ করুন:
side[p_, {a_, b_}] := If[Det[{p, a, b}] >= 0, left, right];
পয়েন্ট পি এর উপর ভিত্তি করে ত্রিভুজ এবি কে পরিমার্জন করুন।
refine[p_, {a_, b_, c_}] := Block[{sides, x, y, z, m},
sides = Norm /@ {b - c, c - a, a - b} // N;
{x, y, z} = RotateLeft[{a, b, c}, First[Position[sides, Max[sides]]] - 1];
m = Normalize[Mean[{y, z}]];
If[side[p, {x, m}] === right, {y, m, x}, {x, m, z}]
]
অক্টেন্ট প্রদর্শন করে এবং তার উপরে, বহুভুজের একটি সেট হিসাবে নীচের তালিকাটি উপস্থাপন করে শেষ চিত্রটি অঙ্কিত হয়েছিল:
p = Normalize@RandomReal[NormalDistribution[0, 1], 3] (* Random point *)
{a, b, c} = IdentityMatrix[3] . DiagonalMatrix[Sign[p]] // N (* First octant *)
NestWhileList[refine[p, #] &, {a, b, c}, Norm[#[[1]] - #[[2]]] >= 0.05 &, 1, 16]
NestWhileList
refine
শর্তটি সম্পর্কিত (ত্রিভুজটি বৃহত্তর) বা সর্বাধিক ক্রিয়াকলাপের গণনা না হওয়া অবধি বারবার একটি অপারেশন প্রয়োগ করে ( )।
অক্ট্যান্টের সম্পূর্ণ ত্রিভুজ্যরণটি প্রদর্শনের জন্য, আমি প্রথম অক্ট্যান্ট দিয়ে শুরু করেছি এবং দশবার পরিমার্জনকে পুনরাবৃত্তি করেছি। এটি একটি সামান্য পরিবর্তন দিয়ে শুরু refine
:
split[{a_, b_, c_}] := Module[{sides, x, y, z, m},
sides = Norm /@ {b - c, c - a, a - b} // N;
{x, y, z} = RotateLeft[{a, b, c}, First[Position[sides, Max[sides]]] - 1];
m = Normalize[Mean[{y, z}]];
{{y, m, x}, {x, m, z}}
]
পার্থক্যটি হল যে প্রদত্ত বিন্দুটি মিথ্যা নয় তার পরিবর্তে এর ইনপুট ত্রিভুজটির উভয় অংশই split
ফেরত দেয় । পূর্ণ ত্রিভুজটি এটি পুনরাবৃত্তি করে প্রাপ্ত হয়:
triangles = NestList[Flatten[split /@ #, 1] &, {IdentityMatrix[3] // N}, 10];
পরীক্ষা করতে, আমি প্রতিটি ত্রিভুজ আকারের একটি পরিমাপ গণনা করে পরিসরের দিকে তাকিয়েছি। (এই "আকার" প্রতিটি ত্রিভুজ এবং গোলকের কেন্দ্রের দ্বারা চিহ্নিত পিরামিড-আকৃতির চিত্রের সমানুপাতিক; এর মতো ছোট ত্রিভুজগুলির জন্য, এই আকারটি মূলত তার গোলাকার ক্ষেত্রের সমানুপাতিক)
Through[{Min, Max}[Map[Round[Det[#], 0.00001] &, triangles[[10]] // N, {1}]]]
{0.00523, 0.00739}
সুতরাং মাপগুলি তাদের গড় থেকে প্রায় 25% দ্বারা উপরে বা নীচে পরিবর্তিত হয়: এটি গ্রুপ পয়েন্টগুলির জন্য প্রায় অভিন্ন পথ অর্জনের পক্ষে যুক্তিসঙ্গত বলে মনে হয়।
এই কোডটি স্ক্যান করার সময়, আপনি কোনও ত্রিকোণমিতি লক্ষ্য করবেন না : কেবলমাত্র এটির দরকার পরে গোলাকার এবং কার্তেসিয়ান স্থানাঙ্কের মধ্যে পিছনে পিছনে রূপান্তর করতে হবে। কোডটি পৃথিবীর পৃষ্ঠকে কোনও মানচিত্রে প্রজেক্ট করে না, ফলে পরিবেশনকারীদের বিকৃতি এড়িয়ে চলে। অন্যথায়, এটি সমস্ত কাজ করার জন্য কেবল গড় ( Mean
), পাইথাগোরিয়ান উপপাদক ( Norm
) এবং একটি 3 বাই 3 নির্ধারক ( Det
) ব্যবহার করে। (মত কিছু সহজ তালিকা-ম্যানিপুলেশন কমান্ড হয় RotateLeft
এবং Flatten
, খুব, প্রতিটি ত্রিভুজ দীর্ঘতম পাশ জন্য একটি অনুসন্ধান সহ।)