সঠিক দ্রাঘিমাংশের গণনা করা শেষ হলে | 180 |?


11

ল্যাট-এলএনজি মানগুলি সংশোধন করার জন্য আমি একটি "সূত্র" বিকাশের চেষ্টা করছি।

আমি ভ্যু-লিফলেট ব্যবহার করছি তবে আপনি যখন "প্রথম" বিশ্বের বাইরে প্যান করেন তখন আপনি বড় সংখ্যা পান। +180 এর বেশি বা -180 এর কম।

উদাহরণস্বরূপ: আমি যখন আমেরিকা ডানদিকে (পূর্ব দিকের দিকে) যাই, তখন আমি 215 এলজি হিসাবে পাই my মনে মনে, আমি এটি দিয়ে ঠিক করব 215-360=-145

আমি যখন পূর্ব রাশিয়া বামে (পশ্চিম দিকের দিকে) প্যান করি এবং উদাহরণস্বরূপ পাই -২২২ তেমনটি হয়। এখন আমার হিসাব করা দরকার-222+360=138

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

সঠিক দ্রাঘিমাংশ গণনা করা সম্ভব? (এবং আরেকটি প্রয়োজনীয়তা হ'ল যখন ব্যবহারকারী প্রথম বিশ্বে থাকে, 24 লিঙ্গ এখনও 24 লিঙ্গ হওয়া উচিত।

উত্তর:


16

এটি আপনার -180 - 180 এর মধ্যে না আসা পর্যন্ত আপনার মানকে বারবার (বা বিয়োগ) যুক্ত করতে হবে So তাই সাধারণত এক জোড়া লুপের মতো:

lon = -187;
while(lon < -180){
  lon +=360;
}
while (lon > 180){
  lon -= 360;
}

রাউন্ড ভুল পথে লক্ষণ? প্রথম ক্ষেত্রে দীর্ঘ + = 360 হওয়া উচিত।
জিমটি

4
আপনি এটি কেবল একটি লুপ দিয়ে করতে পারেন while (Math.abs(lon) > 180) { lon -= Math.sign(lon) * 360 }আমি এটি উত্তর হিসাবে সরবরাহ করছি না যদিও আপনার সংস্করণটি মূলত ব্যাখ্যার সাথে মেলে, তবে আমার সংস্করণটি কেবলমাত্র একটি অপ্টিমাইজেশন যা সম্ভবত কোনও তাত্পর্য তৈরি করে না। আমি এটিকে কেবল একটি অনুস্মারক হিসাবে মন্তব্য হিসাবে রাখি যে জিনিসগুলি একাধিক উপায়ে করা যায়, অন্যের চেয়ে কিছু বেশি অনুকূলিত।
আন্দ্রেই

2
আমি মনে করি না যে আমি কখনই এটি ব্যবহার করব যেহেতু এটি লুপ প্রতি 2 ফাংশন কল ব্যবহার করে এবং আমার লুপগুলির মধ্যে কেবল একবার কার্যকর করতে পারে। সম্ভবত এই উদাহরণে কোনও পার্থক্য নেই তবে এটি আমার কুসংস্কার
ইয়ান টার্টন

যখন তারা ফাংশনগুলির মতো দেখায়, জাভাস্ক্রিপ্টে ম্যাথ ফাংশনগুলি ভার্বোজ চিহ্ন সহ অপারেটরগুলির মতো আরও দেখা উচিত। এই অর্থে আমরা + - এবং এমনকি <ফাংশন হিসাবেও দেখতে পারি। সম্পাদনা করুন: আমার এখানে একটি সমাধান ছিল যা এটি আসলে কাজ করে না
আন্দ্রেই

2
আপনি করতে পারবেন না lon %= 180?
মনিকা এর মামলা মামলা 20'18

15

শর্তসাল এবং ফাংশন কলগুলি এড়ানো এমন একটি উত্তর:

longitude = (longitude % 360 + 540) % 360 - 180

আমি https://jsperf.com/longitude-normalisation- এ একটি দ্রুত মাইক্রোব্যাঙ্কমার্ক লিখেছি এবং শর্তযুক্ত কোডটি ইনপুট মানগুলির 'যুক্তিসঙ্গত' ব্যাপ্তির জন্য দ্রুত (আমার মেশিনে ক্রোমে) মনে হচ্ছে। সাধারণভাবে আপনি সম্ভবত এইরকম ছোট গণনায় পারফরম্যান্স নিয়ে আগাম চিন্তিত হওয়া উচিত নয়, আপনার বাকী কোডবেসের সাথে পাঠযোগ্যতা এবং ধারাবাহিকতার জন্য আরও বেশি ওজন দেওয়া উচিত।

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


1
মজাদার. আসুন একটি এফপি বিভাজনের বিরুদ্ধে শর্তসাপেক্ষ জ্যাম্প রেস করি। হুঁ আমি অবাক।
জোশুয়া

1
@ জোশুয়া আপনি শর্তযুক্ত জাম্প ব্যবহার করতে পারবেন না। আপনাকে একাধিক শর্তসাপেক্ষ জাম্প , ওরফে একটি লুপ ব্যবহার করতে হবে । (প্লাস লুপটিতে অতিরিক্ত ভাসমান পয়েন্ট রয়েছে যা নিখরচায় নয়)) লুপের কতটি পুনরাবৃত্তি প্রয়োজন তা ইনপুটটির উপর নির্ভর করে। পারফরম্যান্সটি দেখার জন্য আপনাকে ডেটা সম্পর্কে কিছু জানতে হবে। যদি বিস্তৃত সংখ্যা কাঙ্ক্ষিত ব্যাপ্তির কাছাকাছি থাকে এবং কয়েকটি পুনরাবৃত্তির প্রয়োজন হয় তবে অবশ্যই, সংযোজন লুপটি দ্রুত হতে পারে তবে এটি আপনার বিদ্রূপের পরামর্শ অনুসারে সুস্পষ্ট নয়।
jpmc26

