Skip to content

Commit 893cd19

Browse files
committed
fix undefined tithi for some days. fix bsDay in combobox
1 parent 2e94b17 commit 893cd19

File tree

5 files changed

+86
-73
lines changed

5 files changed

+86
-73
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: 41 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,22 @@
55
#include <string>
66

77
#define PI 3.14159265358979323846
8-
#define r2d 180.0 / PI
9-
#define d2r PI / 180.0
8+
#define r2d (180.0 / PI)
9+
#define d2r (PI / 180.0)
1010

1111
// Tithi names in Nepali
1212
static const char tithi[][30] = { "प्रथमा", "द्वितीया", "तृतीया", "चतुर्थी", "पंचमी", "षष्ठी", "सप्तमी", "अष्टमी",
1313
"नवमी", "दशमी", "एकादशी", "द्वादशी", "त्रयोदशी", "चतुर्दशी", "पूर्णिमा", "प्रथमा",
1414
"द्वितीया", "तृतीया", "चतुर्थी", "पंचमी", "षष्ठी", "सप्तमी", "अष्टमी", "नवमी", "दशमी",
1515
"एकादशी", "द्वादशी", "त्रयोदशी", "चतुर्दशी", "अमावस्या" };
16+
1617
class Panchang {
1718
public:
1819
double tdays;
19-
double t, tithi_index/*, nakshatra_index, yoga_index*/;
20+
double t, tithi_index;
2021
std::string paksha;
2122

22-
23+
// Constructor accepting a Julian date
2324
Panchang(double julianDate) {
2425
tdays = julianDate - 2451545.0; // Days since J2000.0
2526
t = tdays / 36525.0;
@@ -30,52 +31,61 @@ class Panchang {
3031
calculateTithi();
3132
}
3233

33-
3434
private:
3535
void calculateTithi() {
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);
3950

51+
// Calculate the difference
4052
double difference = moon_longitude - sun_longitude;
4153
if (difference < 0) difference += 360.0;
4254

4355
tithi_index = std::floor(difference / 12.0);
44-
45-
4656
paksha = (tithi_index < 15) ? "शुक्ल पक्ष" : "कृष्ण पक्ष";
47-
//debug print
48-
//std::cout << "Tithi: " << tithi[(int)tithi_index] << " (" << paksha << ")" << std::endl;
49-
}
50-
51-
5257

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

6562
double getMoonLongitude() {
6663
double L1 = 218.316 + 481267.8813 * t;
67-
double M1 = 134.963 + 477198.8676 * t;
68-
// double F = 93.272 + 483202.0175 * t; the Moon's argument of latitude Not used now
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+
}
6978

70-
L1 = fmod(L1, 360.0);
71-
M1 = fmod(M1, 360.0);
72-
// F = fmod(F, 360.0); the Moon's argument of latitude Not used now
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);
7385

74-
double longitude = L1 + 6.289 * sin(M1 * d2r);
75-
longitude = fmod(longitude, 360.0);
76-
return longitude;
86+
double sunLongitude = l0 + c;
87+
return fmod(sunLongitude, 360.0);
7788
}
78-
7989
};
8090

8191
double gregorianToJulian(int year, int month, int day);

0 commit comments

Comments
 (0)