/**
* 星盘渲染 — 南印度 + 北印度风格 v3.0
* 浅色极简主题,支持南/北印度风格切换
*/
import { SIGNS, SIGNS_CN, SIGNS_EN_SHORT, PLANET_SYMBOLS, PLANET_CN } from './jyotish-engine.js';
import { signName, getLang } from './i18n.js';
// 南印度星盘宫位映射(星座固定位置)
const SOUTH_INDIAN_LAYOUT = [
[0,0],[0,1],[0,2],[0,3], // Pisces, Aries, Taurus, Gemini
[1,3],[2,3],[3,3], // Cancer, Leo, Virgo
[3,2],[3,1],[3,0], // Libra, Scorpio, Sagittarius
[2,0],[1,0], // Capricorn, Aquarius
];
// 北印度星盘宫位布局(固定上升在顶部菱形)
// 12宫按固定位置排列,上升始终在顶部菱形格
const NORTH_INDIAN_HOUSES = [
// [row, col] — 从12宫开始,顺时针: 12,1,2,3,4,5,6,7,8,9,10,11
// 顶行: 12, 1, 2
// 右侧下行: 3, 4
// 底行: 11, 10, 9, 8(中心偏), 7
// 左侧上行: 6, 5
[0,0],[0,1],[0,2], // H12, H1, H2
[1,2],[2,3], // H3, H4
[3,3],[3,2],[3,1],[3,0], // H5, H6, H7, H8
[2,0],[1,0], // H9, H10
[1,1], // H11 (center-ish)
];
// 浅色主题色值
const THEME = {
bg: '#ffffff',
bgAsc: 'rgba(109,40,217,0.04)',
border: '#c9c8c8',
borderAsc: 'rgba(109,40,217,0.35)',
signText: '#6b6b6b',
signTextAsc: '#6d28d9',
houseNum: '#8c8c8c',
planetDefault: '#2e2e2e',
planetExalted: '#16a34a',
planetDebilitated: '#dc2626',
planetOwn: '#d97706',
ascLabel: '#6d28d9',
combust: '#dc2626',
};
/**
* 渲染南印度风格星盘
*/
export function renderSouthIndianChart(container, chartData, options = {}) {
const { planets, ascendant } = chartData;
const ascIdx = SIGNS.indexOf(ascendant.sign);
const size = options.size || 420;
const title = options.title || '';
// 按宫位分组行星
const housePlanets = {};
for (const [pname, pinfo] of Object.entries(planets)) {
if (pinfo.error) continue;
const h = pinfo.house;
if (!housePlanets[h]) housePlanets[h] = [];
housePlanets[h].push({ name: pname, ...pinfo });
}
const cellSize = size / 4;
let svg = '';
if (title) {
svg += `
${title}
`;
}
svg += `';
container.innerHTML = svg;
}
/**
* 渲染北印度风格星盘(Diamond 菱形布局)
* 北印盘固定12宫位置,上升始终在顶部中心格
*/
export function renderNorthIndianChart(container, chartData, options = {}) {
const { planets, ascendant } = chartData;
const ascIdx = SIGNS.indexOf(ascendant.sign);
const size = options.size || 420;
const title = options.title || '';
// 按宫位分组行星
const housePlanets = {};
for (const [pname, pinfo] of Object.entries(planets)) {
if (pinfo.error) continue;
const h = pinfo.house;
if (!housePlanets[h]) housePlanets[h] = [];
housePlanets[h].push({ name: pname, ...pinfo });
}
// 北印盘布局: 4x4 网格,外圈12格 = 12宫
// 位置定义 (row, col) — 按宫位编号 1-12
const houseCells = {
1: [0,1], 2: [0,2], // 顶行右半
3: [1,3], 4: [2,3], // 右列下半
5: [3,2], 6: [3,1], // 底行左半
7: [2,0], 8: [1,0], // 左列上半
9: [1,1], 10: [1,2], // 内层上
11: [2,2], 12: [2,1], // 内层下
};
const cellSize = size / 4;
let svg = '';
if (title) {
svg += `${title}
`;
}
svg += `';
container.innerHTML = svg;
}
// 全局默认渲染函数(可切换风格)
let _chartStyle = 'south';
export function setChartStyle(style) { _chartStyle = style; }
export function getChartStyle() { return _chartStyle; }
export function renderChart(container, chartData, options = {}) {
if (_chartStyle === 'north') {
renderNorthIndianChart(container, chartData, options);
} else {
renderSouthIndianChart(container, chartData, options);
}
}