1
@ jpmc26: এক্ষেত্রে একাধিকবার লুপের আশেপাশে যাওয়ার আশা করা নির্বোধ।
জোশুয়া

1
কোনও বিদ্রূপ ছিল না। আমি আসলে জানি না যে এটি কীভাবে পড়বে।
জোশুয়া

1
@ জোশুয়া হাঁ, আমিও নিশ্চিত ছিলাম না :)। আমি পারফরম্যান্সের উত্তরে আরও যুক্ত করেছি (এবং লুপ কোডের একটি সম্ভাব্য ব্যর্থতার ক্ষেত্রে)
জো লি-ময়েট

5

এক রৈখিক:

normalized = remainder(longitude, 360);

ব্যাখ্যা: আপনি সম্পূর্ণ রোটেশন (360 °) উপেক্ষা করার পরে কী কী থাকবে তা জানতে চান।

এই প্রক্রিয়াটিকে নরমালাইজিং বলা হয়।

উদাহরণ (cpp.sh)


1
এর ফলে শ্যাড্রিক্স অনুরোধ হিসাবে [-180, 180] না করে [0, 360) মানের ফলাফল পাবে না?
দ্য

@ দ্য গুয়ুইথহ্যাট এই উদাহরণটি দেখুন: সিপিপি.শ
ভিত্তিক

আহ, জানতেন না এটি সি ++। জাভাস্ক্রিপ্টের শ্যাড্রিক্সের প্রসঙ্গে, আমি remainderহিসাবে ব্যাখ্যা করেছি modulus। জেএসের মডিউলাসের ফলাফল [0, 360)।
দ্য

1
আমি মনে করি না যে এটি কাজ করবে। আপনার জাফাস্ক্রিপ্টের সাহায্যে 180 টি বিয়োগ করতে হবে। আর একটি সমস্যা যা আমি জাভাস্ক্রিপ্টের সাথে বুঝতে পেরেছি তা হল যে মডুলো 0 টি জুড়ে প্রতিসম, যেমন -1 % 3-1, এটি এখানে কাজ করার জন্য প্রয়োজনীয় 2 নয়। remainderএকটি দুর্দান্ত সি ++ সমাধান, তবে দুর্ভাগ্যক্রমে জেএসে কেবল কোনও ফাংশন / অপারেটর নেই যা দরকারী হিসাবে যথেষ্ট similar
দ্য হাট

