Code Sketch
n yoiiiiii
Category: Programming
import javax.swing._
import java.awt._
import java.awt.event._
import java.awt.geom._
import scala.math._
// ============================================================
// KUNDALI PURAN
// VEDIC KUNDALI CALCULATOR - SINGLE FILE
// ============================================================
val window = new JFrame("KUNDALI PURAN - Vedic Kundali")
window.setDefaultCloseOperation(
WindowConstants.EXIT_ON_CLOSE
)
window.setSize(1200, 800)
window.setResizable(false)
// ============================================================
// MAIN PANEL
// ============================================================
val mainPanel = new JPanel()
mainPanel.setLayout(null)
mainPanel.setBackground(
new Color(8, 8, 28)
)
window.setContentPane(mainPanel)
// ============================================================
// TITLE
// ============================================================
val title = new JLabel(
"<html><center>" +
"<font color='#FFD76A' size='6'>" +
"? KUNDALI PURAN ?" +
"</font><br>" +
"<font color='#EBD9A0' size='3'>" +
"Vedic ? Sidereal ? Birth Chart Calculator" +
"</font>" +
"</center></html>",
SwingConstants.CENTER
)
title.setBounds(
170,
15,
860,
90
)
mainPanel.add(title)
// ============================================================
// INPUT CARD
// ============================================================
val inputCard = new JPanel()
inputCard.setLayout(null)
inputCard.setBackground(
new Color(24, 20, 50)
)
inputCard.setBorder(
BorderFactory.createLineBorder(
new Color(220, 170, 70),
2
)
)
inputCard.setBounds(
35,
120,
480,
610
)
mainPanel.add(inputCard)
// ============================================================
// RESULT CARD
// ============================================================
val resultCard = new JPanel()
resultCard.setLayout(null)
resultCard.setBackground(
new Color(18, 17, 42)
)
resultCard.setBorder(
BorderFactory.createLineBorder(
new Color(220, 170, 70),
2
)
)
resultCard.setBounds(
535,
120,
630,
610
)
mainPanel.add(resultCard)
// ============================================================
// INPUT TITLE
// ============================================================
val inputTitle = new JLabel(
"? BIRTH DETAILS ?",
SwingConstants.CENTER
)
inputTitle.setForeground(
new Color(255, 220, 120)
)
inputTitle.setFont(
new Font(
"Serif",
Font.BOLD,
24
)
)
inputTitle.setBounds(
40,
20,
400,
40
)
inputCard.add(inputTitle)
// ============================================================
// LABEL HELPER
// ============================================================
def addInputLabel(
text: String,
y: Int
): JLabel = {
val label = new JLabel(text)
label.setForeground(
new Color(240, 230, 205)
)
label.setFont(
new Font(
"SansSerif",
Font.BOLD,
15
)
)
label.setBounds(
35,
y,
150,
30
)
inputCard.add(label)
label
}
// ============================================================
// FIELD HELPER
// ============================================================
def addInputField(
y: Int
): JTextField = {
val field = new JTextField()
field.setFont(
new Font(
"SansSerif",
Font.PLAIN,
16
)
)
field.setBackground(
new Color(250, 245, 230)
)
field.setForeground(
new Color(30, 25, 40)
)
field.setBounds(
185,
y,
255,
36
)
inputCard.add(field)
field
}
// ============================================================
// INPUTS
// ============================================================
addInputLabel(
"First Name",
80
)
val firstName =
addInputField(77)
addInputLabel(
"Surname",
130
)
val surname =
addInputField(127)
addInputLabel(
"Birth Date",
180
)
val birthDate =
addInputField(177)
birthDate.setToolTipText(
"DD/MM/YYYY"
)
addInputLabel(
"Birth Time",
230
)
val birthTime =
addInputField(227)
birthTime.setToolTipText(
"HH:MM:SS"
)
addInputLabel(
"Birth Place",
280
)
val birthPlace =
addInputField(277)
addInputLabel(
"Latitude",
330
)
val latitude =
addInputField(327)
latitude.setToolTipText(
"Example: 18.5204"
)
addInputLabel(
"Longitude",
380
)
val longitude =
addInputField(377)
longitude.setToolTipText(
"Example: 73.8567"
)
addInputLabel(
"Timezone",
430
)
val timezone =
addInputField(427)
timezone.setText(
"5.5"
)
// ============================================================
// INFO
// ============================================================
val smallInfo = new JLabel(
"<html><center>" +
"For India normally use timezone <b>5.5</b>.<br>" +
"Latitude/Longitude should be the actual<br>" +
"birth-place coordinates for accurate Lagna."
+
"</center></html>",
SwingConstants.CENTER
)
smallInfo.setForeground(
new Color(210, 195, 160)
)
smallInfo.setFont(
new Font(
"SansSerif",
Font.PLAIN,
12
)
)
smallInfo.setBounds(
30,
475,
420,
55
)
inputCard.add(smallInfo)
// ============================================================
// BUTTON
// ============================================================
val calculateButton =
new JButton(
"? CALCULATE KUNDALI ?"
)
calculateButton.setFont(
new Font(
"SansSerif",
Font.BOLD,
16
)
)
calculateButton.setForeground(
Color.WHITE
)
calculateButton.setBackground(
new Color(
160,
85,
25
)
)
calculateButton.setFocusPainted(
false
)
calculateButton.setBounds(
55,
540,
370,
48
)
inputCard.add(calculateButton)
// ============================================================
// RESULT TITLE
// ============================================================
val resultTitle =
new JLabel(
"? KUNDALI REPORT ?",
SwingConstants.CENTER
)
resultTitle.setForeground(
new Color(
255,
220,
120
)
)
resultTitle.setFont(
new Font(
"Serif",
Font.BOLD,
24
)
)
resultTitle.setBounds(
40,
18,
550,
40
)
resultCard.add(resultTitle)
// ============================================================
// RESULT TEXT
// ============================================================
val result =
new JTextArea()
result.setEditable(false)
result.setLineWrap(false)
result.setFont(
new Font(
"Monospaced",
Font.PLAIN,
14
)
)
result.setForeground(
new Color(
250,
235,
190
)
)
result.setBackground(
new Color(
10,
10,
28
)
)
result.setBorder(
BorderFactory.createLineBorder(
new Color(
130,
100,
50
)
)
)
val scroll =
new JScrollPane(result)
scroll.setBounds(
25,
70,
580,
515
)
resultCard.add(scroll)
// ============================================================
// MATH UTILITIES
// ============================================================
def normalize(
value: Double
): Double = {
var x = value % 360.0
if (x < 0) {
x += 360.0
}
x
}
// ============================================================
// JULIAN DAY
// ============================================================
def julianDay(
year: Int,
month: Int,
day: Int,
hour: Int,
minute: Int,
second: Int,
timezone: Double
): Double = {
var y = year
var m = month
if (m <= 2) {
y -= 1
m += 12
}
val A =
floor(y / 100.0)
val B =
2.0 - A + floor(A / 4.0)
val decimalHour =
hour +
minute / 60.0 +
second / 3600.0 -
timezone
val jd =
floor(
365.25 * (y + 4716)
) +
floor(
30.6001 * (m + 1)
) +
day +
B -
1524.5 +
decimalHour / 24.0
jd
}
// ============================================================
// APPROXIMATE LAHIRI AYANAMSHA
// ============================================================
def lahiriAyanamsha(
jd: Double
): Double = {
val t =
(jd - 2451545.0) /
36525.0
val ayan =
23.85675 +
0.013968 * t
ayan
}
// ============================================================
// SIDEREAL CONVERSION
// ============================================================
def sidereal(
tropical: Double,
jd: Double
): Double = {
normalize(
tropical -
lahiriAyanamsha(jd)
)
}
// ============================================================
// SIGN
// ============================================================
def signName(
longitude: Double
): String = {
val names =
Array(
"Mesha (Aries)",
"Vrishabha (Taurus)",
"Mithuna (Gemini)",
"Karka (Cancer)",
"Simha (Leo)",
"Kanya (Virgo)",
"Tula (Libra)",
"Vrishchika (Scorpio)",
"Dhanu (Sagittarius)",
"Makara (Capricorn)",
"Kumbha (Aquarius)",
"Meena (Pisces)"
)
names(
floor(
normalize(longitude) / 30.0
).toInt
)
}
// ============================================================
// DEGREE FORMAT
// ============================================================
def degreeText(
longitude: Double
): String = {
val x =
normalize(longitude)
val signDegree =
x % 30.0
val d =
floor(signDegree).toInt
val min =
floor(
(signDegree - d) * 60.0
).toInt
val sec =
floor(
(
(
signDegree - d
) * 60.0 - min
) * 60.0
).toInt
d + "� " +
min + "' " +
sec + "\""
}
// ============================================================
// SUN LONGITUDE
// ============================================================
def sunLongitude(
jd: Double
): Double = {
val n =
jd - 2451545.0
val L =
normalize(
280.460 +
0.9856474 * n
)
val g =
toRadians(
normalize(
357.528 +
0.9856003 * n
)
)
val lambda =
L +
1.915 * sin(g) +
0.020 * sin(2.0 * g)
normalize(lambda)
}
// ============================================================
// MOON LONGITUDE
// ============================================================
def moonLongitude(
jd: Double
): Double = {
val n =
jd - 2451545.0
val L =
normalize(
218.316 +
13.176396 * n
)
val M =
toRadians(
normalize(
134.963 +
13.064993 * n
)
)
val F =
toRadians(
normalize(
93.272 +
13.229350 * n
)
)
val lon =
L +
6.289 * sin(M) +
1.274 * sin(
toRadians(
2.0 * (
normalize(
297.850 +
12.190749 * n
)
)
) - M
) +
0.658 * sin(
toRadians(
2.0 * (
normalize(
357.529 +
0.9856003 * n
)
)
)
) +
0.214 * sin(2.0 * M) -
0.186 * sin(
toRadians(
normalize(
357.529 +
0.9856003 * n
)
)
)
normalize(lon)
}
// ============================================================
// MERCURY APPROXIMATION
// ============================================================
def mercuryLongitude(
jd: Double
): Double = {
val n =
jd - 2451545.0
normalize(
252.25084 +
4.09233445 * n
)
}
// ============================================================
// VENUS APPROXIMATION
// ============================================================
def venusLongitude(
jd: Double
): Double = {
val n =
jd - 2451545.0
normalize(
181.97973 +
1.60213034 * n
)
}
// ============================================================
// MARS APPROXIMATION
// ============================================================
def marsLongitude(
jd: Double
): Double = {
val n =
jd - 2451545.0
normalize(
355.433 +
0.5240208 * n
)
}
// ============================================================
// JUPITER APPROXIMATION
// ============================================================
def jupiterLongitude(
jd: Double
): Double = {
val n =
jd - 2451545.0
normalize(
34.351 +
0.0830853 * n
)
}
// ============================================================
// SATURN APPROXIMATION
// ============================================================
def saturnLongitude(
jd: Double
): Double = {
val n =
jd - 2451545.0
normalize(
50.077 +
0.0334442 * n
)
}
// ============================================================
// RAHU
// ============================================================
def rahuLongitude(
jd: Double
): Double = {
val n =
jd - 2451545.0
normalize(
125.04452 -
0.0529538083 * n
)
}
// ============================================================
// KETU
// ============================================================
def ketuLongitude(
jd: Double
): Double = {
normalize(
rahuLongitude(jd) + 180.0
)
}
// ============================================================
// NAKSHATRA
// ============================================================
def nakshatraName(
longitude: Double
): String = {
val names =
Array(
"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"
)
val index =
floor(
normalize(longitude) /
(360.0 / 27.0)
).toInt
names(
Math.min(
26,
Math.max(
0,
index
)
)
)
}
// ============================================================
// PADA
// ============================================================
def nakshatraPada(
longitude: Double
): Int = {
val span =
360.0 / 108.0
(
floor(
normalize(longitude) /
span
).toInt % 4
) + 1
}
// ============================================================
// VEDIC RASHI FROM MOON
// ============================================================
def moonRashi(
moonSidereal: Double
): String = {
signName(
moonSidereal
)
}
// ============================================================
// LAGNA APPROXIMATION
// ============================================================
def ascendant(
jd: Double,
latitude: Double,
longitude: Double
): Double = {
val T =
(jd - 2451545.0) /
36525.0
val gmst =
280.46061837 +
360.98564736629 *
(jd - 2451545.0) +
0.000387933 *
T * T -
T * T * T / 38710000.0
val lst =
normalize(
gmst + longitude
)
val phi =
toRadians(latitude)
val eps =
toRadians(
23.439291
)
val theta =
toRadians(lst)
val asc =
atan2(
-cos(theta),
sin(theta) * cos(eps) +
tan(phi) * sin(eps)
)
val degrees =
toDegrees(asc)
sidereal(
normalize(degrees),
jd
)
}
// ============================================================
// HOUSE NUMBER
// ============================================================
def houseFromLongitude(
planet: Double,
lagna: Double
): Int = {
val diff =
normalize(
planet - lagna
)
floor(
diff / 30.0
).toInt + 1
}
// ============================================================
// BUILD REPORT
// ============================================================
def createReport(
name: String,
date: String,
time: String,
place: String,
lat: Double,
lon: Double,
tz: Double,
jd: Double
): String = {
val sun =
sidereal(
sunLongitude(jd),
jd
)
val moon =
sidereal(
moonLongitude(jd),
jd
)
val mercury =
sidereal(
mercuryLongitude(jd),
jd
)
val venus =
sidereal(
venusLongitude(jd),
jd
)
val mars =
sidereal(
marsLongitude(jd),
jd
)
val jupiter =
sidereal(
jupiterLongitude(jd),
jd
)
val saturn =
sidereal(
saturnLongitude(jd),
jd
)
val rahu =
sidereal(
rahuLongitude(jd),
jd
)
val ketu =
sidereal(
ketuLongitude(jd),
jd
)
val lagna =
ascendant(
jd,
lat,
lon
)
val moonNak =
nakshatraName(moon)
val pada =
nakshatraPada(moon)
val sb =
new StringBuilder
sb.append(
"====================================================\n"
)
sb.append(
" KUNDALI PURAN\n"
)
sb.append(
" VEDIC BIRTH REPORT\n"
)
sb.append(
"====================================================\n\n"
)
sb.append(
"PERSONAL DETAILS\n"
)
sb.append(
"----------------------------------------------------\n"
)
sb.append(
"Name : "
)
sb.append(name)
sb.append("\n")
sb.append(
"Birth Date : "
)
sb.append(date)
sb.append("\n")
sb.append(
"Birth Time : "
)
sb.append(time)
sb.append("\n")
sb.append(
"Birth Place : "
)
sb.append(place)
sb.append("\n")
sb.append(
"Latitude : "
)
sb.append(lat)
sb.append("\n")
sb.append(
"Longitude : "
)
sb.append(lon)
sb.append("\n")
sb.append(
"Timezone : UTC "
)
sb.append(tz)
sb.append("\n\n")
sb.append(
"CALCULATION\n"
)
sb.append(
"----------------------------------------------------\n"
)
sb.append(
"Julian Day : "
)
sb.append(jd)
sb.append("\n")
sb.append(
"Lahiri Ayanamsha : "
)
sb.append(
lahiriAyanamsha(jd)
)
sb.append("�\n\n")
sb.append(
"LAGNA / ASCENDANT\n"
)
sb.append(
"----------------------------------------------------\n"
)
sb.append(
"Lagna Degree : "
)
sb.append(
degreeText(lagna)
)
sb.append("\n")
sb.append(
"Lagna Rashi : "
)
sb.append(
signName(lagna)
)
sb.append("\n\n")
sb.append(
"MOON / JANMA DETAILS\n"
)
sb.append(
"----------------------------------------------------\n"
)
sb.append(
"Moon Degree : "
)
sb.append(
degreeText(moon)
)
sb.append("\n")
sb.append(
"Moon Rashi : "
)
sb.append(
moonRashi(moon)
)
sb.append("\n")
sb.append(
"Nakshatra : "
)
sb.append(
moonNak
)
sb.append("\n")
sb.append(
"Pada : "
)
sb.append(
pada
)
sb.append("\n\n")
sb.append(
"PLANETARY POSITIONS\n"
)
sb.append(
"----------------------------------------------------\n"
)
sb.append(
planetLine(
"Sun",
sun,
lagna
)
)
sb.append(
planetLine(
"Moon",
moon,
lagna
)
)
sb.append(
planetLine(
"Mercury",
mercury,
lagna
)
)
sb.append(
planetLine(
"Venus",
venus,
lagna
)
)
sb.append(
planetLine(
"Mars",
mars,
lagna
)
)
sb.append(
planetLine(
"Jupiter",
jupiter,
lagna
)
)
sb.append(
planetLine(
"Saturn",
saturn,
lagna
)
)
sb.append(
planetLine(
"Rahu",
rahu,
lagna
)
)
sb.append(
planetLine(
"Ketu",
ketu,
lagna
)
)
sb.append("\n")
sb.append(
"12 HOUSE STRUCTURE\n"
)
sb.append(
"----------------------------------------------------\n"
)
var h =
1
while (
h <= 12
) {
val houseLongitude =
normalize(
lagna +
(h - 1) * 30.0
)
sb.append(
"House "
)
sb.append(h)
sb.append(
" : "
)
sb.append(
signName(
houseLongitude
)
)
sb.append(
"\n"
)
h += 1
}
sb.append("\n")
sb.append(
"TRADITIONAL READING\n"
)
sb.append(
"----------------------------------------------------\n"
)
sb.append(
"Janma Rashi : "
)
sb.append(
moonRashi(moon)
)
sb.append("\n")
sb.append(
"Janma Nakshatra : "
)
sb.append(
moonNak
)
sb.append("\n")
sb.append(
"Nakshatra Pada : "
)
sb.append(
pada
)
sb.append("\n\n")
sb.append(
"IMPORTANT\n"
)
sb.append(
"----------------------------------------------------\n"
)
sb.append(
"This program calculates a sidereal-style chart.\n"
)
sb.append(
"For professional-grade astronomical accuracy,\n"
)
sb.append(
"the planetary ephemeris should be generated by\n"
)
sb.append(
"a dedicated ephemeris engine such as Swiss Ephemeris.\n"
)
sb.append(
"The present standalone version does not claim\n"
)
sb.append(
"professional astronomical precision.\n"
)
sb.append(
"\n====================================================\n"
)
sb.toString
}
// ============================================================
// PLANET LINE
// ============================================================
def planetLine(
name: String,
longitude: Double,
lagna: Double
): String = {
val sb =
new StringBuilder
sb.append(
name
)
sb.append(
" " * Math.max(
1,
10 - name.length
)
)
sb.append(
": "
)
sb.append(
degreeText(longitude)
)
sb.append(
" | "
)
sb.append(
signName(longitude)
)
sb.append(
" | House "
)
sb.append(
houseFromLongitude(
longitude,
lagna
)
)
sb.append("\n")
sb.toString
}
// ============================================================
// CALCULATE BUTTON EVENT
// ============================================================
calculateButton.addActionListener(
new ActionListener {
override def actionPerformed(
event: ActionEvent
): Unit = {
try {
val name =
firstName.getText.trim
val last =
surname.getText.trim
val date =
birthDate.getText.trim
val time =
birthTime.getText.trim
val place =
birthPlace.getText.trim
val lat =
latitude.getText.trim.toDouble
val lon =
longitude.getText.trim.toDouble
val tz =
timezone.getText.trim.toDouble
if (
name.isEmpty ||
last.isEmpty ||
date.isEmpty ||
time.isEmpty ||
place.isEmpty
) {
JOptionPane.showMessageDialog(
window,
"Please fill all birth details.",
"Missing Information",
JOptionPane.WARNING_MESSAGE
)
} else {
val dp =
date.split("/")
val tp =
time.split(":")
if (
dp.length != 3 ||
(tp.length != 2 && tp.length != 3)
) {
JOptionPane.showMessageDialog(
window,
"Use Date: DD/MM/YYYY\n" +
"Use Time: HH:MM or HH:MM:SS",
"Invalid Format",
JOptionPane.ERROR_MESSAGE
)
} else {
val day =
dp(0).toInt
val month =
dp(1).toInt
val year =
dp(2).toInt
val hour =
tp(0).toInt
val minute =
tp(1).toInt
val second =
if (tp.length == 3)
tp(2).toInt
else
0
if (
day < 1 ||
day > 31 ||
month < 1 ||
month > 12 ||
hour < 0 ||
hour > 23 ||
minute < 0 ||
minute > 59 ||
second < 0 ||
second > 59 ||
lat < -90 ||
lat > 90 ||
lon < -180 ||
lon > 180 ||
tz < -14 ||
tz > 14
) {
JOptionPane.showMessageDialog(
window,
"Please check Date, Time, Latitude,\n" +
"Longitude and Timezone.",
"Invalid Details",
JOptionPane.ERROR_MESSAGE
)
} else {
val jd =
julianDay(
year,
month,
day,
hour,
minute,
second,
tz
)
val fullName =
name + " " + last
result.setText(
createReport(
fullName,
date,
time,
place,
lat,
lon,
tz,
jd
)
)
result.setCaretPosition(0)
}
}
}
} catch {
case _: NumberFormatException =>
JOptionPane.showMessageDialog(
window,
"Please enter valid numbers.",
"Input Error",
JOptionPane.ERROR_MESSAGE
)
case _: Exception =>
JOptionPane.showMessageDialog(
window,
"Unable to calculate the chart.\n" +
"Please check all entered details.",
"Calculation Error",
JOptionPane.ERROR_MESSAGE
)
}
}
}
)
// ============================================================
// START APPLICATION
// ============================================================
SwingUtilities.invokeLater(
new Runnable {
override def run(): Unit = {
window.setLocationRelativeTo(null)
window.setVisible(true)
window.toFront()
window.requestFocus()
}
}
)