একটি ত্রিভুজটির গোলাকার অতিরিক্ত


15

একটি ত্রিভুজটির গোলাকার অতিরিক্ত

যেমনটি আমরা সবাই জানি যে কোনও প্ল্যানার ত্রিভুজের কোণগুলির সমষ্টি 180 ডিগ্রির সমান।

তবে একটি গোলাকার ত্রিভুজটির জন্য, কোণগুলির যোগফল সর্বদা 180 ডিগ্রির চেয়ে বেশি থাকে is গোলাকার ত্রিভুজ কোণ এবং 180 ডিগ্রির যোগফলের মধ্যে পার্থক্যকে গোলকের অতিরিক্ত বলে । কাজটি হ'ল প্রদত্ত প্রান্তিক স্থানাঙ্কের সাথে একটি ত্রিভুজের গোলকীয় অতিরিক্তকে গণনা করা।

কিছু পটভূমি

গোলাকৃতির ত্রিভুজটি গোলকের একটি অংশ যা গোলকের তিনটি দুর্দান্ত চেনাশোনা দ্বারা সংজ্ঞায়িত করা হয়।

গোলাকার ত্রিভুজের উভয় দিক এবং কোণগুলি পরিমাপের পরিমাপের পরিমাপে পরিমাপ করা হয়, কারণ প্রতিটি দিকটি গোলকের একটি ছেদ হিসাবে এবং গোলকের কেন্দ্রে ভার্টেক্স সহ কিছু প্ল্যানার কোণ হিসাবে বিবেচনা করা যেতে পারে:

গোলাকার ত্রিভুজ ব্যাখ্যা করা হয়েছে

প্রতিটি তিনটি পৃথক দুর্দান্ত চেনাশোনা 8 টি ত্রিভুজকে সংজ্ঞায়িত করে তবে আমরা কেবল যথাযথ ত্রিভুজকে বিবেচনায় নিই , অর্থাৎ। ত্রিভুজ যার কোণ এবং পাশের পদক্ষেপগুলি সন্তুষ্ট করে

0 <ক, খ, সি, এ, বি, সি <\ পাই

ভৌগলিক স্থানাঙ্ক ব্যবস্থার ক্ষেত্রে এটি একটি ত্রিভুজের কোণকে সংজ্ঞায়িত করা সুবিধাজনক। গোলকের একটি খিলানের দৈর্ঘ্য এবং দ্রাঘিমাংশকে প্রদত্ত প্রান্তটি গণনা করতে আমরা সূত্র ব্যবহার করতে পারি:

