Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
72 changes: 35 additions & 37 deletions bikram.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,23 @@

#include <cmath>

class bikram {
class Bikram {
private:
int Year = 0;
int Month = -1;
int Day = 0;

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

void get_saura_masa_day(long ahar, int* m, int* d) const;
int today_saura_masa_first_p(long ahar) const;
double get_tslong(long ahar) const;
double get_julian_date(int year, int month, int day) const;
void getSauraMasaDay(long ahar, int* m, int* d) const;
int todaySauraMasaFirstP(long ahar) const;
double getTslong(long ahar) const;
double getJulianDate(int year, int month, int day) const;
void fromJulianDate(double julian_date, int& year, int& month, int& day) const;

public:
Expand All @@ -31,32 +31,32 @@ class bikram {
int daysInMonth(int year, int month);
};

inline void bikram::get_saura_masa_day(long ahar, int* m, int* d) const {
inline void Bikram::getSauraMasaDay(long ahar, int* m, int* d) const {
double tslong_tomorrow;
int month;
int day;
if (today_saura_masa_first_p(ahar)) {
if (todaySauraMasaFirstP(ahar)) {
day = 1;
tslong_tomorrow = get_tslong(ahar + 1);
month = (long)(tslong_tomorrow / 30) % 12;
tslong_tomorrow = getTslong(ahar + 1);
month = static_cast<int>(tslong_tomorrow / 30) % 12;
month = (month + 12) % 12;
} else {
get_saura_masa_day(ahar - 1, &month, &day);
getSauraMasaDay(ahar - 1, &month, &day);
day += 1;
}
*m = month;
*d = day;
}

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

inline double bikram::get_tslong(long ahar) const {
inline double Bikram::getTslong(long ahar) const {
double mslong;
double t1 = (YugaRotation_sun * ahar / YugaCivilDays);
t1 -= static_cast<long>(t1);
Expand All @@ -70,17 +70,17 @@ inline double bikram::get_tslong(long ahar) const {
return x3;
}

inline double bikram::get_julian_date(int year, int month, int day) const {
inline double Bikram::getJulianDate(int year, int month, int day) const {
if (month <= 2) {
year -= 1;
month += 12;
}
double a = floor(year / 100.0);
double b = 2 - a + floor(a / 4.0);
return floor(365.25 * (year + 4716)) + floor(30.6001 * (month + 1)) + day + b - 1524.5;
return floor (365.25 * (year + 4716)) + floor(30.6001 * (month + 1)) + day + b - 1524.5;
}

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

inline void bikram::fromGregorian(int y, int m, int d) {
YugaCivilDays = YugaRotation_star - YugaRotation_sun;
double julian = get_julian_date(y, m, d);
inline void Bikram::fromGregorian(int y, int m, int d) {
double julian = getJulianDate(y, m, d);
long ahar = julian - 588465.5;
int saura_masa_num;
int saura_masa_day;
get_saura_masa_day(ahar, &saura_masa_num, &saura_masa_day);
getSauraMasaDay(ahar, &saura_masa_num, &saura_masa_day);
long YearKali = static_cast<long>(ahar * YugaRotation_sun / YugaCivilDays);
int YearSaka = YearKali - 3179;
int nepalimonth = (saura_masa_num) % 12;
Expand All @@ -107,42 +106,41 @@ inline void bikram::fromGregorian(int y, int m, int d) {
Day = saura_masa_day;
}

inline void bikram::toGregorian(int bsYear, int bsMonth, int bsDay, int& gYear, int& gMonth, int& gDay) {
YugaCivilDays = YugaRotation_star - YugaRotation_sun;
inline void Bikram::toGregorian(int bsYear, int bsMonth, int bsDay, int& gYear, int& gMonth, int& gDay) {
int YearSaka = bsYear - 135;
long YearKali = YearSaka + 3179;
long ahar = static_cast<long>((YearKali * YugaCivilDays) / YugaRotation_sun);
int saura_masa_num, saura_masa_day;
get_saura_masa_day(ahar, &saura_masa_num, &saura_masa_day);
getSauraMasaDay(ahar, &saura_masa_num, &saura_masa_day);
bsMonth = (bsMonth + 11) % 12;
while (saura_masa_num != bsMonth || saura_masa_day != bsDay) {
ahar += (saura_masa_num < bsMonth || (saura_masa_num == bsMonth && saura_masa_day < bsDay)) ? 1 : -1;
get_saura_masa_day(ahar, &saura_masa_num, &saura_masa_day);
getSauraMasaDay(ahar, &saura_masa_num, &saura_masa_day);
}
double julian_date = ahar + 588465.5;
fromJulianDate(julian_date, gYear, gMonth, gDay);
}

inline int bikram::getYear() const {
inline int Bikram::getYear() const {
return Year;
}

inline int bikram::getMonth() const {
inline int Bikram::getMonth() const {
return Month + 1;
}

inline int bikram::getDay() const {
inline int Bikram::getDay() const {
return Day;
}

inline int bikram::daysInMonth(int bsYear, int bsMonth) {
inline int Bikram::daysInMonth(int bsYear, int bsMonth) {
int gYear, gMonth, gDay;
int nextMonth = (bsMonth % 12) + 1;
int nextYear = (bsMonth == 12) ? bsYear + 1 : bsYear;
toGregorian(bsYear, bsMonth, 1, gYear, gMonth, gDay);
double julian_date_start = get_julian_date(gYear, gMonth, gDay);
double julian_date_start = getJulianDate(gYear, gMonth, gDay);
toGregorian(nextYear, nextMonth, 1, gYear, gMonth, gDay);
double julian_date_end = get_julian_date(gYear, gMonth, gDay);
double julian_date_end = getJulianDate(gYear, gMonth, gDay);
return static_cast<int>(julian_date_end - julian_date_start);
}

Expand Down
11 changes: 8 additions & 3 deletions calendarwindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -424,9 +424,14 @@ void CalendarWindow::onBsDayChanged(int /*index*/) {
int day = ui->dayselectBS->currentText().toInt();

updateAdDateFromBs(year, month, day);

// Ensure the selected day remains consistent
if (ui->dayselectBS->currentText().toInt() != day) {
ui->dayselectBS->setCurrentText(QString::number(day));
}

blockSignals = false;
}

void CalendarWindow::updateBsDateFromAd(int year, int month, int day) {
converter.fromGregorian(year, month, day);

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


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

// Update the calendar
updateCalendar(year, month);
Expand Down
2 changes: 1 addition & 1 deletion calendarwindow.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ private slots:

private:
Ui::CalendarWindow *ui;
bikram converter;
Bikram converter;
bool blockSignals;
int gYear, gMonth, gDay; // Moved to private section for encapsulation
QDate currentBikramDate;
Expand Down
2 changes: 1 addition & 1 deletion mainwindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,7 @@ MainWindow::~MainWindow()
// considering bikram date as nepali date.
int MainWindow::cnvToNepali(int mm, int dd, int yy) {
// Perform the conversion using the bikram class
bikram bsdate;
Bikram bsdate;
bsdate.fromGregorian(yy, mm, dd); // Convert the provided Gregorian date to Bikram Sambat

// Get the converted Nepali date components from the bikram class
Expand Down
73 changes: 44 additions & 29 deletions panchanga.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,24 +3,24 @@

#include <cmath>
#include <string>
#include <iostream>

#define PI 3.14159265358979323846
#define r2d 180.0 / PI
#define d2r PI / 180.0
#define r2d (180.0 / PI)
#define d2r (PI / 180.0)

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

class Panchang {
public:
double tdays;
double t, tithi_index;
std::string paksha;

// Constructor accepting a Julian date
Panchang(double julianDate) {
tdays = julianDate - 2451545.0; // Days since J2000.0
t = tdays / 36525.0;
Expand All @@ -36,40 +36,55 @@ class Panchang {
double moon_longitude = getMoonLongitude();
double sun_longitude = getSunLongitude();

// Adjust for Nepal time (UTC+5:45)
double nepalTimeOffset = 5.75; // in hours
double localTimeAdjustment = nepalTimeOffset * 15; // Convert hours to degrees

// Adjust the longitudes
moon_longitude += localTimeAdjustment;
sun_longitude += localTimeAdjustment;

// Wrap around to keep within 0-360 degrees
moon_longitude = fmod(moon_longitude + 360.0, 360.0);
sun_longitude = fmod(sun_longitude + 360.0, 360.0);

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

// Round the tithi index according to the specified rules
tithi_index = std::round(difference / 12.0);
tithi_index = static_cast<int>(tithi_index) % 30; // Wrap around to ensure valid index

tithi_index = std::floor(difference / 12.0);
paksha = (tithi_index < 15) ? "शुक्ल पक्ष" : "कृष्ण पक्ष";

// Debug print
std::cout << "Tithi: " << tithi[static_cast<int>(tithi_index)] << " (" << paksha << ")" << std::endl;
}

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

double getMoonLongitude() {
double L1 = 218.316 + 481267.8813 * t;
double M1 = 134.963 + 477198.8676 * t;
double D = 297.8502 + 445267.1115 * t;
// double M = 357.5291 + 35999.0503 * t;
double M1 = 134.963 + 477198.8671 * t;
// double F = 93.272 + 483202.0175 * t;

double moonLongitude = L1
+ (6.289 * sin(M1 * M_PI / 180.0))
- (1.274 * sin((2 * D - M1) * M_PI / 180.0))
- (0.658 * sin(2 * D * M_PI / 180.0))
- (0.214 * sin(2 * M1 * M_PI / 180.0))
+ (0.11 * sin(D * M_PI / 180.0));

return fmod(moonLongitude, 360.0);
}

L1 = fmod(L1, 360.0);
M1 = fmod(M1, 360.0);
double getSunLongitude() {
double l0 = 280.4665 + 36000.7698 * t;
double m = 357.5291 + 35999.0503 * t;
double c = (1.9146 - 0.004817 * t - 0.000014 * t * t) * sin(m * M_PI / 180.0)
+ (0.019993 - 0.000101 * t) * sin(2 * m * M_PI / 180.0)
+ 0.000289 * sin(3 * m * M_PI / 180.0);

double longitude = L1 + 6.289 * sin(M1 * d2r);
longitude = fmod(longitude, 360.0);
return longitude;
double sunLongitude = l0 + c;
return fmod(sunLongitude, 360.0);
}
};

Expand Down
Loading