একটি app-এ “রোহিণী সকাল ১০:২৩ পর্যন্ত, পরে মৃগশিরা” দেখাতে দুটি কাজ করতে হয়: sunrise instant-এ নিরয়ণ Moon longitude থেকে current sector নির্ধারণ এবং Moon পরবর্তী ১৩°২০′ boundary কখন অতিক্রম করছে তার root solve। শুধু দিনের শুরু ও শেষে নক্ষত্র sample করলে exact end time, কখনও intermediate transition-ও হারিয়ে যেতে পারে।
নক্ষত্রের mathematical definition
Standard 27-nakṣatra computational model-এ sidereal ecliptic ০° থেকে ৩৬০° পর্যন্ত সমান sector-এ বিভক্ত। প্রথম sector ০° মেষ থেকে অশ্বিনী; এরপর ভরণী, কৃত্তিকা—ক্রমে রেবতী পর্যন্ত।
NakṣatraIndex = floor(L ÷ (৩৬০°/২৭)) + ১
NakshatraIndex ১–২৭। Boundary interval half-open: start inclusive, end exclusive। তাই Moon ঠিক ১৩°২০′-এ পৌঁছালে অশ্বিনী শেষ; ভরণী শুরু।
প্রতিটি নক্ষত্র ১৩°২০′, প্রতিটি পদ ৩°২০′
১৩°২০′ ÷ ৪ = ৩°২০′ = ২০০ arcminutes
মোট পদ = ২৭ × ৪ = ১০৮
Floating-point repeating decimal 13.333333... ব্যবহার না করে arcminute বা arcsecond integer constants রাখা নিরাপদ। পূর্ণ zodiac = ১,২৯৬,০০০ arcseconds; একটি নক্ষত্র = ৪৮,০০০ arcseconds; একটি pada = ১২,০০০ arcseconds।
২৭ নক্ষত্রের sidereal boundary
| # | নক্ষত্র | শুরু | শেষ |
|---|---|---|---|
| ১ | অশ্বিনী | মেষ ০°০০′ | মেষ ১৩°২০′ |
| ২ | ভরণী | মেষ ১৩°২০′ | মেষ ২৬°৪০′ |
| ৩ | কৃত্তিকা | মেষ ২৬°৪০′ | বৃষ ১০°০০′ |
| ৪ | রোহিণী | বৃষ ১০°০০′ | বৃষ ২৩°২০′ |
| ৫ | মৃগশিরা | বৃষ ২৩°২০′ | মিথুন ৬°৪০′ |
| ৬ | আর্দ্রা | মিথুন ৬°৪০′ | মিথুন ২০°০০′ |
| ৭ | পুনর্বসু | মিথুন ২০°০০′ | কর্কট ৩°২০′ |
| ৮ | পুষ্যা | কর্কট ৩°২০′ | কর্কট ১৬°৪০′ |
| ৯ | অশ্লেষা | কর্কট ১৬°৪০′ | কর্কট ৩০°০০′ |
| ১০ | মঘা | সিংহ ০°০০′ | সিংহ ১৩°২০′ |
| ১১ | পূর্বফাল্গুনী | সিংহ ১৩°২০′ | সিংহ ২৬°৪০′ |
| ১২ | উত্তরফাল্গুনী | সিংহ ২৬°৪০′ | কন্যা ১০°০০′ |
| ১৩ | হস্তা | কন্যা ১০°০০′ | কন্যা ২৩°২০′ |
| ১৪ | চিত্রা | কন্যা ২৩°২০′ | তুলা ৬°৪০′ |
| ১৫ | স্বাতী | তুলা ৬°৪০′ | তুলা ২০°০০′ |
| ১৬ | বিশাখা | তুলা ২০°০০′ | বৃশ্চিক ৩°২০′ |
| ১৭ | অনুরাধা | বৃশ্চিক ৩°২০′ | বৃশ্চিক ১৬°৪০′ |
| ১৮ | জ্যেষ্ঠা | বৃশ্চিক ১৬°৪০′ | বৃশ্চিক ৩০°০০′ |
| ১৯ | মূলা | ধনু ০°০০′ | ধনু ১৩°২০′ |
| ২০ | পূর্বাষাঢ়া | ধনু ১৩°২০′ | ধনু ২৬°৪০′ |
| ২১ | উত্তরাষাঢ়া | ধনু ২৬°৪০′ | মকর ১০°০০′ |
| ২২ | শ্রবণা | মকর ১০°০০′ | মকর ২৩°২০′ |
| ২৩ | ধনিষ্ঠা | মকর ২৩°২০′ | কুম্ভ ৬°৪০′ |
| ২৪ | শতভিষা | কুম্ভ ৬°৪০′ | কুম্ভ ২০°০০′ |
| ২৫ | পূর্বভাদ্রপদ | কুম্ভ ২০°০০′ | মীন ৩°২০′ |
| ২৬ | উত্তরভাদ্রপদ | মীন ৩°২০′ | মীন ১৬°৪০′ |
| ২৭ | রেবতী | মীন ১৬°৪০′ | মীন ৩০°০০′ |
Regional spelling—পুষ্যা/পুষ্য, হস্তা/হস্ত, শ্রবণা/শ্রবণ—language resource-এ রাখা উচিত। Calculation model numeric index ও stable key ব্যবহার করবে।
নক্ষত্র ও pada index
Moon longitude L degree-এ থাকলে:
padaSize = sector ÷ ৪ = ৩°২০′
nakṣatra = floor(L ÷ sector) + ১
offset = L − (nakṣatra−১)×sector
pada = floor(offset ÷ padaSize) + ১
উদাহরণ: L = 45°। এটি বৃষ ১৫°, অর্থাৎ রোহিণী sector [৪০°, ৫৩°২০′)-এর ভিতরে। Sector offset ৫°; তাই দ্বিতীয় pada [৩°২০′, ৬°৪০′)-এর মধ্যে। Result: রোহিণী, ২য় পদ।
Ayanāṃśa কেন নক্ষত্রের জন্য অপরিহার্য?
Ephemeris সাধারণত tropical longitude দিতে পারে। নক্ষত্রের জন্য chosen sidereal reference অনুযায়ী নিরয়ণ longitude দরকার:
Lahiri/Chitrapaksha, Raman, Krishnamurti বা project-specific traditional model একই date-এ ভিন্ন ayanāṃśa দিতে পারে। Moon যদি sector boundary-এর কাছে থাকে, এই difference নক্ষত্রের নাম, pada এবং end time বদলে দিতে পারে।
তিথির সঙ্গে নক্ষত্রের সবচেয়ে গুরুত্বপূর্ণ পার্থক্য
| বিষয় | তিথি | নক্ষত্র |
|---|---|---|
| মূল quantity | Moon − Sun elongation | Moon-এর absolute sidereal longitude |
| বিভাগ | ৩০ × ১২° | ২৭ × ১৩°২০′ |
| Ayanāṃśa | একই offset দুই longitude-এ cancel করে | সরাসরি boundary বদলায় |
| Cycle | Synodic month, প্রায় ২৯.৫ দিন | Sidereal Moon circuit, প্রায় ২৭.৩ দিন |
| Daily assignment | সাধারণত sunrise tithi | সাধারণত sunrise nakṣatra |
আগের article-এর tithi code-এ ayanāṃśa cancellation সত্য হলেও সেটি নক্ষত্র code-এ copy করা যাবে না। নক্ষত্র boundary-এর জন্য sidereal zero-point calculation-এর অংশ।
Geocentric না topocentric Moon?
Standard Panchanga nakṣatra সাধারণত geocentric Moon longitude থেকে নির্ণীত হয়। Moon নিকটবর্তী হওয়ায় topocentric parallax noticeable; observer latitude/longitude ব্যবহার করে topocentric position নিলে boundary time বদলে যেতে পারে।
Location অবশ্যই sunrise ও local display-এর জন্য দরকার, কিন্তু সেই কারণে Moon longitude-ও topocentric করতে হবে—এমন নয়। Profile field explicit রাখুন:
moonReference = "geocentric"
siderealMode = "lahiri" // অথবা project-specific
eventTimeScale = "UT"
displayZone = "Asia/Dhaka"
কোনো printed Panchanga topocentric বা অন্য correction অনুসরণ করলে সেটি আলাদা versioned profile হবে; silently standard result-এর সঙ্গে mix করবেন না।
নক্ষত্রের শেষ সময় কীভাবে পাওয়া যায়?
Current index N হলে next boundary:
N = ২৭ হলে target = ৩৬০°/০°
Solve: Lnirayana Moon(t) = target
Moon longitude এক দিনের মধ্যে linear ধরে remaining-degree ÷ average-speed করলে approximate time পাওয়া যায়, published end time নয়। Moon-এর speed পরিবর্তিত হয়; ayanāṃśa-ও সময়ের সঙ্গে সামান্য বদলায়। প্রতিটি trial Julian Day-এ full longitude function পুনর্গণনা করে root solve করুন।
Practical method:
- Starting instant-এ current longitude ও next target নিন;
- ২–৩ ঘণ্টার step-এ forward scan করে crossing bracket করুন;
- Longitude ৩৬০° wrap করলে continuous value-তে unwrap করুন;
- Bisection বা Brent solver দিয়ে requested tolerance-এ root;
- UTC/JD instant সংরক্ষণ করে requested time zone-এ render করুন।
Sunrise-based daily display
Daily Panchanga day local sunrise থেকে পরের sunrise। প্রথম sunrise-এ যে নক্ষত্র বর্তমান, সেটি primary label; day-এর ভিতরে transition হলে end time এবং “পরে” নক্ষত্র দেখানো হয়।
| Boundary count | Daily display |
|---|---|
| ০ | নক্ষত্র next sunrise পর্যন্ত; project style অনুযায়ী “অহোরাত্র” |
| ১ | “রোহিণী … পর্যন্ত পরে মৃগশিরা” |
| ২ | দুই transition-ই list; মধ্যবর্তী নক্ষত্র sunrise-এ অনুপস্থিত হতে পারে |
একটি নক্ষত্র পরপর দুই sunrise-এ থাকলে sunrise list-এ বৃদ্ধি-সদৃশ পুনরাবৃত্তি দেখা যায়। আবার দুটি sunrise-এর মাঝখানে সম্পূর্ণ নক্ষত্র এসে চলে গেলে sunrise-only grid সেটি বাদ দিতে পারে। Daily details ও XML-এ raw transitions সংরক্ষণ করলে তথ্য হারায় না।
অভিজিৎ এবং ২৮ নক্ষত্রের ঐতিহাসিক প্রসঙ্গ
ঐতিহাসিক ও কিছু ritual tradition-এ অভিজিৎ-সহ ২৮ নক্ষত্রের উল্লেখ আছে। কিন্তু common modern Panchanga-এর ২৭ equal-sector algorithm-এ অভিজিৎকে ২৮তম সমান division হিসেবে ঢোকানো হয় না। 360 / 28 করলে সমস্ত standard boundary বদলে যাবে—এটি ভুল implementation।
অভিজিৎ প্রয়োজন হলে আলাদা SpecialNakshatraWindow বা tradition-specific overlay হিসেবে model করুন। Standard index ১–২৭ অপরিবর্তিত থাকবে; overlap, ritual use এবং source authority metadata-তে প্রকাশ করুন।
Production calculation pipeline
- Profile: Moon engine, reference frame, ayanāṃśa, time scale ও tolerance স্থির করুন;
- Moon position: requested JD-তে geocentric tropical/apparent longitude;
- Sidereal conversion: same JD/profile-এর ayanāṃśa প্রয়োগ;
- State: ১৩°২০′ sector ও ৩°২০′ pada;
- Target: next ৪৮,০০০ arcsecond boundary;
- Bracket: short forward stepping;
- Root: unwrapped longitude দিয়ে exact instant;
- Vedic day: sunrise-to-next-sunrise সব roots collect;
- Localization: local clock, নিশা এবং দণ্ড-পল format;
- Export: raw JD, longitude, ayanāṃśa ও profile ID সহ output।
Boundary arithmetic-এ arcsecond integer model
const int ArcSecondsPerDegree = 3600;
const int FullCircleArcSeconds = 360 * ArcSecondsPerDegree; // 1,296,000
const int NakshatraArcSeconds = FullCircleArcSeconds / 27; // 48,000
const int PadaArcSeconds = NakshatraArcSeconds / 4; // 12,000
Ephemeris longitude double থাকবে, কিন্তু index/boundary constants exact integer হতে পারে। Boundary-এর কাছে longitude আগে integer-এ round করে index বের করবেন না; তাতে কয়েক milliarcsecond-এর error state উল্টে দিতে পারে। Double longitude দিয়ে half-open comparison, integer constants থেকে exact target তৈরি করুন।
C# 5-compatible নক্ষত্র state
public sealed class NakshatraState
{
public int Index { get; set; } // 1..27
public string Key { get; set; }
public string NameBn { get; set; }
public int Pada { get; set; } // 1..4
public double Longitude { get; set; }
public double StartLongitude { get; set; }
public double EndLongitude { get; set; }
public double OffsetInside { get; set; }
}
static readonly string[] NakshatraKeys =
{
"ashwini", "bharani", "krittika", "rohini", "mrigashira",
"ardra", "punarvasu", "pushya", "ashlesha", "magha",
"purva-phalguni", "uttara-phalguni", "hasta", "chitra",
"swati", "vishakha", "anuradha", "jyeshtha", "mula",
"purva-ashadha", "uttara-ashadha", "shravana", "dhanishtha",
"shatabhisha", "purva-bhadrapada", "uttara-bhadrapada", "revati"
};
static readonly string[] NakshatraNamesBn =
{
"অশ্বিনী", "ভরণী", "কৃত্তিকা", "রোহিণী", "মৃগশিরা",
"আর্দ্রা", "পুনর্বসু", "পুষ্যা", "অশ্লেষা", "মঘা",
"পূর্বফাল্গুনী", "উত্তরফাল্গুনী", "হস্তা", "চিত্রা",
"স্বাতী", "বিশাখা", "অনুরাধা", "জ্যেষ্ঠা", "মূলা",
"পূর্বাষাঢ়া", "উত্তরাষাঢ়া", "শ্রবণা", "ধনিষ্ঠা",
"শতভিষা", "পূর্বভাদ্রপদ", "উত্তরভাদ্রপদ", "রেবতী"
};
static double Normalize360(double value)
{
value %= 360.0;
if (value < 0.0) value += 360.0;
return value;
}
static NakshatraState NakshatraAt(double nirayanaMoonLongitude)
{
const double sector = 360.0 / 27.0;
const double padaSize = sector / 4.0;
double longitude = Normalize360(nirayanaMoonLongitude);
int zeroBased = (int)Math.Floor(longitude / sector);
if (zeroBased < 0) zeroBased = 0;
if (zeroBased > 26) zeroBased = 26;
double start = zeroBased * sector;
double end = (zeroBased + 1) * sector;
double offset = longitude - start;
int pada = (int)Math.Floor(offset / padaSize) + 1;
if (pada > 4) pada = 4;
return new NakshatraState
{
Index = zeroBased + 1,
Key = NakshatraKeys[zeroBased],
NameBn = NakshatraNamesBn[zeroBased],
Pada = pada,
Longitude = longitude,
StartLongitude = start,
EndLongitude = end,
OffsetInside = offset
};
}
Display spelling data array থেকে সরিয়ে resource file-এ নিলে Assamese বা অন্য language সহজে যোগ করা যাবে। Key ও index calculation core-এ অপরিবর্তিত থাকবে।
Unwrapped Moon longitude দিয়ে boundary root
রেবতী থেকে অশ্বিনীতে গেলে normalized longitude ৩৫৯° থেকে ০° হয়। Root function যেন পিছিয়ে যাওয়া না দেখে, anchor-relative forward longitude ব্যবহার করুন:
static double ForwardArc(double value, double anchor)
{
return Normalize360(value - anchor);
}
static double SolveNakshatraBoundary(
double leftJd,
double rightJd,
double anchorLongitude,
double targetForwardArc,
Func<double, double> nirayanaMoonLongitude,
double toleranceDays)
{
Func<double, double> f = delegate(double jd)
{
double current = nirayanaMoonLongitude(jd);
return ForwardArc(current, anchorLongitude) - targetForwardArc;
};
double leftValue = f(leftJd);
double rightValue = f(rightJd);
if (leftValue > 0.0 || rightValue < 0.0)
throw new ArgumentException("Nakshatra boundary is not bracketed.");
while (rightJd - leftJd > toleranceDays)
{
double middleJd = (leftJd + rightJd) / 2.0;
if (f(middleJd) < 0.0)
leftJd = middleJd;
else
rightJd = middleJd;
}
return (leftJd + rightJd) / 2.0;
}
nirayanaMoonLongitude(jd) প্রতিবার সেই JD-এর ayanāṃśa ব্যবহার করবে। একটি দিনের শুরুতে ayanāṃśa calculate করে সব trial point-এ constant ধরে নেওয়া unnecessary approximation।
Vedic day-এর সব নক্ষত্র event
public sealed class NakshatraBoundary
{
public int EndingIndex { get; set; }
public int StartingIndex { get; set; }
public double JulianDayUt { get; set; }
public DateTimeOffset InstantUtc { get; set; }
}
public sealed class VedicDayNakshatraReport
{
public DateTimeOffset Sunrise { get; set; }
public DateTimeOffset NextSunrise { get; set; }
public NakshatraState AtSunrise { get; set; }
public IList<NakshatraBoundary> Boundaries { get; set; }
public string AstronomyProfile { get; set; }
public string AyanamsaProfile { get; set; }
}
Scanner current boundary solve করার পর next index/target নিয়ে চলবে যতক্ষণ root nextSunriseJd-এর আগে। Exact next sunrise boundary হলে half-open Vedic-day rule অনুযায়ী event পরের day-এ assign করুন:
sunriseJd <= boundaryJd && boundaryJd < nextSunriseJd
বাংলা clock time, নিশা এবং দণ্ড-পল
একই boundary তিনভাবে দেখানো যেতে পারে:
- Civil clock: রাত ১০:২৬:০৬;
- Vedic-day label: “রাত্র” বা midnight-এর পরে project convention অনুযায়ী “নিশা”;
- Sunrise-relative: দণ্ড/পল/বিপল।
Clock time ও দণ্ড-পল একই absolute instant থেকে render করুন। দুটি আলাদা calculation করলে rounding বা DST-এর কারণে mismatch হতে পারে। Vedic elapsed fraction:
১ দণ্ড = ২৪ মিনিট
১ পল = ২৪ সেকেন্ড
১ বিপল = ০.৪ সেকেন্ড
আপনার project যদি seasonal ৬০-দণ্ড Vedic day scale ব্যবহার করে, সেটি fixed ২৪-minute ghaṭikā থেকে আলাদা profile হিসেবে নাম দিন।
API ও XML output
{
"nakshatraAtSunrise": {
"index": 4,
"key": "rohini",
"nameBn": "রোহিণী",
"pada": 2,
"nirayanaMoonLongitude": 45.125634,
"range": { "start": 40.0, "end": 53.3333333333 }
},
"boundaries": [
{
"endingIndex": 4,
"startingIndex": 5,
"julianDayUt": 2461322.265347,
"localTime": "2026-10-08T23:22:06+06:00"
}
],
"moonReference": "geocentric",
"astronomyProfile": "swiss-ephemeris-2.10",
"ayanamsaProfile": "lahiri",
"ayanamsaDegrees": 24.219876
}
XML:
<nakshatra-day moon-reference="geocentric"
astronomy-profile="swiss-ephemeris-2.10"
ayanamsa-profile="lahiri">
<at-sunrise index="4" key="rohini" pada="2"
moon-longitude="45.125634">রোহিণী</at-sunrise>
<boundary ending="4" starting="5"
jd-ut="2461322.265347"
local="2026-10-08T23:22:06+06:00" />
</nakshatra-day>
উপরের সংখ্যাগুলো format illustration—production test vector নয়। Raw longitude এবং ayanāṃśa যথেষ্ট decimal precision-এ রাখুন; localized text থেকে data পুনর্গঠন করবেন না।
ঐতিহাসিক নক্ষত্র calculation
Historical result-এ ayanāṃśa ও lunar theory বিশেষ গুরুত্বপূর্ণ। Modern Lahiri/Swiss result এবং classical Surya Siddhanta result-এর নক্ষত্র boundary একই নাও হতে পারে। তুলনা করার সময় প্রকাশ করুন:
- Moon model এবং edition/version;
- sidereal zero-point বা ayanāṃśa;
- mean/true/apparent correction;
- UT–TT conversion ও ΔT;
- geocentric/topocentric reference;
- Julian/Gregorian civil display policy।
Julian বনাম Gregorian date label বদলালেও underlying Julian Day boundary বদলায় না। একই historical instant-কে দুই civil calendar-এ dual label দেওয়া যায়।
সাধারণ implementation error
| ভুল | ফল | সংশোধন |
|---|---|---|
| Tropical Moon longitude সরাসরি divide | সমস্ত নক্ষত্র boundary shifted | Chosen ayanāṃśa দিয়ে nirayana longitude |
| তিথির মতো ayanāṃśa cancel ধরা | Wrong index/end time | Nakshatra uses absolute Moon longitude |
360 / 27 integer division | Sector ১৩° হয়ে যায় | 360.0 / 27.0 বা exact arcseconds |
| Rounded DMS থেকে index | Boundary-তে name flip | Raw double longitude থেকে state |
| Linear average Moon speed | End time কয়েক মিনিট/বেশি ভুল | Ephemeris root solve |
| 359°→0° unwrap না করা | রেবতী–অশ্বিনী root fail | Anchor-relative forward arc |
| Location থাকলেই topocentric Moon | Standard Panchanga mismatch | Geocentric profile explicit |
| Abhijit-এর জন্য ৩৬০÷২৮ | সব ২৭ boundary নষ্ট | Separate tradition overlay |
| Sunrise-only sample | Intermediate transition হারায় | Full Vedic-day event scan |
| Profile ID cache key-তে নেই | Ayanāṃśa বদলেও stale result | Versioned cache key |
Validation checklist
- পূর্ণ circle = ১,২৯৬,০০০ arcseconds;
- এক নক্ষত্র = ৪৮,০০০ arcseconds;
- এক pada = ১২,০০০ arcseconds;
- ০° → অশ্বিনী pada ১;
- ৩°২০′ → অশ্বিনী pada ২;
- ১০° → অশ্বিনী pada ৪;
- ১৩°২০′−epsilon → অশ্বিনী;
- ১৩°২০′ exact → ভরণী;
- ২৬°৪০′ exact → কৃত্তিকা;
- ৪০° exact → রোহিণী;
- ৫৩°২০′ exact → মৃগশিরা;
- ১২০° exact → মঘা;
- ২৪০° exact → মূলা;
- ৩৪৬°৪০′ exact → রেবতী;
- ৩৬০° normalized → অশ্বিনী;
- Index সর্বদা ১–২৭;
- Pada সর্বদা ১–৪;
- ২৭ × ৪ = ১০৮ pada;
- প্রতিটি range half-open;
- Adjacent ranges gap/overlap নেই;
- Tropical minus ayanāṃśa normalized;
- Ayanāṃśa exact JD-তে recalculated;
- Lahiri mode explicit;
- Alternative profile cache পৃথক;
- Geocentric flag explicit;
- Topocentric experimental profile পৃথক;
- Rohini example ৪৫° → pada ২;
- রেবতী→অশ্বিনী wrap root;
- Boundary bracket verified;
- Bisection tolerance ≤ declared precision;
- Exact next sunrise boundary next day-এ;
- Vedic-day zero-boundary case;
- এক-boundary case;
- দুই-boundary case;
- Intermediate nakshatra export-এ থাকে;
- “অহোরাত্র” only when no boundary before next sunrise;
- Local time DST-safe conversion;
- Post-midnight “নিশা” format;
- Clock time ও দণ্ড-পল same instant থেকে;
- Language spelling index বদলায় না;
- Abhijit standard index-এ ঢোকে না;
- Surya Siddhanta known-date regression;
- Swiss/Lahiri known-date regression;
- Printed Panchanga end-time comparison;
- API ও XML একই index/pada/root দেয়;
- Historical Julian/Gregorian label JD বদলায় না;
- Astronomy, ayanāṃśa ও renderer version output-এ আছে।
উপসংহার
নক্ষত্র গণনার ভিত্তি হলো চন্দ্রের নিরয়ণ geocentric longitude। ৩৬০° sidereal zodiac-কে ২৭টি ১৩°২০′ sector এবং প্রতিটি sector-কে চারটি ৩°২০′ pada-তে ভাগ করা হয়। Moon যে half-open sector-এ আছে সেটিই current নক্ষত্র; next sector boundary-এর root সেই নক্ষত্রের exact end time।
তিথির বিপরীতে নক্ষত্রে ayanāṃśa cancel করে না। তাই Moon ephemeris-এর পাশাপাশি sidereal mode, ayanāṃśa version, geocentric/topocentric choice এবং time scale প্রকাশ করা জরুরি। রেবতী–অশ্বিনী ৩৬০° wrap, exact boundary semantics এবং root-solver tolerance-ও audit trail-এ রাখুন।
শেষে absolute event-কে local sunrise-to-sunrise window-তে বসিয়ে clock time, নিশা এবং দণ্ড-পল render করুন। Calculation core, daily assignment ও language resource আলাদা থাকলে একই engine বাংলা, অসমীয়া বা অন্য ভাষায় নির্ভরযোগ্য Panchanga output দিতে পারবে।
তথ্যসূত্র ও আরও পাঠ
- Astrodienst—Swiss Ephemeris Programmer’s Documentation; sidereal mode, ayanāṃśa functions, time scale এবং planetary-position interface.
- Swiss Ephemeris General Documentation; sidereal ephemerides, predefined ayanāṃśas এবং Lahiri comparison.
- Astrodienst—Official Swiss Ephemeris source repository; supported ayanāṃśa modes ও calculation implementation reference.
- Nachum Dershowitz ও Edward M. Reingold—Indian Calendrical Calculations; Indian calendrical elements, astronomical models ও sunrise-based day assignment.
- Vinod K. Mishra—Calendars of India; ভারতীয় calendrical elements ও modern astronomical terminology.
- Positional Astronomy Centre—Rashtriya Panchang; nirayana planetary longitudes, nakṣatra timings এবং official almanac context.
- সূর্য সিদ্ধান্ত পঞ্জিকা project specification; Bengali nakṣatra names, sunrise-to-sunrise event scan, দণ্ড-পল display ও versioned calculation profiles.
মন্তব্য, আলোচনা ও প্রশ্ন