宫位对象

PalaceData 的字段,以及星耀判断、空宫判断与飞星族的全部方法。

宫位是斗数分析的主战场。数据本身是 PalaceDatachart.palace(...) 返回的是 PalaceRef——同一份数据外加一个指回星盘的引用。

PalaceDataPalaceRef<'a>
从哪来chart.palaces[i]sp.target 等字段chart.palace(...)star.palace()sp 之外的查询入口
字段全部Deref 全部可读,data() 取到底层
判断方法has / is_empty / flies_to 一族(目标宫要传 &PalaceData同名方法,目标宫可直接写索引或宫名
独有opposite_palace / surrounded_palaces / mutaged_places / astrolabe

本页条目按 PalaceRef 的形式给签名;PalaceData 上的同名方法只差在飞星族的 目标宫参数类型(&PalaceData 而非 impl Into<PalaceTarget>)。

let soul = chart.palace(Palace::Soul).unwrap();

soul.name;                  // 经 Deref 直接取字段
soul.opposite_palace();     // 视图独有

本页示例统一用 Language::ZhCN 排盘,因此输出里的展示值都是中文。 name 等枚举字段本身与语言无关,展示时才经 translate_* 转成文本。

字段

字段类型说明
indexusize宫位索引 0–11,0 为寅宫
namePalace宫名
is_body_palacebool是否身宫
is_original_palacebool是否来因宫(宫干与年干相同且不在子丑二宫)
heavenly_stemHeavenlyStem宫干,决定本宫飞出的四化
earthly_branchEarthlyBranch宫支,由索引固定:0 为寅、11 为丑
major_starsVec<Star>十四主星中落在本宫的,按安放顺序
minor_starsVec<Star>十四辅星中落在本宫的
adjective_starsVec<Star>杂耀
changsheng12StarKey长生十二神,每宫恰好一个
boshi12StarKey博士十二神
jiangqian12StarKey将前十二神
suiqian12StarKey岁前十二神
decadalDecadal大限:岁数区间与宫干支
agesVec<u32>小限经过本宫的虚岁列表
overridesOption<Arc<TableOverrides>>排盘时生效的自定义四化与亮度表;未自定义时为 None

四组十二神与三组星耀的区别

主星、辅星、杂耀是列表,一宫可以有零到多颗。 长生、博士、将前、岁前十二神是每宫恰好一个的标记,十二宫刚好排满一轮, 因此是单值字段而不是列表。

overrides 是输入不是结果

overrides 携带的是排盘配置里的自定义表——飞星族方法要按宫干查四化, 自定义表可能改写了某个天干的四化,因此宫位得随身带着它。 它不参与序列化,DTO 与 JSON 输出里都没有这一项。


has / not_have / has_one_of

用途 判断本宫坐了哪些星。

斗数含义 星耀落宫是斗数的基本盘面信息。「命宫坐紫微天相」即 has(&[ZiweiMaj, TianxiangMaj])。查找范围覆盖主星、辅星、杂耀三组。

签名

pub fn has(&self, stars: &[StarKey]) -> bool
pub fn not_have(&self, stars: &[StarKey]) -> bool
pub fn has_one_of(&self, stars: &[StarKey]) -> bool

参数

参数类型必填默认说明
stars&[StarKey]星耀标识列表

返回值

方法语义
has列表中每一颗都在本宫
not_have列表中一颗都不在本宫
has_one_of列表中至少一颗在本宫

示例

use x_iztro::StarKey::*;

let soul = chart.palace(Palace::Soul).unwrap();

println!("{}", soul.has(&[ZiweiMaj, TianxiangMaj]));
println!("{}", soul.has_one_of(&[QishaMaj, ZiweiMaj]));
println!("{}", soul.not_have(&[HuoxingMin, LingxingMin]));

输出

false
true
true

这张盘的命宫只坐紫微,天相落在财帛宫,因此要求两颗都在的 hasfalse

边界与陷阱

空列表下 hasnot_have 返回 truehas_one_of 返回 false


has_mutagen / not_have_mutagen

用途 判断本宫有没有某种四化。

斗数含义 本命四化由生年干决定,标记打在对应的星上。 一宫「有化禄」意味着这宫里坐着的某颗星被生年干化了禄。 注意这与飞星不同——飞星看的是宫干,本处看的是星上已有的标记。

签名

pub fn has_mutagen(&self, mutagen: Mutagen) -> bool
pub fn not_have_mutagen(&self, mutagen: Mutagen) -> bool

参数

参数类型必填默认说明
mutagenMutagenLu / Quan / Ke / Ji 之一

返回值 bool。只扫描 major_starsminor_stars不看杂耀

示例

let children = chart.palace(Palace::Children).unwrap();

println!("子女宫有化禄: {}", children.has_mutagen(Mutagen::Lu));
println!("子女宫无化忌: {}", children.not_have_mutagen(Mutagen::Ji));

输出

子女宫有化禄: true
子女宫无化忌: true

边界与陷阱

不扫杂耀

has_mutagen 只看主星与辅星上的四化标记,杂耀即使带标记也不计入 (复刻 iztro 的行为)。要连杂耀一起看,自己遍历 adjective_starsmutagen 字段。 生年四化只会落在十四主星与部分辅星上,因此实际盘面上两种口径通常没有差别。


is_empty / is_empty_excluding

用途 判断本宫是否空宫。

斗数含义 「空宫」指没有十四主星坐守的宫。空宫要借对宫主星来看, 是斗数里一个很常见的判断分支。辅星与杂耀默认不影响空宫的成立。

签名

pub fn is_empty(&self) -> bool
pub fn is_empty_excluding(&self, exclude_stars: &[StarKey]) -> bool

参数

参数类型必填默认说明
exclude_stars&[StarKey]追加计入的星耀:本宫无主星、但坐了其中任一颗时,同样不算空宫

返回值 bool。判定顺序是:先看有无主星,有则不空;再看 exclude_stars,命中则不空;都不满足才是空宫。

示例

let parents = chart.palace(Palace::Parents).unwrap();
println!("父母宫空宫: {}", parents.is_empty());

let friends = chart.palace(Palace::Friends).unwrap();
println!("仆役宫空宫: {}", friends.is_empty());

// 父母宫无主星,但坐了陀罗——把陀罗也计入后就不算空宫
println!("父母宫计入陀罗后: {}", parents.is_empty_excluding(&[StarKey::TuoluoMin]));

输出

父母宫空宫: true
仆役宫空宫: false
父母宫计入陀罗后: false

这张盘只有父母、田宅两宫无主星。仆役宫坐太阴,因此不算空宫。

边界与陷阱


flies_to / flies_one_of_to / not_fly_to

用途 判断本宫宫干的四化是否飞入目标宫。

斗数含义 飞星派的核心手法。每个宫位有自己的宫干,宫干按四化表决定 哪四颗星化禄、权、科、忌。若被化的那颗星恰好坐在目标宫,就叫「本宫化 X 入目标宫」。 「命宫化禄入财帛」表达的是命宫这件事的顺遂落在财帛上。

签名

pub fn flies_to(&self, target: impl Into<PalaceTarget>, mutagens: &[Mutagen]) -> bool
pub fn flies_one_of_to(&self, target: impl Into<PalaceTarget>, mutagens: &[Mutagen]) -> bool
pub fn not_fly_to(&self, target: impl Into<PalaceTarget>, mutagens: &[Mutagen]) -> bool

参数

参数类型必填默认说明
targetimpl Into<PalaceTarget>目标宫,索引 / 宫名 / 身宫 / 来因宫四种写法
mutagens&[Mutagen]要检查的四化

返回值

方法语义
flies_to列出的四化全部飞入目标宫
flies_one_of_to列出的四化至少一个飞入目标宫
not_fly_to列出的四化一个都不飞入目标宫

示例

let soul = chart.palace(Palace::Soul).unwrap();

println!("命宫化禄入财帛: {}", soul.flies_to(Palace::Wealth, &[Mutagen::Lu]));
println!("命宫化禄或忌入迁移: {}", soul.flies_one_of_to(Palace::Surface, &[Mutagen::Lu, Mutagen::Ji]));
println!("命宫不化权入子女: {}", soul.not_fly_to(Palace::Children, &[Mutagen::Quan]));

输出

命宫化禄入财帛: false
命宫化禄或忌入迁移: false
命宫不化权入子女: true

边界与陷阱


self_mutaged / self_mutaged_one_of / not_self_mutaged

用途 判断本宫是否自化。

斗数含义 自化指本宫宫干化出的星恰好就坐在本宫。 含义上是「自己把自己的能量释放掉」,与飞入他宫的定向作用不同。

签名

pub fn self_mutaged(&self, mutagens: &[Mutagen]) -> bool
pub fn self_mutaged_one_of(&self, mutagens: &[Mutagen]) -> bool
pub fn not_self_mutaged(&self, mutagens: &[Mutagen]) -> bool

参数

参数类型必填默认说明
mutagens&[Mutagen]要检查的四化;传空切片表示「四化全部」

返回值

方法语义
self_mutaged列出的四化全部自化
self_mutaged_one_of列出的四化至少一个自化;列表为空时检查全部四化
not_self_mutaged列出的四化一个都不自化;列表为空时检查全部四化

示例

let career = chart.palace(Palace::Career).unwrap();

println!("官禄宫自化禄: {}", career.self_mutaged(&[Mutagen::Lu]));
println!("官禄宫自化忌: {}", career.self_mutaged(&[Mutagen::Ji]));
println!("官禄宫有任一自化: {}", career.self_mutaged_one_of(&[]));
println!("官禄宫无任何自化: {}", career.not_self_mutaged(&[]));

输出

官禄宫自化禄: false
官禄宫自化忌: true
官禄宫有任一自化: true
官禄宫无任何自化: false

官禄宫宫干为丙,丙干化忌在廉贞,而廉贞正坐官禄宫,故成自化忌。

边界与陷阱

空列表在这三个方法里的含义不同于飞星族

self_mutaged_one_ofnot_self_mutaged 把空列表解释为「全部四化」, 而不是「空集」。self_mutaged 不做这层回退,空列表退化成「本宫是否包含空集」, 恒为 true——与 flies_to 的空列表判假正好相反,别把两者的直觉混用。


mutaged_places / mutagen_stars

用途 取本宫宫干化出的四颗星分别落在哪些宫,或直接取那四颗星本身。

斗数含义 飞星分析的全景版本:不问「有没有飞到某宫」,而是一次拿到禄权科忌四个落点。

签名

pub fn mutaged_places(&self) -> Vec<Option<PalaceRef<'a>>>
pub fn mutagen_stars(&self, mutagens: &[Mutagen]) -> Vec<StarKey>

参数

参数类型必填默认说明
mutagens&[Mutagen]要取的四化位;同一四化重复传入会重复出现

返回值 mutaged_places 返回长度为 4 的 Vec,顺序为禄、权、科、忌, 某颗被化的星不在这张盘上时对应位置为 Nonemutagen_stars 返回 Vec<StarKey>,顺序与传入的四化一致。

示例

let soul = chart.palace(Palace::Soul).unwrap();

for (m, place) in ["禄", "权", "科", "忌"].iter().zip(soul.mutaged_places()) {
    match place {
        Some(p) => println!("化{m} → {}", translate_palace(p.name, Language::ZhCN)),
        None => println!("化{m} → 不在盘上"),
    }
}

println!("{:?}", soul.mutagen_stars(&[Mutagen::Lu, Mutagen::Ji]));

输出

化禄 → 子女
化权 → 命宫
化科 → 官禄
化忌 → 财帛
[TianliangMaj, WuquMaj]

命宫宫干为壬,壬干四化为天梁化禄、紫微化权、左辅化科、武曲化忌, 四颗星分别坐在子女、命宫、官禄、财帛四宫。

mutagen_stars 取的是「本宫宫干化出哪几颗星」,与星耀自身的 mutagen 字段(生年四化)无关;后者由出生年干决定。

mutaged_places 忽略入参

PalaceRef::mutaged_places 不收参数,恒按禄、权、科、忌四位返回长度为 4 的结果。 PalaceData 上的同名方法要传十二宫切片(p.mutaged_places(&chart.palaces)), 返回的是 Vec<Option<usize>> 宫位索引而不是宫位视图。


opposite_palace / surrounded_palaces

用途 取本宫的对宫与三方四正。

斗数含义 对宫是本宫 +6 的那一宫,两宫永远相对而看。 三方四正在对宫之外再加上 +4(官禄位)与 +8(财帛位)。

签名

pub fn opposite_palace(&self) -> PalaceRef<'a>
pub fn surrounded_palaces(&self) -> SurroundedPalaces<'a>

返回值 opposite_palace 必然存在,不返回 Optionsurrounded_palaces三方四正

示例

let zh = Language::ZhCN;
let soul = chart.palace(Palace::Soul).unwrap();

println!("{} 的对宫是 {}", translate_palace(soul.name, zh),
    translate_palace(soul.opposite_palace().name, zh));
println!("三方四正见煞: {}", soul.surrounded_palaces().have_one_of(&[StarKey::HuoxingMin, StarKey::LingxingMin]));

输出

命宫 的对宫是 迁移
三方四正见煞: true

astrolabe

用途 从宫位回到它所属的星盘。

签名

pub fn astrolabe(&self) -> &'a Astrolabe

返回值 &Astrolabe。视图始终持有星盘,因此不返回 Option

示例

let soul = chart.palace(Palace::Soul).unwrap();
println!("{}", translate_five_elements_class(soul.astrolabe().five_elements_class, Language::ZhCN));

输出

木三局

本页目录