Natal Chart House System Calculator
ANA›Life Services Authority›National Calculator Authority›Natal Chart House System Calculator
.calc-container { max-width: 640px; margin: 2rem 0; padding: 1.5rem; background: #fff; border: 1px solid #ddd; border-radius: 8px; box-shadow: 0 1px 3px rgba(0,0,0,0.06); font-family: system-ui, -apple-system, sans-serif; } .calc-container h3 { font-family: Georgia, serif; font-size: 1.15rem; color: #1a1a1a; margin-bottom: 1rem; padding-bottom: 0.5rem; border-bottom: 2px solid var(--ac, #3d5a80); } .calc-row { display: flex; align-items: center; gap: 0.75rem; margin-bottom: 0.75rem; flex-wrap: wrap; } .calc-row label { min-width: 160px; font-size: 0.9rem; color: #333; font-weight: 500; } .calc-row input[type="number"], .calc-row select { flex: 1; min-width: 120px; max-width: 200px; padding: 0.5rem 0.6rem; border: 1px solid #ccc; border-radius: 4px; font-size: 0.9rem; font-family: system-ui, sans-serif; color: #1a1a1a; background: #fafaf8; } .calc-row input:focus, .calc-row select:focus { outline: none; border-color: var(--ac, #3d5a80); box-shadow: 0 0 0 2px rgba(26,74,138,0.12); } .calc-row .unit { font-size: 0.82rem; color: #888; min-width: 30px; } .calc-btn { display: inline-block; margin-top: 0.5rem; padding: 0.55rem 1.5rem; background: var(--ac, #3d5a80); color: #fff; border: none; border-radius: 4px; font-size: 0.9rem; font-weight: 600; cursor: pointer; font-family: system-ui, sans-serif; } .calc-btn:hover { opacity: 0.9; } .calc-result { margin-top: 1.25rem; padding: 1rem 1.25rem; background: #f0f6fc; border-left: 3px solid var(--ac, #3d5a80); border-radius: 0 6px 6px 0; display: none; } .calc-result.visible { display: block; } .calc-result-label { font-size: 0.78rem; text-transform: uppercase; letter-spacing: 0.06em; color: #666; margin-bottom: 0.25rem; } .calc-result-value { font-size: 1.6rem; font-weight: 700; color: var(--ac, #3d5a80); } .calc-result-detail { font-size: 0.85rem; color: #555; margin-top: 0.5rem; line-height: 1.5; } .calc-note { margin-top: 1rem; font-size: 0.8rem; color: #888; font-style: italic; } .calc-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 0.75rem; margin-top: 0.75rem; } .calc-grid-item { padding: 0.6rem 0.8rem; background: #f8f9fa; border-radius: 4px; border: 1px solid #eee; } .calc-grid-item .label { font-size: 0.75rem; color: #888; text-transform: uppercase; letter-spacing: 0.04em; } .calc-grid-item .value { font-size: 1.1rem; font-weight: 600; color: #1a1a1a; } @media (max-width: 720px) { .calc-row { flex-direction: column; align-items: flex-start; gap: 0.3rem; } .calc-row label { min-width: auto; } .calc-row input[type="number"], .calc-row select { max-width: 100%; width: 100%; } .calc-grid { grid-template-columns: 1fr; } } .calc-chart { margin: 1rem 0; text-align: center; } .calc-chart svg { max-width: 100%; height: auto; } .calc-chart-legend { display: flex; flex-wrap: wrap; justify-content: center; gap: 0.6rem 1.2rem; margin-top: 0.6rem; font-size: 0.8rem; color: #555; } .calc-chart-legend span { display: inline-flex; align-items: center; gap: 0.3rem; } .calc-chart-legend i { display: inline-block; width: 10px; height: 10px; border-radius: 2px; font-style: normal; } .calc-related { max-width: 640px; margin: 2rem 0 1rem; padding: 1.25rem 1.5rem; background: #f8f9fa; border: 1px solid #e8e8e8; border-radius: 8px; } .calc-related h3 { font-family: Georgia, serif; font-size: 1rem; color: #1a1a1a; margin: 0 0 0.75rem; padding-bottom: 0.4rem; border-bottom: 2px solid var(--ac, #3d5a80); } .calc-related-list { list-style: none; padding: 0; margin: 0 0 0.75rem; display: grid; grid-template-columns: 1fr 1fr; gap: 0.4rem 1.5rem; } .calc-related-list li a { font-size: 0.88rem; color: var(--ac, #3d5a80); text-decoration: none; } .calc-related-list li a:hover { text-decoration: underline; } .calc-browse-all { margin: 0.5rem 0 0; font-size: 0.9rem; font-weight: 600; } .calc-browse-all a { color: var(--ac, #3d5a80); text-decoration: none; } .calc-browse-all a:hover { text-decoration: underline; } @media (max-width: 720px) { .calc-related-list { grid-template-columns: 1fr; } }
Natal Chart House System Calculator
Calculate the 12 astrological house cusps using various house systems based on your birth date, time, and geographic location.
Birth Date
Birth Time (Local)
Latitude (°) e.g. 40.7128 for New York
Longitude (°) e.g. -74.0060 for New York
UTC Offset (hours) e.g. -5 for EST
House System
Placidus Koch Equal House Whole Sign Campanus Regiomontanus
Calculate Houses Enter your birth details and click Calculate.
function natCalc() { const dateVal = document.getElementById('nat-date').value; const timeVal = document.getElementById('nat-time').value; const lat = parseFloat(document.getElementById('nat-lat').value); const lon = parseFloat(document.getElementById('nat-lon').value); const tz = parseFloat(document.getElementById('nat-tz').value); const system = document.getElementById('nat-system').value; const res = document.getElementById('nat-result');
// --- Validation --- if (!dateVal || !timeVal) { res.innerHTML='Please enter a valid date and time.'; return; } if (isNaN(lat) || lat 89.9) { res.innerHTML='Latitude must be between -89.9° and 89.9°.'; return; } if (isNaN(lon) || lon 180) { res.innerHTML='Longitude must be between -180° and 180°.'; return; } if (isNaN(tz) || tz 14) { res.innerHTML='UTC offset must be between -12 and +14.'; return; } if ((system === 'placidus' || system === 'koch') && Math.abs(lat) > 66.5) { res.innerHTML='Placidus and Koch systems are undefined above the Arctic/Antarctic circles (|lat| > 66.5°). Please choose Equal, Whole Sign, Campanus, or Regiomontanus.'; return; }
// --- Parse date/time to UTC --- const [yr, mo, dy] = dateVal.split('-').map(Number); const [hr, mn] = timeVal.split(':').map(Number); const utcHour = hr + mn / 60 - tz; // Julian Day Number (JDN) for the given UTC date/time // Using the standard astronomical formula const A = Math.floor((14 - mo) / 12); const Y = yr + 4800 - A; const M = mo + 12 * A - 3; let JDN = dy + Math.floor((153 * M + 2) / 5) + 365 * Y + Math.floor(Y / 4) - Math.floor(Y / 100) + Math.floor(Y / 400) - 32045; const JD = JDN - 0.5 + utcHour / 24; // Julian Date
// --- Julian centuries from J2000.0 --- const T = (JD - 2451545.0) / 36525;
// --- Greenwich Mean Sidereal Time (GMST) in degrees --- // IAU formula let GMST = 280.46061837 + 360.98564736629 * (JD - 2451545.0) + 0.000387933 * T * T - (T * T * T) / 38710000; GMST = ((GMST % 360) + 360) % 360;
// --- Local Sidereal Time (LST) in degrees --- let LST = ((GMST + lon) % 360 + 360) % 360; const LST_rad = toRad(LST);
// --- Obliquity of the ecliptic (degrees) --- // IAU 1980 formula const eps = 23.439291111 - 0.013004167 * T - 0.0000001639 * T * T + 0.0503611 * T * T * T / 1000000; const eps_rad = toRad(eps); const lat_rad = toRad(lat);
// --- Ascendant (1st house cusp) --- // Standard formula: Asc = atan2(-cos(LST), sin(LST)cos(eps) + tan(lat)sin(eps)) let Asc = Math.atan2(-Math.cos(LST_rad), Math.sin(LST_rad) * Math.cos(eps_rad) + Math.tan(lat_rad) * Math.sin(eps_rad)); Asc = toDeg(Asc); Asc = ((Asc % 360) + 360) % 360;
// --- Midheaven (MC, 10th house cusp) --- // MC = atan2(tan(LST), cos(eps)) — projected onto ecliptic let MC = Math.atan2(Math.tan(LST_rad), Math.cos(eps_rad)); MC = toDeg(MC); MC = ((MC % 360) + 360) % 360; // Ensure MC is in the correct hemisphere if (Math.abs(MC - Asc) 270) { MC = (MC + 180) % 360; }
// --- Imum Coeli (IC, 4th house cusp) --- const IC = (MC + 180) % 360; // --- Descendant (7th house cusp) --- const Dsc = (Asc + 180) % 360;
let cusps = new Array(12).fill(0);
if (system === 'wholesign') { // Whole Sign: each house = one full sign (30°), starting from sign containing Asc const ascSign = Math.floor(Asc / 30); for (let i = 0; i { // fraction: 1/3 or 2/3 of semi-arc // sign: +1 for upper hemisphere, -1 for lower let ra = LST + sign * fraction * 180; ra = ((ra % 360) + 360) % 360; for (let iter = 0; iter 1) break; // circumpolar const sa = Math.acos(-tanProd); // New RA estimate let newRA; if (sign > 0) { newRA = LST + toDeg(sa) * fraction; } else { newRA = LST - toDeg(sa) * fraction; } newRA = ((newRA % 360) + 360) % 360; if (Math.abs(newRA - ra) { // Oblique ascension of MC const MC_rad = toRad(MC); const OAMC = toDeg(Math.atan2(Math.sin(MC_rad) * Math.cos(eps_rad) - Math.tan(toRad(0)) * Math.sin(eps_rad), Math.cos(MC_rad))); // Declination of MC const decMC = Math.asin(Math.sin(eps_rad) * Math.sin(MC_rad)); // Semi-arc of MC degree const tanProd = Math.tan(lat_rad) * Math.tan(decMC); const saMC = (Math.abs(tanProd) 0 ? 90 : -90); // OA = RA - AD (for eastern horizon) let newRA = OA_cusp + ad; newRA = ((newRA % 360) + 360) % 360; if (Math.abs(newRA - ra) { const theta = toRad(theta_deg); // Direction cosines of the prime vertical great circle point // In equatorial coords: (cos(theta)cos(lat), sin(theta), -cos(theta)sin(lat)) rotated by RAMC // RA of the point on prime vertical at angle theta from East: const x = Math.cos(theta) * Math.cos(lat_rad); const y = Math.sin(theta); const z = -Math.cos(theta) * Math.sin(lat_rad); // Convert to ecliptic longitude // Equatorial: X=cos(dec)cos(RA), Y=cos(dec)sin(RA), Z=sin(dec) // Rotate by RAMC to get absolute RA const RAMC_rad = toRad(RAMC); const X = x * Math.cos(RAMC_rad) - y * Math.sin(RAMC_rad); const Y = x * Math.sin(RAMC_rad) + y * Math.cos(RAMC_rad); const Z = z; const RA = toDeg(Math.atan2(Y, X)); const dec = Math.asin(Math.max(-1, Math.min(1, Z))); // Convert equatorial to ecliptic longitude const lon_ecl = toDeg(Math.atan2(Math.sin(toRad(RA)) * Math.cos(eps_rad) + Math.tan(dec) * Math.sin(eps_rad), Math.cos(toRad(RA)))); return ((lon_ecl % 360) + 360) % 360; }; cusps[11] = campanusCusp(30); cusps[10] = campanusCusp(60); cusps[1] = campanusCusp(210); cusps[2] = campanusCusp(240); cusps[5] = (cusps[11] + 180) % 360; cusps[4] = (cusps[10] + 180) % 360; cusps[7] = (cusps[1] + 180) % 360; cusps[8] = (cusps[2] + 180) % 360;
} else if (system === 'regiomontanus') { // Regiomontanus: trisects the celestial equator cusps[0] = Asc; cusps[3] = IC; cusps[6] = Dsc; cusps[9] = MC; const RAMC = LST; const regioMontanusCusp = (angle_deg) => { // angle_deg: angle along equator from RAMC const RA = ((RAMC + angle_deg) % 360 + 360) % 360; const RA_rad = toRad(RA); // Regiomontanus cusp: intersection of great circle through N/S poles of horizon // and the ecliptic, where the great circle passes through the equator point at RA // tan(lon) = sin(RA - RAMC) / (cos(RA - RAMC)sin(eps) - tan(lat)cos(eps)) // But more precisely, using the standard formula: const dRA = toRad(angle_deg); let lon_ecl = Math.atan2(Math.sin(dRA), Math.cos(dRA) * Math.sin(eps_rad) - Math.tan(lat_rad) * Math.cos(eps_rad)); lon_ecl = toDeg(lon_ecl) + RAMC; lon_ecl = ((lon_ecl % 360) + 360) % 360; return lon_ecl; }; cusps[11] = regioMontanusCusp(30); cusps[10] = regioMontanusCusp(60); cusps[1] = regioMontanusCusp(210); cusps[2] = regioMontanusCusp(240); cusps[5] = (cusps[11] + 180) % 360; cusps[4] = (cusps[10] + 180) % 360; cusps[7] = (cusps[1] + 180) % 360; cusps[8] = (cusps[2] + 180) % 360; }
// --- Format output --- const signs = ['Aries','Taurus','Gemini','Cancer','Leo','Virgo', 'Libra','Scorpio','Sagittarius','Capricorn','Aquarius','Pisces']; const signSymbols = ['♈','♉','♊','♋','♌','♍','♎','♏','♐','♑','♒','♓']; const houseNames = ['1st (Asc)','2nd','3rd','4th (IC)','5th','6th', '7th (Dsc)','8th','9th','10th (MC)','11th','12th'];
function formatDeg(d) { d = ((d % 360) + 360) % 360; const signIdx = Math.floor(d / 30); const deg = Math.floor(d % 30); const minF = (d % 30 - deg) * 60; const min = Math.floor(minF); const sec = Math.floor((minF - min) * 60); return signSymbols[signIdx] + ' ' + signs[signIdx] + ' ' + deg + '° ' + String(min).padStart(2,'0') + "' " + String(sec).padStart(2,'0') + '"'; }
const systemNames = { placidus:'Placidus', koch:'Koch', equal:'Equal House', wholesign:'Whole Sign', campanus:'Campanus', regiomontanus:'Regiomontanus' };
let html = '### ' + systemNames[system] + ' House Cusps '; html += 'LST: ' + LST.toFixed(4) + '° GMST: ' + GMST.toFixed(4) + '° JD: ' + JD.toFixed(5) + ' ε: ' + eps.toFixed(4) + '°
'; html += ''; html += 'HouseCusp (Ecliptic Longitude)Degrees'; for (let i = 0; i ' + '' + houseNames[i] + '' + '' + formatDeg(cusps[i]) + '' + '' + ((cusps[i] % 360 + 360) % 360).toFixed(2) + '°' + ''; } html += ''; res.innerHTML = html; }
// --- Helpers --- function toRad(d) { return d * Math.PI / 180; } function toDeg(r) { return r * 180 / Math.PI; }
// Convert Right Ascension (degrees) to ecliptic longitude function raToEcliptic(ra_deg, eps_rad) { const ra_rad = toRad(ra_deg); const lon_rad = Math.atan2(Math.sin(ra_rad) * Math.cos(eps_rad), Math.cos(ra_rad)); return ((toDeg(lon_rad) % 360) + 360) % 360; }
#### Formulas Used
Julian Date: JD = JDN − 0.5 + UTC_hour/24, where JDN uses the proleptic Gregorian calendar formula.
Julian Centuries: T = (JD − 2451545.0) / 36525
GMST (°): 280.46061837 + 360.98564736629 × (JD − 2451545) + 0.000387933T² − T³/38710000
LST (°): GMST + Geographic Longitude
Obliquity ε (°): 23.439291111 − 0.013004167T − 0.0000001639T² + 0.0000000503611T³
Ascendant: Asc = atan2(−cos(LST), sin(LST)·cos(ε) + tan(φ)·sin(ε))
Midheaven (MC): MC = atan2(tan(LST), cos(ε))
Placidus: Intermediate cusps found iteratively by trisecting the diurnal/nocturnal semi-arc: SA = arccos(−tan(φ)·tan(δ)). Cusps H11/H12 at 1/3 and 2/3 of upper semi-arc; H2/H3 at 1/3 and 2/3 of lower semi-arc.
Koch: Trisects the semi-arc of the MC degree using oblique ascension: OA_cusp = OA_MC ± (n/3)·SA_MC, then converts back to ecliptic longitude.
Equal House: Each cusp = Asc + n × 30°.
Whole Sign: Each house = one complete zodiac sign (30°), starting from the sign containing the Ascendant.
Campanus: Trisects the prime vertical. Great circle through N/S horizon poles and prime vertical point at angle θ intersects the ecliptic.
Regiomontanus: tan(λ) = sin(ΔRA) / (cos(ΔRA)·sin(ε) − tan(φ)·cos(ε)), where ΔRA = angle along equator from RAMC.
#### Assumptions & References
- References: Holden, R.W. (1977) The Elements of House Division; Campion, N. (1994) The Practical Astrologer; Meeus, J. (1998) Astronomical Algorithms, 2nd ed.
More Calculators
- Smart Lighting Payback and ROI Calculator
- Wire Overload Heat Calculator
- Sprinkler Head Flow Rate & Coverage Calculator
- Snow Removal Time Estimator
- Lighting Control Zone Coverage Calculator
- Sewer Repair Cost Estimator
- Software Development Cost Estimator
- Daily Calorie Needs Calculator
- Daily Water Intake Calculator
- Sleep Needs Calculator
- Window Energy Performance Calculator
Read Next
Study Time Planner Authority Network America › Life Services Authority › National Calculator Authority .calc-container { max-width: 640px;...