astrology-insights
Version:
Comprehensive Vedic astrology engine for Node.js — Panchang, birth charts (Kundli), Vimshottari Dasha, divisional charts, dosha analysis, and planetary remedies. Swiss Ephemeris precision, validated against Drik Panchang.
104 lines (84 loc) • 3.5 kB
text/typescript
/**
* Chart Layout Generator
* Produces North Indian, South Indian, and Western chart box layouts.
*/
import { HouseInfo, ChartLayout, ChartBox, GrahaName } from '../types';
import { SIGN_NAMES } from '../core/constants';
// ── South Indian: signs are fixed in these positions (Pisces top-left) ───────
// Box positions (0-11) correspond to:
// [0] [1] [2] [3]
// [4] [5]
// [6] [7]
// [8] [9] [10] [11]
//
// Fixed sign numbers per box (South Indian convention):
const SOUTH_INDIAN_SIGN_ORDER = [12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
// ── North Indian: houses are fixed in positions, signs rotate ────────────────
// House positions (diamond):
// [12] [1] [2] [3]
// [11] [4]
// [10] [5]
// [9] [8] [7] [6]
const NORTH_INDIAN_HOUSE_ORDER = [12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
/**
* Generate all three chart layouts from house data.
*/
export function generateChartLayouts(houses: HouseInfo[]): {
northIndian: ChartLayout;
southIndian: ChartLayout;
western: ChartLayout;
} {
return {
northIndian: generateNorthIndian(houses),
southIndian: generateSouthIndian(houses),
western: generateWestern(houses),
};
}
// ── North Indian ─────────────────────────────────────────────────────────────
function generateNorthIndian(houses: HouseInfo[]): ChartLayout {
const boxes: ChartBox[] = [];
for (let i = 0; i < 12; i++) {
const houseNum = NORTH_INDIAN_HOUSE_ORDER[i];
const house = houses.find(h => h.number === houseNum);
boxes.push({
houseNumber: houseNum,
signNumber: house ? house.signNumber : 0,
signName: house ? house.signName : '',
planets: house ? [...house.planets] : [],
});
}
return { style: 'north_indian', boxes };
}
// ── South Indian ─────────────────────────────────────────────────────────────
function generateSouthIndian(houses: HouseInfo[]): ChartLayout {
const boxes: ChartBox[] = [];
// In South Indian, each box position is a fixed sign.
// We need to find which house occupies that sign.
for (let i = 0; i < 12; i++) {
const signNum = SOUTH_INDIAN_SIGN_ORDER[i];
const house = houses.find(h => h.signNumber === signNum);
boxes.push({
houseNumber: house ? house.number : 0,
signNumber: signNum,
signName: SIGN_NAMES[signNum] || '',
planets: house ? [...house.planets] : [],
});
}
return { style: 'south_indian', boxes };
}
// ── Western ──────────────────────────────────────────────────────────────────
function generateWestern(houses: HouseInfo[]): ChartLayout {
const boxes: ChartBox[] = [];
// Western layout: houses in order 1-12, counter-clockwise from ascendant
for (let i = 0; i < 12; i++) {
const houseNum = i + 1;
const house = houses.find(h => h.number === houseNum);
boxes.push({
houseNumber: houseNum,
signNumber: house ? house.signNumber : 0,
signName: house ? house.signName : '',
planets: house ? [...house.planets] : [],
});
}
return { style: 'western', boxes };
}