Skip to content

Commit 567338f

Browse files
authored
fix undefined tithi for some days. fix bsDay in combobox (#28)
1 parent f4d0ca7 commit 567338f

File tree

5 files changed

+89
-71
lines changed

5 files changed

+89
-71
lines changed

bikram.h

Lines changed: 35 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,23 @@
33

44
#include <cmath>
55

6-
class bikram {
6+
class Bikram {
77
private:
88
int Year = 0;
99
int Month = -1;
1010
int Day = 0;
1111

1212
double YugaRotation_star = 1582237828;
1313
double YugaRotation_sun = 4320000;
14-
double YugaCivilDays;
15-
double PlanetApogee_sun = 77 + static_cast<float>(17) / 60;
16-
double PlanetCircumm_sun = 13 + static_cast<float>(50) / 60;
14+
double YugaCivilDays = YugaRotation_star - YugaRotation_sun; // Initialize here
15+
double PlanetApogee_sun = 77 + 17.0 / 60; // Use double for division
16+
double PlanetCircumm_sun = 13 + 50.0 / 60; // Use double for division
1717
static constexpr double rad = 57.2957795; // 180 / pi
1818

19-
void get_saura_masa_day(long ahar, int* m, int* d) const;
20-
int today_saura_masa_first_p(long ahar) const;
21-
double get_tslong(long ahar) const;
22-
double get_julian_date(int year, int month, int day) const;
19+
void getSauraMasaDay(long ahar, int* m, int* d) const;
20+
int todaySauraMasaFirstP(long ahar) const;
21+
double getTslong(long ahar) const;
22+
double getJulianDate(int year, int month, int day) const;
2323
void fromJulianDate(double julian_date, int& year, int& month, int& day) const;
2424

2525
public:
@@ -31,32 +31,32 @@ class bikram {
3131
int daysInMonth(int year, int month);
3232
};
3333

34-
inline void bikram::get_saura_masa_day(long ahar, int* m, int* d) const {
34+
inline void Bikram::getSauraMasaDay(long ahar, int* m, int* d) const {
3535
double tslong_tomorrow;
3636
int month;
3737
int day;
38-
if (today_saura_masa_first_p(ahar)) {
38+
if (todaySauraMasaFirstP(ahar)) {
3939
day = 1;
40-
tslong_tomorrow = get_tslong(ahar + 1);
41-
month = (long)(tslong_tomorrow / 30) % 12;
40+
tslong_tomorrow = getTslong(ahar + 1);
41+
month = static_cast<int>(tslong_tomorrow / 30) % 12;
4242
month = (month + 12) % 12;
4343
} else {
44-
get_saura_masa_day(ahar - 1, &month, &day);
44+
getSauraMasaDay(ahar - 1, &month, &day);
4545
day += 1;
4646
}
4747
*m = month;
4848
*d = day;
4949
}
5050

51-
inline int bikram::today_saura_masa_first_p(long ahar) const {
52-
double tslong_today = get_tslong(ahar);
53-
double tslong_tomorrow = get_tslong(ahar + 1);
54-
tslong_today = tslong_today - (int)(tslong_today / 30) * 30;
55-
tslong_tomorrow = tslong_tomorrow - (int)(tslong_tomorrow / 30) * 30;
56-
return (25 < tslong_today) && (tslong_tomorrow < 5) ? 1 : 0;
51+
inline int Bikram::todaySauraMasaFirstP(long ahar) const {
52+
double tslong_today = getTslong(ahar);
53+
double tslong_tomorrow = getTslong(ahar + 1);
54+
tslong_today -= static_cast<int>(tslong_today / 30) * 30;
55+
tslong_tomorrow -= static_cast<int>(tslong_tomorrow / 30) * 30;
56+
return (25 < tslong_today && tslong_tomorrow < 5) ? 1 : 0;
5757
}
5858

59-
inline double bikram::get_tslong(long ahar) const {
59+
inline double Bikram::getTslong(long ahar) const {
6060
double mslong;
6161
double t1 = (YugaRotation_sun * ahar / YugaCivilDays);
6262
t1 -= static_cast<long>(t1);
@@ -70,17 +70,17 @@ inline double bikram::get_tslong(long ahar) const {
7070
return x3;
7171
}
7272

73-
inline double bikram::get_julian_date(int year, int month, int day) const {
73+
inline double Bikram::getJulianDate(int year, int month, int day) const {
7474
if (month <= 2) {
7575
year -= 1;
7676
month += 12;
7777
}
7878
double a = floor(year / 100.0);
7979
double b = 2 - a + floor(a / 4.0);
80-
return floor(365.25 * (year + 4716)) + floor(30.6001 * (month + 1)) + day + b - 1524.5;
80+
return floor (365.25 * (year + 4716)) + floor(30.6001 * (month + 1)) + day + b - 1524.5;
8181
}
8282

83-
inline void bikram::fromJulianDate(double julian_date, int& year, int& month, int& day) const {
83+
inline void Bikram::fromJulianDate(double julian_date, int& year, int& month, int& day) const {
8484
int a = static_cast<int>(julian_date + 0.5);
8585
int b = a + 1537;
8686
int c = static_cast<int>((b - 122.1) / 365.25);
@@ -92,13 +92,12 @@ inline void bikram::fromJulianDate(double julian_date, int& year, int& month, in
9292
year = (month > 2) ? (c - 4716) : (c - 4715);
9393
}
9494

95-
inline void bikram::fromGregorian(int y, int m, int d) {
96-
YugaCivilDays = YugaRotation_star - YugaRotation_sun;
97-
double julian = get_julian_date(y, m, d);
95+
inline void Bikram::fromGregorian(int y, int m, int d) {
96+
double julian = getJulianDate(y, m, d);
9897
long ahar = julian - 588465.5;
9998
int saura_masa_num;
10099
int saura_masa_day;
101-
get_saura_masa_day(ahar, &saura_masa_num, &saura_masa_day);
100+
getSauraMasaDay(ahar, &saura_masa_num, &saura_masa_day);
102101
long YearKali = static_cast<long>(ahar * YugaRotation_sun / YugaCivilDays);
103102
int YearSaka = YearKali - 3179;
104103
int nepalimonth = (saura_masa_num) % 12;
@@ -107,42 +106,41 @@ inline void bikram::fromGregorian(int y, int m, int d) {
107106
Day = saura_masa_day;
108107
}
109108

110-
inline void bikram::toGregorian(int bsYear, int bsMonth, int bsDay, int& gYear, int& gMonth, int& gDay) {
111-
YugaCivilDays = YugaRotation_star - YugaRotation_sun;
109+
inline void Bikram::toGregorian(int bsYear, int bsMonth, int bsDay, int& gYear, int& gMonth, int& gDay) {
112110
int YearSaka = bsYear - 135;
113111
long YearKali = YearSaka + 3179;
114112
long ahar = static_cast<long>((YearKali * YugaCivilDays) / YugaRotation_sun);
115113
int saura_masa_num, saura_masa_day;
116-
get_saura_masa_day(ahar, &saura_masa_num, &saura_masa_day);
114+
getSauraMasaDay(ahar, &saura_masa_num, &saura_masa_day);
117115
bsMonth = (bsMonth + 11) % 12;
118116
while (saura_masa_num != bsMonth || saura_masa_day != bsDay) {
119117
ahar += (saura_masa_num < bsMonth || (saura_masa_num == bsMonth && saura_masa_day < bsDay)) ? 1 : -1;
120-
get_saura_masa_day(ahar, &saura_masa_num, &saura_masa_day);
118+
getSauraMasaDay(ahar, &saura_masa_num, &saura_masa_day);
121119
}
122120
double julian_date = ahar + 588465.5;
123121
fromJulianDate(julian_date, gYear, gMonth, gDay);
124122
}
125123

126-
inline int bikram::getYear() const {
124+
inline int Bikram::getYear() const {
127125
return Year;
128126
}
129127

130-
inline int bikram::getMonth() const {
128+
inline int Bikram::getMonth() const {
131129
return Month + 1;
132130
}
133131

134-
inline int bikram::getDay() const {
132+
inline int Bikram::getDay() const {
135133
return Day;
136134
}
137135

138-
inline int bikram::daysInMonth(int bsYear, int bsMonth) {
136+
inline int Bikram::daysInMonth(int bsYear, int bsMonth) {
139137
int gYear, gMonth, gDay;
140138
int nextMonth = (bsMonth % 12) + 1;
141139
int nextYear = (bsMonth == 12) ? bsYear + 1 : bsYear;
142140
toGregorian(bsYear, bsMonth, 1, gYear, gMonth, gDay);
143-
double julian_date_start = get_julian_date(gYear, gMonth, gDay);
141+
double julian_date_start = getJulianDate(gYear, gMonth, gDay);
144142
toGregorian(nextYear, nextMonth, 1, gYear, gMonth, gDay);
145-
double julian_date_end = get_julian_date(gYear, gMonth, gDay);
143+
double julian_date_end = getJulianDate(gYear, gMonth, gDay);
146144
return static_cast<int>(julian_date_end - julian_date_start);
147145
}
148146

calendarwindow.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -424,9 +424,14 @@ void CalendarWindow::onBsDayChanged(int /*index*/) {
424424
int day = ui->dayselectBS->currentText().toInt();
425425

426426
updateAdDateFromBs(year, month, day);
427+
428+
// Ensure the selected day remains consistent
429+
if (ui->dayselectBS->currentText().toInt() != day) {
430+
ui->dayselectBS->setCurrentText(QString::number(day));
431+
}
432+
427433
blockSignals = false;
428434
}
429-
430435
void CalendarWindow::updateBsDateFromAd(int year, int month, int day) {
431436
converter.fromGregorian(year, month, day);
432437

@@ -496,14 +501,14 @@ void CalendarWindow::updateAdDateFromBs(int year, int month, int day) {
496501

497502

498503
int bsDaysInMonth = converter.daysInMonth(year, month);
499-
QString bsMonthName = getBikramMonthName(month);
504+
QString gmonthname = getEnglishMonthName(gMonth);
500505
double julianDate = gregorianToJulian(gYear, gMonth, gDay);
501506
Panchang panchang(julianDate);
502507
QString tithiName = QString::fromStdString(tithi[(int)panchang.tithi_index]);
503508
QString paksha = QString::fromStdString(panchang.paksha);
504509
QString tithipaksha = QString("%1 %2").arg(paksha).arg(tithiName);
505510
ui->output->setText(QString("ईसवी सन मा परिवर्तन गरियो: %1 %2 %3 गते %5 \n%2 %1 मा जम्मा दिन सङ्ख्या: %4")
506-
.arg(convertToNepaliNumerals(gYear)).arg(bsMonthName).arg(convertToNepaliNumerals(gDay)).arg(convertToNepaliNumerals(bsDaysInMonth)).arg(tithipaksha));
511+
.arg(convertToNepaliNumerals(gYear)).arg(gmonthname).arg(convertToNepaliNumerals(gDay)).arg(convertToNepaliNumerals(bsDaysInMonth)).arg(tithipaksha));
507512

508513
// Update the calendar
509514
updateCalendar(year, month);

calendarwindow.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ private slots:
5252

5353
private:
5454
Ui::CalendarWindow *ui;
55-
bikram converter;
55+
Bikram converter;
5656
bool blockSignals;
5757
int gYear, gMonth, gDay; // Moved to private section for encapsulation
5858
QDate currentBikramDate;

mainwindow.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ MainWindow::~MainWindow()
145145
// considering bikram date as nepali date.
146146
int MainWindow::cnvToNepali(int mm, int dd, int yy) {
147147
// Perform the conversion using the bikram class
148-
bikram bsdate;
148+
Bikram bsdate;
149149
bsdate.fromGregorian(yy, mm, dd); // Convert the provided Gregorian date to Bikram Sambat
150150

151151
// Get the converted Nepali date components from the bikram class

panchanga.h

Lines changed: 44 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,24 @@
33

44
#include <cmath>
55
#include <string>
6-
#include <iostream>
76

87
#define PI 3.14159265358979323846
9-
#define r2d 180.0 / PI
10-
#define d2r PI / 180.0
8+
#define r2d (180.0 / PI)
9+
#define d2r (PI / 180.0)
1110

1211
// Tithi names in Nepali
1312
static const char tithi[][30] = { "प्रथमा", "द्वितीया", "तृतीया", "चतुर्थी", "पंचमी", "षष्ठी", "सप्तमी", "अष्टमी",
14-
"नवमी", "दशमी", "एकादशी", "द्वादशी", "त्रयोदशी", "चतुर्दशी", "पूर्णिमा", "प्रथमा",
15-
"द्वितीया", "तृतीया", "चतुर्थी", "पंचमी", "षष्ठी", "सप्तमी", "अष्टमी", "नवमी", "दशमी",
16-
"एकादशी", "द्वादशी", "त्रयोदशी", "चतुर्दशी", "अमावस्या" };
13+
"नवमी", "दशमी", "एकादशी", "द्वादशी", "त्रयोदशी", "चतुर्दशी", "पूर्णिमा", "प्रथमा",
14+
"द्वितीया", "तृतीया", "चतुर्थी", "पंचमी", "षष्ठी", "सप्तमी", "अष्टमी", "नवमी", "दशमी",
15+
"एकादशी", "द्वादशी", "त्रयोदशी", "चतुर्दशी", "अमावस्या" };
1716

1817
class Panchang {
1918
public:
2019
double tdays;
2120
double t, tithi_index;
2221
std::string paksha;
2322

23+
// Constructor accepting a Julian date
2424
Panchang(double julianDate) {
2525
tdays = julianDate - 2451545.0; // Days since J2000.0
2626
t = tdays / 36525.0;
@@ -36,40 +36,55 @@ class Panchang {
3636
double moon_longitude = getMoonLongitude();
3737
double sun_longitude = getSunLongitude();
3838

39+
// Adjust for Nepal time (UTC+5:45)
40+
double nepalTimeOffset = 5.75; // in hours
41+
double localTimeAdjustment = nepalTimeOffset * 15; // Convert hours to degrees
42+
43+
// Adjust the longitudes
44+
moon_longitude += localTimeAdjustment;
45+
sun_longitude += localTimeAdjustment;
46+
47+
// Wrap around to keep within 0-360 degrees
48+
moon_longitude = fmod(moon_longitude + 360.0, 360.0);
49+
sun_longitude = fmod(sun_longitude + 360.0, 360.0);
50+
51+
// Calculate the difference
3952
double difference = moon_longitude - sun_longitude;
4053
if (difference < 0) difference += 360.0;
4154

42-
// Round the tithi index according to the specified rules
43-
tithi_index = std::round(difference / 12.0);
44-
tithi_index = static_cast<int>(tithi_index) % 30; // Wrap around to ensure valid index
45-
55+
tithi_index = std::floor(difference / 12.0);
4656
paksha = (tithi_index < 15) ? "शुक्ल पक्ष" : "कृष्ण पक्ष";
47-
48-
// Debug print
49-
std::cout << "Tithi: " << tithi[static_cast<int>(tithi_index)] << " (" << paksha << ")" << std::endl;
50-
}
5157

52-
double getSunLongitude() {
53-
double l0 = 280.4665 + 36000.7698 * t;
54-
double m = 357.5291 + 35999.0503 * t;
55-
double c = (1.9146 - 0.004817 * t - 0.000014 * t * t) * sin(m * d2r)
56-
+ (0.019993 - 0.000101 * t) * sin(2 * m * d2r)
57-
+ 0.00029 * sin(3 * m * d2r);
58-
double theta = l0 + c;
59-
double lambda = theta - 0.00569 - 0.00478 * sin((125.04 - 1934.136 * t) * d2r);
60-
return fmod(lambda, 360.0);
58+
// Debug print
59+
// std::cout << "Tithi: " << tithi[(int)tithi_index] << " (" << paksha << ")" << std::endl;
6160
}
6261

6362
double getMoonLongitude() {
6463
double L1 = 218.316 + 481267.8813 * t;
65-
double M1 = 134.963 + 477198.8676 * t;
64+
double D = 297.8502 + 445267.1115 * t;
65+
// double M = 357.5291 + 35999.0503 * t;
66+
double M1 = 134.963 + 477198.8671 * t;
67+
// double F = 93.272 + 483202.0175 * t;
68+
69+
double moonLongitude = L1
70+
+ (6.289 * sin(M1 * M_PI / 180.0))
71+
- (1.274 * sin((2 * D - M1) * M_PI / 180.0))
72+
- (0.658 * sin(2 * D * M_PI / 180.0))
73+
- (0.214 * sin(2 * M1 * M_PI / 180.0))
74+
+ (0.11 * sin(D * M_PI / 180.0));
75+
76+
return fmod(moonLongitude, 360.0);
77+
}
6678

67-
L1 = fmod(L1, 360.0);
68-
M1 = fmod(M1, 360.0);
79+
double getSunLongitude() {
80+
double l0 = 280.4665 + 36000.7698 * t;
81+
double m = 357.5291 + 35999.0503 * t;
82+
double c = (1.9146 - 0.004817 * t - 0.000014 * t * t) * sin(m * M_PI / 180.0)
83+
+ (0.019993 - 0.000101 * t) * sin(2 * m * M_PI / 180.0)
84+
+ 0.000289 * sin(3 * m * M_PI / 180.0);
6985

70-
double longitude = L1 + 6.289 * sin(M1 * d2r);
71-
longitude = fmod(longitude, 360.0);
72-
return longitude;
86+
double sunLongitude = l0 + c;
87+
return fmod(sunLongitude, 360.0);
7388
}
7489
};
7590

0 commit comments

Comments
 (0)