d = 2 আর cs আরকসিন \ বাম (\ স্কয়ার্ট {\ অপেরাটর্নাম {হাভারসিন} (\ ফাই_2 - \ ফাই_1) + \ কোস (\ ফাই_1) \ কোস (\ ফাই_2) \ অপেরাটর্নাম {হ্যারসিন} (\ ল্যাম্বদা_2- mb ল্যাম্বদা_1) \ ডান)

, কোথায়

\ Operatorname {haversin} (\ থেটা) = \ পাপ ^ 2 \ left (অর্থাত \ frac {\ থেটা} {2} \ অধিকার) = অর্থাত \ frac {1- \ কোসাইন্ (\ থেটা)} {2}

বা আরও স্পষ্টত:

d = 2 r \ arcsin \ বাম (\ sqrt {\ পাপ ^ 2 \ বাম (\ frac {\ phi_2 - \ phi_1} {2} \ ডান) + \ কোস (i phi_1) \ কোস (\ phi_2) \ পাপ ^ 2 \ বাম (\ frac {\ ল্যাম্বদা_2 - mb ল্যাম্বদা_1} {2} \ ডান)} \ ডান)

(উত্স: https://en.wikedia.org/wiki/Haversine_forula )

গোলাকৃতির ত্রিভুজটি সমাধান করতে দুটি মূল সূত্রগুলি হ'ল:

  • কোসাইনের আইন:

\ কোস এ = \ কোস বি \ কোস সি + \ পাপ বি \ পাপ সি \ কোস এ, \ কোস বি = \ কোস সি \ কোস এ + \ পাপ সি \ পাপ আ \ কোস বি, \ কোস সি = \ কোস এ \ কাস্ট বি + \ পাপ এ \ পাপ বি \ কোস সি

  • সাইনস আইন:

rac frac {\ পাপ এ} {\ পাপ আ} = \ frac {\ পাপ বি} {\ পাপ বি} = \ ফ্র্যাক {\ পাপ সি} {\ পাপ সি

(উত্স: https://en.wikedia.org/wiki/Saptical_trigonometry#Cosine_rules_and_sine_rules )

তিনটি দিক দেওয়া, কোসাইন বিধি ব্যবহার করে কোণগুলি গণনা করা সহজ:

এ = \ আরকোস \ ফ্র্যাক {\ কোস এ - \ কোস বি \ কোস সি} {\ পাপ বি \ পাপ সি}, বি = \ আরসিপোস \ ফ্র্যাক {\ কোস বি - \ কোস সি \ কোস আ} {\ পাপ সি \ sin a}, C = \ arccos \ frac {\ cos c - \ cos a \ cos b} {\ পাপ a \ পাপ বি

অবশেষে, একটি ত্রিভুজটির গোলাকৃতির অতিরিক্ত সংজ্ঞা দেওয়া হয়:

E = A + B + C - \ পাই

একটি ত্রিভুজটির গোলাকার অতিরিক্ত এবং এর ক্ষেত্রের মধ্যে সম্পর্ক সম্পর্কে আকর্ষণীয় কী:

এস = ই \ সিডট আর ^ 2

সুতরাং একক গোলকের ক্ষেত্রে ত্রিভুজের আধিক্যটি ত্রিভুজের ক্ষেত্রফলের সমান!

কাজটি

একটি ক্রিয়াকলাপ বা একটি প্রোগ্রাম লিখুন যা ত্রিভুজটির সূক্ষ্ম স্থানাঙ্কের সাহায্যে ডিগ্রিগুলিতে একটি ত্রিভুজটির গোলাকৃতির অতিরিক্ত গণনা করবে। শীর্ষস্থানীয় স্থানাঙ্কগুলি ভৌগলিক স্থানাঙ্ক ব্যবস্থার ক্ষেত্রে সরবরাহ করা হয়।

প্রতিটি শীর্ষবিন্দু আকারে পাস করা উচিত [latitude in degrees][N|S][longitude in degrees][E|W]। অক্ষাংশ 90 অর্থাৎ যখন দ্রাঘিমাংশ এবং Eবা Wএড়ানো যায় 90N, 90S, 10N100E, 30S20Wসঠিক প্রান্তবিন্দু বিবরণ, সময় হয় 80Nবা 55Sহয় না।

অক্ষাংশ এবং দ্রাঘিমাংশ সর্বদা পরীক্ষার ক্ষেত্রে পূর্ণসংখ্যার হয়।

এক ডিগ্রীর কম ত্রুটিযুক্ত উত্তরগুলি গ্রহণ করা হবে (নীচের উদাহরণ হিসাবে)। ফলটি আপনার সুবিধার্থে তাই প্রকৃত বা পূর্ণসংখ্যা উভয় হিসাবেই রেন্ডার করা যেতে পারে।

উদাহরণ

ইনপুট

90N0E
0N0E
0N90E

আউটপুট

89.999989

ইনপুট

90N
0N0E
0N90E

আউটপুট

89.999989

ইনপুট

0N0E
0N179E
90N0E

আউটপুট

178.998863

ইনপুট

10N10E
70N20W  
70N40E

আউটপুট

11.969793

সমস্ত পরীক্ষার ক্ষেত্রে দ্রাঘিমাংশ এবং অক্ষাংশ হল পূর্ণসংখ্যা সংখ্যা। প্রান্তবিন্দু স্থানাঙ্ক পার্স করে কাজের অংশ তাই একটি প্রান্তবিন্দু একক পংক্তি / আক্ষরিক হিসাবে পাস করা আবশ্যক, এটি পাস করার অনুমতি দেওয়া না 80N20Eচার পরামিতি / স্ট্রিং হিসাবে: 80, N, 20, E

এটির গ্যারান্টিটি দেওয়া হয় যে শীর্ষবিন্দুগুলি সমস্ত স্বতন্ত্র এবং তিনটি উভয়ের উভয়ের দুটিই একটি অ্যান্টিপোডাল পয়েন্টের জুড়ি তৈরি করে না।

স্কোরিং

এটি , তাই সংক্ষিপ্ততম কোডটি জয়ী।


1
প্রথম কয়েকটি পরীক্ষার ক্ষেত্রে সঠিক ফলাফলগুলি 90 ডিগ্রি এবং 179 ডিগ্রি। আমি পেয়েছি যে আপনি বলছেন যে তাদের স্পট করা উচিত নয়, তবে কত দশমিক নির্ভুলতার জন্য প্রয়োজনীয়?
স্তরের নদী সেন্ট

@ স্টিভভারিল কাজটি আপডেট করেছেন এক ডিগ্রির যথার্থতা যথেষ্ট।
pawel.boczarski

@ পাওয়েল.বোকসার্কি কি অক্ষাংশ / দ্রাঘিমাংশ সবসময়ই পূর্ণসংখ্যার হয়?
flawr

@ ফ্লোয়ার হ্যাঁ, আমি কাজটি আপডেট করেছি।
pawel.boczarski

উত্তর:


4

মতলব, 288 266 বাইট

এখানে মন্তব্য করা সংস্করণ যা চলছে তা ব্যাখ্যা করা উচিত:

                                  %parsing the input
for k=1:3;
    s=input('','s');              %request input
    if sum(s>57)<2;               %if we have only one letter, add arbitrary second coordinate
        s=[s,'0E'];
    end;
    S=1-2*(s(s>57)>80);           %calculate the sign of the coordinates
    s(s>57)=44;                   %replace letters with comma
    L(k,:)=eval(['[',s,']']).*S;  %evaluates string as list and multiply with signs
end;
i=[2,3,1];
                                  %calculate the angular distance between each pair of points
a=arrayfun(@distance,L(:,1),L(:,2),L(i,1),L(i,2))*pi/180;
                                  %evaluate the spherical excess
f=@(a,b,c)sum(acos((cos(a)-cos(b).*cos(c))./(sin(b).*sin(c))))-pi;
disp(f(a,a(i),a([3,1,2]))*180/pi)

সম্পূর্ণ গল্ফযুক্ত (লাইন ব্রেকগুলি সরানো যেতে পারে):

for k=1:3;s=input('','s');if sum(s>57)<2;s=[s,'0E'];end;
s(s>57)=44;L(k,:)=eval([91,s,93]).*(1-2*(s(s<48)>80));end;
i=[2,3,1];p=pi/180;a=arrayfun(@distance,L(:,1),L(:,2),L(i,1),L(i,2))*p;
b=a(i);disp((sum(acos((cos(a([3,1,2]))-cos(b).*cos(a))./(sin(b).*sin(a))))-pi)/p)

3

রুবি, রেভ 3 264 255 বাইট

প্রধান পরিবর্তন:

নতুন ধ্রুবক r= 180 / পিআই নির্ধারিত এবং পুরো ফাংশন জুড়ে ব্যবহৃত। e+ পিআইতে সূচনা করতে হয়েছিল, সুতরাং অতিরিক্ত এখন নিচের দিকে গণনা করা হয় এবং ফিরে আসার আগে তা উপেক্ষিত হয়।

t[] নির্মূল: রুবি নির্দিষ্ট করা ডেটা মঞ্জুরি দেয় t[] সরাসরি বরাদ্দ করার অনুমতি দেয়u,v,w.

iদু'জনের কাজ করার জন্য একক লুপ, ?:টের্নারি অপারেটর টাস্কের মধ্যে স্যুইচ করে।

অন্যান্য অনেক ছোটখাটো পরিবর্তন।

include Math
->s{r=180/e=PI
x=y=z=n=[]
9.times{|i|i<6?(u,v,w=eval(?[+s[i%3].gsub(/[NE]/,"/r,").gsub(/[SW]/,"/-r,")+"0]")
i%2<1&&x=y=z=1
n[i/2]=(z*=sin(u))+(y*=cos(v)*w=cos(u))+x*=w*sin(v)):e-=acos((n[i-7]-(c=n[i-6])*d=n[i-8])/sqrt((1-c*c)*(1-d*d)))}
-e*r}

রুবি, রেভ 1 283 277 বাইট

3 টি স্ট্রিংয়ের একটি অ্যারের প্রয়োজন।

include Math 
->s{x=y=z=n=[]
6.times{|i|t=eval(?[+s[i%3].gsub(/[NE]/,k="*PI/180,").gsub(/[SW]/,"*-1"+k)+"0]")
i%2<1&&x=y=z=1
n[i/2]=(z*=sin(u=t[0]))+(y*=cos(u)*cos(v=t[1]))+(x*=cos(u)*sin(v))}
e=-PI
3.times{|i|e+=acos((n[i-1]-n[i]*d=n[i-2])/sqrt((1-n[i]**2)*(1-d**2)))}
e/PI*180}

সংক্ষিপ্ত বিবরণ

ইউনিট গোলকের ত্রিভুজ দিকগুলির দৈর্ঘ্য দুটি পয়েন্ট বর্ণনকারী ভেক্টরগুলির মধ্যে কোণগুলির সমান। তবে আমাদের সেই কোণটি জানা দরকার নেই। কোণটির কোসাইন জানতে এটি যথেষ্ট, যা ডট পণ্য ব্যবহার করে কার্টেসিয়ান স্থানাঙ্ক থেকে সহজেই পাওয়া যায়।

ব্যাখ্যা

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

Example:  70N20W --> [70*PI/180,20*-1*PI/180,0]

ডট পণ্য ফর্ম হয় a.b=ax*bx+ay*by+az*bz। যেহেতু ভেক্টরগুলি সমস্ত ইউনিটের দৈর্ঘ্য, তাই বিন্দুর পণ্যটি ভেক্টরগুলির মধ্যে কোণটির কোসাইন সমান।

তাদের গণনা করার জন্য একটি লুপটি ইনপুট ডেটা দিয়ে দ্বিগুণ হয়ে 6 বার পুনরাবৃত্তি করা হয়। এমনকি পুনরাবৃত্তিতে 0,2,4 পরিবর্তনগুলি x,y,zএকটি নতুন গণনা শুরু করতে 1 তে সেট করা হয়। প্রতিটি পুনরাবৃত্তির উপর এই ভেরিয়েবলগুলি প্রতিটি ভেক্টরের x, y এবং z উপাদান দ্বারা সঞ্চিত দ্রাঘিমাংশ এবং অক্ষাংশের ডেটা t[0],t[1](যা গল্ফের কারণেও নির্ধারিত হয় u,v) ব্যবহার করে গুন করা হয় । ভেরিয়েবলের যোগফল অ্যারেতে লেখা হয় n(এমনকি পুনরাবৃত্তির উপর আবর্জনার মানগুলি বিজোড় পুনরাবৃত্তির উপর সঠিক মান দ্বারা ওভাররাইট করা হয়) যাতে শেষে n3 টি ডট পণ্য থাকে [a.b, c.a, b.c]

কোসাইন নিয়মের জন্য, আমাদের তিনটি অন্তর্ভুক্ত কোণগুলির কোসাইনগুলির প্রয়োজন, তবে আমাদের সাইনগুলিও দরকার। এগুলি হিসাবে প্রাপ্ত হয় sqrt(1-cosine**2)। যেহেতু সাইনগুলি একসাথে বহুগুণ হয় তাই এক্সপ্রেশনটি পুনরায় সাজানো যায় যাতে কেবল একটি কল করার sqrtপ্রয়োজন হয়। সাইনটি ইতিবাচক বা নেতিবাচক ছিল কিনা তা আমরা জানি না, কারণ হ্যাড়সাইন সূত্রটি সর্বদা যাইহোক ইতিবাচক সাইন দেয়। গুরুত্বপূর্ণ শারীরিক পরিমাণ হ'ল পয়েন্টগুলির মধ্যে দূরত্ব যা পরম এবং তাই সর্বদা ধনাত্মক।

প্রতিটি পুনরাবৃত্তির জন্য i=0..2, আমরা i-1অন্যান্য উপাদানগুলি iএবং ব্যবহার করে কোণ বিপরীত অ্যারে উপাদানটির জন্য মান গণনা করি i-2। এর মতো নেতিবাচক অ্যারে সাবস্ক্রিপ্টগুলি রুবিতে বৈধ, তারা কেবল অ্যারের শুরুতে প্রায় গুটিয়ে রাখে।

পরীক্ষা প্রোগ্রামে অসম্পূর্ণ

তাদের মধ্যে ফাঁক দিয়ে একই লাইনে তিনটি স্থানাঙ্কের প্রয়োজন।

include Math
g=->s{
  n=[]         #array for dot products
  x=y=z=1      #it's required to use these variables once before the loop, for some bizarre reason
  6.times{|i|
    t=eval(?[+s[i%3].gsub(/[NE]/,k="*PI/180,").gsub(/[SW]/,"*-1"+k)+"0]")
    i%2<1&&x=y=z=1
    n[i/2]=(z*=sin(u=t[0]))+(y*=cos(u)*cos(v=t[1]))+(x*=cos(u)*sin(v))
  }

  e=-PI        #set e to -PI and begin accumulating angles
  3.times{|i|
    e+=acos((n[i-1]-n[i]*n[i-2])/sqrt((1-n[i]**2)*(1-n[i-2]**2)))
  }

e/PI*180}      #return value

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