সমস্যাটি তাদের চাক্ষুষ রেজোলিউশনকে বাড়ানোর জন্য আরকে কতটা বাঁকতে হবে তা নির্ধারণ করা।
এখানে একটি সমাধান (সম্ভাব্য অনেকের মধ্যে)। আসুন সমস্ত উত্স থেকে একটি সাধারণ উত্স থেকে উদ্ভূত বিবেচনা করা যাক। আরকরা এখানে সবচেয়ে বেশি ভিড় করে। তাদের সর্বোত্তমভাবে আলাদা করতে, আসুন এটির ব্যবস্থা করুন যাতে তারা সমান-ব্যবধানযুক্ত কোণগুলিতে ছড়িয়ে পড়ে । এটি উত্স থেকে গন্তব্যের দিকে সরলরেখার অংশগুলি আঁকলে এটি একটি সমস্যা, কারণ সাধারণত বিভিন্ন দিকে গন্তব্যগুলির ক্লাস্টার থাকবে। চলমান কোণগুলিকে যথাসম্ভব সমান জায়গায় স্থান দেওয়ার জন্য আরকসকে বাঁকতে আমাদের স্বাধীনতাটি ব্যবহার করুন।
সরলতার জন্য আসুন মানচিত্রে বৃত্তাকার আরাক ব্যবহার করা যাক। বিন্দু y থেকে বিন্দু x পর্যন্ত একটি চাপকে "বাঁক" এর একটি প্রাকৃতিক পরিমাপ হ'ল y এ তার ভারবহন এবং সরাসরি y থেকে x পর্যন্ত বিয়ারিংয়ের মধ্যে পার্থক্য । যেমন একটি চাপ একটি বৃত্তের একটি ক্ষেত্র, যার উপর y এবং x উভয় মিথ্যা থাকে; প্রাথমিক জ্যামিতি দেখায় যে বাঁকানো কোণটি অর্কের অন্তর্ভুক্ত কোণটির অর্ধেক সমান হয় ।
একটি অ্যালগরিদম বর্ণনা করতে আমাদের আরও কিছু স্বরলিপি প্রয়োজন। যাক Y বংশোদ্ভুত বিন্দু হতে (যেমন মানচিত্রে অভিক্ষিপ্ত) এবং দিন x_1 , x_2 , ..., x_n গন্তব্য পয়েন্ট দেখুন। A_i নির্ধারণ থেকে জন্মদান হতে Y করার x_i , আমি = 1, 2, ..., এন ।
প্রাথমিক পদক্ষেপ হিসাবে, ধরে নিন যে বিয়ারিংগুলি (সমস্ত 0 এবং 360 ডিগ্রির মধ্যে রয়েছে) আরোহী ক্রমে রয়েছে: এটির জন্য আমাদের বিয়ারিংগুলি গণনা করা এবং তারপরে সেগুলি বাছাই করা প্রয়োজন; দুটোই সোজা কাজ।
আদর্শভাবে, আমরা কিছু আরম্ভের সাথে তুলনামূলকভাবে আরাকের বিয়ারিংগুলি সমান 360 / এন , 2 * 360 / এন , ইত্যাদি করতে চাই। কাঙ্ক্ষিত বিয়ারিং এবং আসল বিয়ারিংয়ের মধ্যে পার্থক্য তাই সমান i * 360 / n - a_i প্লাস প্রারম্ভিক বিয়ারিং, a0 । বৃহত্তম পার্থক্য হ'ল এই এন পার্থক্যগুলির সর্বাধিক এবং ক্ষুদ্রতম পার্থক্যটি তাদের সর্বনিম্ন। সর্বাধিক এবং ন্যূনতমের মধ্যে অর্ধেক হয়ে a0 সেট করা যাক ; এটি শুরু করা বেয়ারিংয়ের জন্য ভাল প্রার্থী কারণ এটি ঘন হওয়ার সর্বোচ্চ পরিমাণকে হ্রাস করে । ফলস্বরূপ, সংজ্ঞায়িত করুন
b_i = i * 360 / n - a0 - a_i:
এটি ব্যবহারের জন্য নমনীয় ।
Y থেকে x পর্যন্ত একটি বৃত্তাকার চাপটি আঁকতে প্রাথমিক জ্যামিতির বিষয়টি যা 2 বি_আই এর কোণকে বোঝায় তাই আমি বিশদটি এড়িয়ে যাব এবং সরাসরি একটি উদাহরণে যাব। আয়তক্ষেত্রাকার মানচিত্রের মধ্যে 64৪, ১ 16 এবং ৪ টি এলোমেলো পয়েন্টের সমাধানগুলির চিত্র এখানে দেওয়া হয়েছে
আপনি দেখতে পাচ্ছেন, গন্তব্য পয়েন্টের সংখ্যা বাড়ার সাথে সমাধানগুলি আরও ভাল লাগবে । এন = 4 এর সমাধানটি স্পষ্টভাবে দেখায় যে কীভাবে বিয়ারিংগুলি সমানভাবে ব্যবধানযুক্ত, কারণ এই ক্ষেত্রে ব্যবধানটি 360/4 = 90 ডিগ্রির সমান এবং স্পষ্টতই স্পেসিংটি ঠিক অর্জন করা যায়।
এই সমাধানটি নিখুঁত নয়: গ্রাফিকটি উন্নত করার জন্য আপনি সম্ভবত বেশ কয়েকটি আরক সনাক্ত করতে পারেন যা ম্যানুয়ালি টুইট করা যেতে পারে। তবে এটি কোনও ভয়ানক কাজ করবে না এবং এটি একটি দুর্দান্ত শুরু বলে মনে হচ্ছে।
অ্যালগরিদমটি সরল হওয়ার যোগ্যতাও রয়েছে: সবচেয়ে জটিল অংশটি তাদের বিয়ারিংগুলি অনুসারে গন্তব্যগুলি বাছাই করে।
আইনসংগ্রহ
আমি পোস্টজিআইএস জানি না, তবে সম্ভবত উদাহরণগুলি আঁকার জন্য আমি যে কোডটি ব্যবহার করেছি তা পোস্টজিআইএসে (বা অন্য কোনও জিআইএস) এই অ্যালগরিদম বাস্তবায়নের জন্য গাইড হিসাবে কাজ করতে পারে।
নিম্নলিখিতটি সিউডোকোড হিসাবে বিবেচনা করুন (তবে ম্যাথামেটিকা এটি সম্পাদন করবেন :-)। (এই সাইটটি যদি টেক্সকে গণিত, পরিসংখ্যান এবং টিসিএসের মতো সমর্থন করে তবে আমি এটিকে আরও অনেক বেশি পাঠযোগ্য করে তুলতে পারি )) স্বরলিপিটিতে অন্তর্ভুক্ত রয়েছে:
- পরিবর্তনশীল এবং ফাংশনের নামগুলি কেস-সংবেদনশীল।
- [আলফা] একটি ছোট-ছোট গ্রীক চরিত্র। ([পাই] এর যে মূল্য হওয়া উচিত তা আপনার মনে হয়))
- x [[i]] হ'ল একটি অ্যারের x এর উপাদান i (1 থেকে শুরু করে সূচকযুক্ত)।
- f [a, b] টি এবং f এ আর্গুমেন্টে ফাংশন প্রয়োগ করে। 'মিন' এবং 'টেবিল' এর মতো উপযুক্ত ক্ষেত্রে কার্যকারিতা সিস্টেম-সংজ্ঞায়িত; একটি প্রাথমিক লোয়ার কেস লেটারযুক্ত ফাংশন, যেমন 'কোণ' এবং 'অফসেট', ব্যবহারকারী-সংজ্ঞায়িত। মন্তব্যগুলি কোনও অস্পষ্ট সিস্টেমের ফাংশন ব্যাখ্যা করে (যেমন 'আরগ')।
- সারণী [চ [i], {i, 1, n}] অ্যারে তৈরি করে {চ [1], চ [2], ..., চ [এন]}}
- বৃত্ত [o, r, {a, b}] কোণ কোণ থেকে কোণ খ-এ ব্যাসার্ধ r এর ওকে কেন্দ্র করে বৃত্তের একটি চাপ তৈরি করে (উভয়ই পূর্বের দিক থেকে উল্টোদিকে রেডিয়ানে))
- অর্ডার করা [x] x এর বাছাই করা উপাদানগুলির সূচকের একটি অ্যারে প্রদান করে। x [[অর্ডারিং [এক্স]]] হ'ল এক্স এর সাজানো সংস্করণ। X এর সমান দৈর্ঘ্য হলে y, [[ক্রম [x]]] x এর সমান্তরালে y সাজান।
কোডটির সম্পাদনযোগ্য অংশটি করুণার সাথে সংক্ষিপ্ত - 20 টি লাইনের চেয়ে কম - কারণ এর অর্ধেকেরও বেশি হয় হয় ঘোষিত ওভারহেড বা মন্তব্য।
একটি মানচিত্র আঁকুন
z
গন্তব্যগুলির একটি তালিকা এবং এটির y
উত্স।
circleMap[z_List, y_] :=
Module[{\[Alpha] = angles[y,z], \[Beta], \[Delta], n},
(* Sort the destinations by bearing *)
\[Beta] = Ordering[\[Alpha]];
x = z[[\[Beta] ]]; (* Destinations, sorted by bearing from y *)
\[Alpha] = \[Alpha][[\[Beta]]]; (* Bearings, in sorted order *)
\[Delta] = offset[\[Alpha]];
n = Length[\[Alpha]];
Graphics[{(* Draw the lines *)
Gray, Table[circle[y, x[[i]],2 \[Pi] i / n + \[Delta] - \[Alpha][[i]]],
{i, 1, Length[\[Alpha]]}],
(* Draw the destination points *)
Red, PointSize[0.02], Table[Point[u], {u, x}]
}]
]
X -> y বিয়ারিংয়ের সাথে কোণ থেকে শুরু করে x
বিন্দু থেকে বিন্দুতে একটি বৃত্তাকার চাপ তৈরি করুন ।y
\[Beta]
circle[x_, y_, \[Beta]_] /; -\[Pi] < \[Beta] < \[Pi] :=
Module[{v, \[Rho], r, o, \[Theta], sign},
If[\[Beta]==0, Return[Line[{x,y}]]];
(* Obtain the vector from x to y in polar coordinates. *)
v = y - x; (* Vector from x to y *)
\[Rho] = Norm[v]; (* Length of v *)
\[Theta] = Arg[Complex @@ v]; (* Bearing from x to y *)
(* Compute the radius and center of the circle.*)
r = \[Rho] / (2 Sin[\[Beta]]); (* Circle radius, up to sign *)
If[r < 0, sign = \[Pi], sign = 0];
o = (x+y)/2 + (r/\[Rho]) Cos[\[Beta]]{v[[2]], -v[[1]]}; (* Circle center *)
(* Create a sector of the circle. *)
Circle[o, Abs[r], {\[Pi]/2 - \[Beta] + \[Theta] + sign, \[Pi] /2 + \[Beta] + \[Theta] + sign}]
]
উত্স থেকে পয়েন্টের তালিকায় বিয়ারিংগুলি গণনা করুন।
angles[origin_, x_] := Arg[Complex@@(#-origin)] & /@ x;
বিয়ারিংয়ের সেটগুলির অবশিষ্টাংশগুলির মিডরেঞ্জ গণনা করুন।
x
সাজানো ক্রমে বিয়ারিংয়ের একটি তালিকা। আদর্শভাবে, x [[i]] ~ 2 [পাই] আই / এন।
offset[x_List] :=
Module[
{n = Length[x], y},
(* Compute the residuals. *)
y = Table[x[[i]] - 2 \[Pi] i / n, {i, 1, n}];
(* Return their midrange. *)
(Max[y] + Min[y])/2
]