getHoroscope function
起大限
- 大限由命宫起,阳男阴女顺行;
- 阴男阳女逆行,每十年过一宫限。
@param solarDateStr 公历日期 @param timeIndex 出生时索引 @param gender 性别 @param fixLeap 是否修正闰月,若修正,则闰月前15天按上月算,后15天按下月算 @returns 从寅宫开始的大限年龄段
Implementation
Map<String, dynamic>? getHoroscope(AstrolabeParams params) {
List<Decadal> decadals = List.filled(
12,
Decadal(
range: [0, 1],
heavenlyStem: HeavenlyStemName.jiaHeavenly,
earthlyBranch: EarthlyBranchName.ziEarthly,
),
);
final genderKey = params.gender?.key;
final heavenlyStemAndEarthlyBranch = getHeavenlyStemAndEarthlyBranchSolarDate(
params.solarDate,
params.timeIndex,
getConfig().yearDivide,
);
final heavenlyStem =
getMyHeavenlyStemNameFrom(heavenlyStemAndEarthlyBranch.yearly[0]).key ??
"Heavenly";
final earthlyBranch =
getMyEarthlyBranchNameFrom(heavenlyStemAndEarthlyBranch.yearly[1]).key ??
"Earthly";
final soulAndBody = getSoulAndBody(params);
final fiveElementClass = getFiveElementClass(
params.from?.heavenlyStem ?? soulAndBody.heavenlyStenName,
params.from?.earthlyBranch ?? soulAndBody.earthlyBranchName,
);
/// 用五虎遁获取大限起始天干
final startHeavenlyStem = tigerRules[heavenlyStem]!;
for (int i = 0; i < 12; i++) {
final idx =
genderMap[genderKey] == earthlyBranchesMap[earthlyBranch]?['yinYang']
? fixIndex(soulAndBody.soulIndex + i)
: fixIndex(soulAndBody.soulIndex - i);
final start = fiveElementClass.value + 10 * i;
final heavenlyStemIndex = fixIndex(
heavenlyStems.indexOf(startHeavenlyStem) + idx,
max: 10,
);
final earthlyBranchIndex = fixIndex(
earthlyBranches.indexOf('yinEarthly') + idx,
);
decadals[idx] = Decadal(
range: [start, start + 9],
heavenlyStem: getMyHeavenlyStemNameFrom(heavenlyStems[heavenlyStemIndex]),
earthlyBranch: getMyEarthlyBranchNameFrom(
earthlyBranches[earthlyBranchIndex],
),
);
}
final ageIdx = getAgeIndex(
getMyEarthlyBranchNameFrom(
heavenlyStemAndEarthlyBranch.yearly[1] ?? "Earthly",
),
);
List<List<int>> ages = List.filled(12, [0]);
for (int i = 0; i < 12; i++) {
List<int> innerAge = [];
for (int j = 0; j < 10; j++) {
innerAge.add(12 * j + i + 1);
}
final idx =
genderKey == 'male' ? fixIndex(ageIdx + i) : fixIndex(ageIdx - i);
ages[idx] = innerAge;
}
// for 循环120次获取他的流年, 从出生日期的年份开始,一次递增一年,然后将年转为干支纪年法,
final birthYear = int.parse(params.solarDate.split('-')[0]);
final birthMonth = int.parse(params.solarDate.split('-')[1]);
final birthDay = int.parse(params.solarDate.split('-')[2]);
List<YearlyStemsBranches> yearlyStemsBranches = [];
for (int i = 0; i < EarthlyBranchName.values.length; i++) {
final idx =
genderKey == 'male' ? fixIndex(ageIdx + i) : fixIndex(ageIdx - i);
final branch = YearlyStemsBranches(
earthlyBranchName: EarthlyBranchName.values[idx],
ages: [],
);
yearlyStemsBranches.add(branch);
}
for (int i = birthYear; i < birthYear + 120; i++) {
var solar = Solar.fromYmdHms(
i,
birthMonth,
birthDay,
max(params.timeIndex * 2 - 1, 0),
30,
0,
);
var lunar = solar.getLunar();
var yearlyZhi =
getConfig().yearDivide == DivideType.normal
? lunar.getYearZhi()
: lunar.getYearZhiByLiChun();
final yearlyStemsBranch = yearlyStemsBranches.firstWhere(
(e) => e.earthlyBranchName == getMyEarthlyBranchNameFrom(yearlyZhi),
);
yearlyStemsBranch.ages.add(i - birthYear + 1);
}
final result = {
"decades": decadals,
"ages": ages,
'yearlies': yearlyStemsBranches,
};
return result;
}