Geocentric এবং topocentric—দুটিই বৈধ position। পার্থক্য হলো observer কোথায় বসানো হয়েছে। Earth-এর কেন্দ্র থেকে দেখা direction একরকম, আর ঢাকা, কলকাতা বা নিউইয়র্কে Earth-এর surface থেকে দেখা direction সামান্য অন্যরকম। কাছের Moon-এর ক্ষেত্রে এই difference বড়; দূরের planet-এর ক্ষেত্রে সাধারণত ছোট।
Geocentric ও topocentric: দুটি coordinate origin
Geocentric position
Geocentric coordinate-এ ideal observer-কে Earth-এর center-এ ধরা হয়। Sun, Moon ও planet-এর longitude, latitude, right ascension বা declination একটি common Earth-centered origin থেকে প্রকাশ করা যায়। ফলে পৃথিবীর সব শহরের জন্য একই instant-এ একই geocentric ecliptic longitude পাওয়া উচিত—অবশ্য engine, ephemeris, time scale, reference frame ও correction flags একই হলে।
Topocentric position
Topocentric coordinate-এ origin হলো Earth-এর surface-এ নির্দিষ্ট observer। তাই latitude, longitude এবং elevation প্রয়োজন। JPL Solar System Dynamics glossary-ও topocentric system-কে পৃথিবীর একটি নির্দিষ্ট location-কেন্দ্রিক reference system হিসেবে সংজ্ঞায়িত করে।
একই UTC instant-এ ঢাকা ও নিউইয়র্কের observer Earth-এর কেন্দ্রের দুই ভিন্ন দিকে অবস্থান করেন। তাদের line of sight কাছের object-এর দিকে parallel নয়। ফলে apparent celestial direction বদলে যায়। এই effect-ই diurnal বা topocentric parallax-এর মূল।
| বিষয় | Geocentric | Topocentric |
|---|---|---|
| Origin | Earth-এর center | Observer-এর location |
| Location input | Position-এর জন্য লাগে না | Latitude, longitude, height লাগে |
| একই instant-এ city পরিবর্তন | Longitude অপরিবর্তিত | Direction পরিবর্তিত |
| Moon-এ difference | Common phase geometry | বিশেষত horizon-এর কাছে বড় |
| প্রধান ব্যবহার | তিথি, নক্ষত্র, যোগ, planetary longitude | Rise/set, altitude/azimuth, local eclipse |
Parallax কী?
একটি কাছের object-কে দুই ভিন্ন স্থান থেকে দেখলে background-এর তুলনায় তার direction বদলে যায়। Earth-এর center এবং surface observer—এই দুই viewpoint-এর angular difference হলো topocentric parallax। Object যত কাছে, parallax তত বড়।
Horizontal parallax হলো এমন একটি standard angle, যখন body observer-এর astronomical horizon-এ থাকে। সরল spherical approximation:
horizontal parallax = asin(Earth radius ÷ geocentric distance)
π = asin(REarth ÷ Δ)
এটি full coordinate conversion নয়; concept বোঝার approximation। Accurate calculation-এ oblate Earth, geodetic latitude, observer elevation, sidereal time এবং three-dimensional vector ব্যবহার করা হয়।
Horizon-এর কাছে effect বেশি কেন?
Observer-এর displacement vector line of sight-এর perpendicular হলে angular shift সর্বাধিক। Body horizon-এর কাছে থাকলে surface observer ও Earth center-এর viewpoint difference প্রায় সর্বোচ্চ হয়। Zenith-এর কাছে একই displacement মূলত distance বদলায়, direction কম বদলায়।
Moon-এর ক্ষেত্রে বিষয়টি এত গুরুত্বপূর্ণ কেন?
Moon পৃথিবীর সবচেয়ে কাছের প্রধান celestial body। তার geocentric distance প্রায় 60 Earth radii-এর order-এ; তাই horizontal parallax প্রায় এক degree-এর কাছাকাছি হতে পারে। এটি Moon-এর apparent diameter-এর চেয়েও বড় হতে পারে।
ফলে Moon-এর geocentric altitude zero হলেই surface observer-এর জন্য moonrise হয়েছে—এমন নয়। Rise/set solver-কে topocentric direction, selected limb, lunar semidiameter এবং refraction profile বিচার করতে হয়। Moon-এর distance orbit জুড়ে বদলায় বলে parallax ও angular diameter-ও বদলায়।
Sun ও planet-এর ক্ষেত্রে
Sun-এর finite distance-এর কারণে solar parallax আছে, কিন্তু Moon-এর তুলনায় অনেক ছোট। Planet-এর topocentric correction তাদের distance অনুযায়ী বদলায়; অধিকাংশ সাধারণ Panchanga longitude-এ effect ক্ষুদ্র হলেও precise horizon, occultation বা eclipse কাজে তা প্রাসঙ্গিক। “Moon ছাড়া কারও parallax নেই” বলা যেমন ভুল, তেমনি সব body-তে effect সমান বলা আরও ভুল।
Origin এবং apparent/true একই প্রশ্ন নয়
একটি position বর্ণনা করতে একাধিক স্বাধীন decision লাগে। Geocentric বনাম topocentric শুধু origin ঠিক করে। নিচের প্রশ্নগুলো আলাদা:
- Geocentric, topocentric, heliocentric না barycentric?
- Tropical না sidereal/nirayana zodiac?
- Geometric/true না apparent?
- Mean equinox না true equinox of date?
- Ecliptic না equatorial coordinates?
- Center of body না visible limb?
- Refraction included না excluded?
তাই “topocentric = apparent” নয়। Topocentric geometric এবং topocentric apparent—দুটিই সম্ভব। একইভাবে geocentric apparent ও geocentric astrometric position-ও সম্ভব। USNO-র geocentric service apparent ও astrometric position আলাদাভাবে দেয়; topocentric service observer-dependent right ascension/declination বা zenith distance/azimuth দেয়।
Panchanga-তে কোন calculation কোন origin ব্যবহার করবে?
| ফল | প্রধান position/origin | Location কোথায় লাগে? |
|---|---|---|
| তিথি | Geocentric Sun–Moon nirayana elongation | Sunrise instant ও local display-এ |
| করণ | Geocentric elongation-এর 6° অংশ | Day-rule evaluation instant-এ |
| নক্ষত্র | Geocentric nirayana Moon longitude | Sunrise/selected instant-এ |
| যোগ | Geocentric nirayana Sun + Moon longitude | Evaluation instant-এ |
| গ্রহস্ফুট/রাশি | সাধারণত geocentric nirayana longitude | Instant conversion-এ |
| সূর্যোদয়/সূর্যাস্ত | Declared horizon profile; সাধারণ astronomy-তে topocentric apparent | Lat/lon/height/horizon অপরিহার্য |
| চন্দ্রোদয়/চন্দ্রাস্ত | Topocentric Moon + limb/refraction profile | Lat/lon/height অপরিহার্য |
| লগ্ন ও ভাব | Local horizon/meridian ও sidereal rotation | Latitude, longitude ও time অপরিহার্য |
| Local solar eclipse contacts | Topocentric Sun–Moon apparent geometry | Observer location অপরিহার্য |
এই table default engineering policy। কোনো বিশেষ শাস্ত্রীয় বা আঞ্চলিক প্রথা অন্য সংজ্ঞা নিলে সেটি আলাদা named calculation profile হিসেবে লিখতে হবে। Silent flag change করা উচিত নয়।
তিথি-at-sunrise: একই গণনায় দুই reference
এই অংশেই implementation error বেশি হয়। “সূর্যোদয়ের তিথি” বের করতে দুটি স্বতন্ত্র calculation লাগে:
- নির্দিষ্ট শহরের sunrise instant নির্ণয় করুন—এটি observer-dependent event;
- সেই UTC/TT instant-এ geocentric Sun ও Moon longitude দিয়ে elongation গণনা করুন;
- Elongation-কে 12° ভাগে ভাগ করে তিথি নির্ণয় করুন;
- প্রয়োজন হলে আগের/পরের boundary solve করে end time local zone-এ দেখান।
sunrise = TopocentricEvent(date, observer, sunriseProfile)
elongation = Normalize(MoonGeo(sunrise) − SunGeo(sunrise))
tithi = floor(elongation ÷ 12°) + 1
Location এখানে তিথির longitude definition বদলায় না; location sunrise-এর instant বদলায়। ঢাকা ও নিউইয়র্কে একই civil date-এর sunrise আলাদা UTC instant-এ ঘটে, তাই geocentric elongation-ও ওই দুটি instant-এ আলাদা। এভাবেই local Panchanga result বদলায়—Moon longitude-কে জোর করে topocentric না করেও।
Rise/set, altitude–azimuth ও visibility
Rise/set হলো local horizon crossing। তাই observer-এর position ছাড়া এর physical অর্থ অসম্পূর্ণ। সাধারণ astronomical moonrise calculation-এ প্রয়োজন হতে পারে:
- Topocentric apparent right ascension ও declination;
- Local apparent sidereal time;
- Observer-এর geodetic latitude, longitude ও elevation;
- Moon-এর distance-dependent semidiameter;
- Atmospheric refraction;
- Upper limb, center বা lower limb convention;
- Terrain horizon বা horizon altitude mask।
অন্যদিকে কোনো traditional profile Sun center, no refraction এবং geocentric latitude ignored ধরনের convention নিতে পারে। Swiss Ephemeris-এ Hindu rising-এর জন্য বিশেষ flag combination-ও document করা আছে। কাজেই “rise/set সব সময় topocentric apparent upper limb” বলা যাবে না; বরং profile name ও flags প্রকাশ করতে হবে।
Eclipse: global geometry ও local circumstances
Solar eclipse-এর global path নির্ণয়ে Earth–Moon–Sun-এর বৃহৎ-scale geometry দরকার। কিন্তু কোনো শহরে eclipse দেখা যাবে কি না, contact কখন হবে, Sun-এর altitude কত থাকবে—এসব local circumstances topocentric। USNO-র Solar Eclipse Computer local maximum ও contact খুঁজতে Sun ও Moon-এর topocentric position iteratively গণনা করে।
Lunar eclipse-এ Moon পৃথিবীর shadow-তে প্রবেশ করে; global phase times geocentric geometry-তে নির্ণীত হতে পারে। কিন্তু নির্দিষ্ট location-এ Moon তখন horizon-এর ওপরে কি না, moonrise-এর আগে না পরে—এটি topocentric/local horizon প্রশ্ন।
Occultation ও close conjunction
Moon কোনো star বা planet ঢেকে দেবে কি না তা observer location-এ অত্যন্ত sensitive। Geocentric close approach দেখে occultation ঘোষণা করা যাবে না। একই event এক শহরে occultation, অন্য শহরে near miss হতে পারে।
Swiss Ephemeris-এ safe implementation
Swiss Ephemeris documentation অনুযায়ী topocentric planet position চাইলে প্রথমে swe_set_topo(longitude, latitude, altitude) call করতে হয়, তারপর calculation flag-এ SEFLG_TOPOCTR যোগ করতে হয়। Longitude ও latitude degree-এ, altitude meter-এ।
// Topocentric position — conceptual C# wrapper
lock (SwissGlobalStateLock)
{
swe_set_topo(observer.LongitudeDeg,
observer.LatitudeDeg,
observer.HeightMeters);
int flags = SEFLG_SWIEPH
| SEFLG_SPEED
| SEFLG_TOPOCTR;
return swe_calc_ut(jdUt, body, flags, values, error);
}
শুধু swe_set_topo call করলেই calculation topocentric হয় না; flag-ও লাগবে। আবার flag থাকলেও observer set না করলে intended location নিশ্চিত হয় না। Documentation আরও জানায়, swe_set_topo-তে set করা parameters swe_close()-এর পরেও থাকে। তাই shared web application-এ global mutable state race condition তৈরি করতে পারে।
Thread safety ও state leakage
- প্রতিটি topocentric call-এর আগে observer explicitly set করুন;
- Global native state থাকলে lock বা isolated engine instance ব্যবহার করুন;
- এক user-এর Dhaka observer যেন পরের user-এর New York calculation-এ থেকে না যায়;
- Geocentric method-এ
SEFLG_TOPOCTRকখনো inherited flag হিসেবে রাখবেন না; - Returned flags inspect করুন—library incompatible flag বাদ দিতে পারে;
- Audit trace-এ origin, flags, coordinates ও ephemeris লিখুন।
swe_rise_trans
swe_rise_trans observer-এর longitude, latitude ও height-এর geopos array গ্রহণ করে। Pressure, temperature, disc-center এবং no-refraction options rise/set definition বদলায়। অতএব position method-এর SEFLG_TOPOCTR flag এবং rise/set method-এর geopos/rsmi options-কে এক জিনিস মনে করবেন না।
C# engine-এ origin type-safe করুন
একটি generic GetLongitude() method-এর optional boolean flag পরে ভুলের উৎস হয়। Origin, zodiac এবং correction profile স্পষ্ট type-এ রাখুন:
public enum PositionOrigin
{
Geocentric,
Topocentric
}
public sealed class CoordinateProfile
{
public PositionOrigin Origin { get; set; }
public bool Sidereal { get; set; }
public bool Apparent { get; set; }
public string AyanamsaId { get; set; }
public string Purpose { get; set; }
}
public static CoordinateProfile PanchangaLongitude()
{
return new CoordinateProfile
{
Origin = PositionOrigin.Geocentric,
Sidereal = true,
Apparent = true,
AyanamsaId = "DeclaredProjectAyanamsa",
Purpose = "Tithi/Nakshatra/Karana/Yoga"
};
}
public static CoordinateProfile LocalHorizon()
{
return new CoordinateProfile
{
Origin = PositionOrigin.Topocentric,
Sidereal = false,
Apparent = true,
Purpose = "Rise/Set/Altitude/Azimuth"
};
}
Guard clause
static void RequirePanchangaOrigin(CoordinateProfile profile)
{
if (profile == null || profile.Origin != PositionOrigin.Geocentric)
throw new InvalidOperationException(
"Panchanga longitude must use the declared geocentric profile.");
}
static void RequireObserver(CoordinateProfile profile, Observer observer)
{
if (profile.Origin == PositionOrigin.Topocentric && observer == null)
throw new ArgumentNullException("observer");
}
Horizontal parallax diagnostic
static double HorizontalParallaxDegrees(
double geocentricDistanceKm,
double earthRadiusKm = 6378.137)
{
if (geocentricDistanceKm <= earthRadiusKm)
throw new ArgumentOutOfRangeException("geocentricDistanceKm");
return Math.Asin(earthRadiusKm / geocentricDistanceKm)
* 180.0 / Math.PI;
}
এই diagnostic result production topocentric longitude-এর বিকল্প নয়। এটি distance/units ভুল ধরতে useful। Distance যদি AU-তে আসে কিন্তু km মনে করে formula-তে পাঠানো হয়, result সম্পূর্ণ অবাস্তব হবে।
Result metadata
public sealed class CalculatedPosition
{
public DateTime UtcInstant { get; set; }
public int BodyId { get; set; }
public PositionOrigin Origin { get; set; }
public double LongitudeDeg { get; set; }
public double LatitudeDeg { get; set; }
public double DistanceAu { get; set; }
public string ReferenceFrame { get; set; }
public string Flags { get; set; }
public Observer Observer { get; set; } // null for geocentric
}
HTML, XML ও API-তে শুধু angle না দিয়ে অন্তত origin, zodiac, ayanamsa, instant এবং applicable observer metadata রাখুন। এতে ভবিষ্যতে mismatch trace করা সহজ হবে।
Validation checklist
- Geocentric longitude city পরিবর্তনে অপরিবর্তিত থাকে;
- Topocentric Moon position city পরিবর্তনে বদলায়;
- একই instant সব comparison-এ ব্যবহৃত হয়;
- UTC ও TT conversion একবারই হয়;
- Topocentric flag geocentric path-এ leak করে না;
- প্রতি topocentric call-এর আগে observer set হয়;
- Longitude east-positive convention যাচাই করা হয়;
- Latitude north-positive convention যাচাই করা হয়;
- Altitude meter-এ পাঠানো হয়;
- Distance AU বনাম km unit test আছে;
- Moon near horizon test করা হয়;
- Moon near zenith test করা হয়;
- Perigee ও apogee distance cases test করা হয়;
- Dhaka ও New York-এর একই UTC instant compare করা হয়;
- Tithi method geocentric Sun ও Moon দুটিই ব্যবহার করে;
- Nakshatra method geocentric nirayana Moon ব্যবহার করে;
- Yoga method একই origin-এর Sun ও Moon যোগ করে;
- Karana method geocentric elongation ভাগ করে;
- Sunrise instant location-dependent solver থেকে আসে;
- Sunrise-এর পরে Panchanga angle সেই exact instant-এ evaluate হয়;
- Moonrise topocentric position ব্যবহার করে;
- Lunar semidiameter double-applied হয় না;
- Refraction on/off profile আলাদা থাকে;
- Disc center/upper limb option trace-এ থাকে;
- Terrain horizon standard horizon থেকে পৃথক;
- Rise/set no-event status engine error থেকে পৃথক;
- Solar eclipse local contact topocentric test আছে;
- Lunar eclipse visibility horizon দিয়ে test হয়;
- Occultation city-to-city difference test করা হয়;
- Geocentric apparent বনাম astrometric label পৃথক;
- Tropical বনাম sidereal flag পৃথক;
- Ayanamsa topocentric correction-এর সঙ্গে গুলিয়ে যায় না;
- Reference-frame metadata result-এ থাকে;
- Returned Swiss flags যাচাই করা হয়;
- Shared native state concurrent-request test করা হয়;
- Dhaka request-এর state New York request-এ leak করে না;
- Cache key-তে origin ও observer থাকে;
- Geocentric cache location-independent রাখা হয়;
- Topocentric cache location/profile-dependent রাখা হয়;
- Rounded display value থেকে boundary solve করা হয় না;
- Boundary-এর দুই পাশে raw value test করা হয়;
- USNO topocentric result matching profile-এ compare করা হয়;
- Swiss Ephemeris version metadata-তে থাকে;
- API field-এ
originপ্রকাশিত হয়; - XML export observer profile preserve করে;
- Printed report method label দেখায়;
- Regression snapshot একই flags দিয়ে তৈরি হয়;
- Historical calculation-এ location availability নথিবদ্ধ হয়;
- Custom traditional sunrise profile আলাদা নামে থাকে;
- Mismatch report-এ instant, origin, flags ও units একসঙ্গে লেখা হয়।
সাধারণ ভুল ও সমাধান
| ভুল | ফল | সমাধান |
|---|---|---|
| সব local result-এ topocentric longitude | তিথি/নক্ষত্রের standard definition বদলে যায় | Event instant ও Panchanga angle আলাদা করুন |
| Moonrise-এ geocentric Moon | Parallaxজনিত বড় time error | Topocentric horizon solver |
| Topocentric flag state leak | User/location অনুযায়ী অনিয়মিত result | Lock, explicit flags ও typed methods |
| Topocentric = apparent ধরে নেওয়া | Correction profile অস্পষ্ট | Origin ও apparent/true পৃথক fields |
| AU-কে km হিসেবে ব্যবহার | অবাস্তব parallax | Strong unit types ও validation |
| Sunrise time round করে তিথি evaluate | Boundary-এর কাছে ভুল দিন | Raw instant দিয়ে calculation |
| Local eclipse geocentric contact | Visibility/contact mismatch | Topocentric local circumstances |
| Method না লিখে angle প্রকাশ | Research comparison অসম্ভব | Origin/frame/flags metadata |
উপসংহার
Geocentric ও topocentric result-এর মধ্যে কোনোটি স্বয়ংক্রিয়ভাবে বেশি “সত্য” নয়। তারা ভিন্ন প্রশ্নের উত্তর দেয়। Earth-centered phase relationship জানতে geocentric position উপযুক্ত; নির্দিষ্ট observer আকাশে কোথায় body দেখবেন জানতে topocentric position দরকার।
Panchanga-তে তিথি, করণ, নক্ষত্র ও যোগের core angular definitions সাধারণত geocentric nirayana longitude-নির্ভর। কিন্তু কোন তিথি স্থানীয় সূর্যোদয়ে উপস্থিত, কখন Moon উঠবে, কোনো eclipse দেখা যাবে কি না বা local contact কখন—এসবের event layer observer-dependent।
সুতরাং reliable architecture হলো: প্রথমে location অনুযায়ী event instant নির্ণয়, তারপর প্রতিটি Panchanga quantity তার declared coordinate profile-এ evaluate করা। Origin, frame, flags ও observer metadata স্পষ্ট রাখলে একদিকে traditional rule অক্ষুণ্ণ থাকে, অন্যদিকে আধুনিক local astronomy-ও যথাযথ হয়।
তথ্যসূত্র ও আরও পাঠ
- NASA/JPL Solar System Dynamics—Topocentric; observer-centered reference system-এর সংজ্ঞা।
- U.S. Naval Observatory—Topocentric Positions; observer location, height, right ascension/declination, zenith distance ও azimuth।
- U.S. Naval Observatory—Geocentric Positions; geocentric apparent ও astrometric position এবং center-of-Earth distance।
- U.S. Naval Observatory—Solar Eclipse Computer; local circumstances-এ topocentric Sun–Moon position ও contact iteration।
- Swiss Ephemeris Programmer’s Documentation;
swe_set_topo,SEFLG_TOPOCTRএবংswe_rise_trans।
মন্তব্য, আলোচনা ও প্রশ্ন