getHoroscope function

Map<String, dynamic>? getHoroscope(
  1. AstrolabeParams params
)

起大限

  • 大限由命宫起,阳男阴女顺行;
  • 阴男阳女逆行,每十年过一宫限。

@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;
}