0

আর একটি বিকল্প: দ্রাঘিমাংশ = atan2 (কোস (দীর্ঘ), পাপ (দীর্ঘ))


1
এটি একটি ভাল ধারণা বলে মনে হচ্ছে না। এটি বোঝা খুব কঠিন, গুণগত ব্যয়বহুল এবং সম্ভাব্য গোলাকৃতি ত্রুটির সাপেক্ষে।
ডেভিড রিচার্বি

0

আপনি যে প্রোগ্রামিং ল্যাঙ্গুয়েজটি ব্যবহার করছেন তা যদি ভাসমান পয়েন্ট সংখ্যাগুলিতে (পাইথন এবং রুবির মতো)% (মোড) অপারেটরটিকে সমর্থন করে তবে আমি এটি ব্যবহারের পরামর্শ দেব। অন্যথায়, কিছু অন্যান্য ভাষা (যেমন সি এবং সি ++) আপনাকে fmod () ব্যবহার করার অনুমতি দেয়।

(আপনি যে কোনও মোড অপারেটর ব্যবহার করুন না কেন, সময়ের আগে নিশ্চিত করে নিন যে এটি ভাসমান-পয়েন্ট সংখ্যাগুলিতে মোড অপারেশন করবে এবং এটি সর্বদা আপনাকে অ-নেতিবাচক জবাব দেবে Otherwise নইলে আপনি পরে একটি অদ্ভুত চমক পেয়ে যাবেন যখন আপনার অনেকগুলি ল্যাট / দীর্ঘ পয়েন্টগুলি সঠিক নয়))

এটি এর মতো ব্যবহার করুন:

# Put the longitude in the range of [0,360):
longitude %= 360

# Put the longitude in the range of [-180,180):
if longitude >= 180:
    longitude -= 360

যদি আপনি এটি সমস্ত লাইনেই করতে পছন্দ করেন:

# Put the longitude in the range of [-180,180):
longitude = (longitude + 180) % 360 - 180

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

সম্পাদনা:

হুমম ... আমি কেবল লক্ষ্য করেছি যে জাভাস্ক্রিপ্টটি %নেতিবাচক মানগুলির সাথে হ্যান্ডেল করে বলে মনে হচ্ছে না যেমন এটি ভেবেছিল।

সেক্ষেত্রে এই ওয়ান-লাইনারটি ব্যবহার করে দেখুন:

longitude = (longitude + 36180) % 360 - 180

36180আমরা যোগ করছি 36,000 + + 180. 36,000 ইতিবাচক ডোমেইনের মধ্যে একটি নেতিবাচক মান সরাতে, এবং 180 ওভার যাতে যখন এটি দ্বারা modded হয় নামান হয় 360পরিসীমা, এটা হবেন [0,360) । - 180অংশ বদল আনতে এটি [-180,180) পরিসীমা ফিরে।

এখানে অন্য একটি লাইনার রয়েছে, এটি এমন এক যে 36,000 পর্যাপ্ত পরিমাণে বড় হওয়ার উপর নির্ভর করে না:

longitude = (longitude % 360 + 360 + 180) % 360 - 180

longitude % 360 + 360অংশ ইতিবাচক ডোমেইনে মান থাকার বিষয়টি মতেই নিশ্চিত করবে যখন এটি পরে দ্বারা modded এর 360+ 180অংশ বদল আনতে এটি উপর যাতে যখন এটি পরে পায় 180 এটা (সঙ্গে থেকে বিয়োগ - 180), এটি [-180,180) পছন্দসই সীমার মধ্যে থাকব।


1
দ্রষ্টব্য: সি, সি ++ fmod(longitude, 360)-> (-360.0 ... +360.0) এবং ilongitude % 360-> [-359 ... +359]।
chux - মনিকা পুনরায় ইনস্টল করুন

@ চুক্স - আমি সে সম্পর্কে জানতাম না, তাই আমি কেবল এটি পরীক্ষা করেছিলাম এবং দেখা যাচ্ছে যে আপনি সঠিক। এটি নির্দেশ করার জন্য আপনাকে ধন্যবাদ।
জেএল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.