diff --git a/templates/kin/tree.php b/templates/kin/tree.php index 37c5d06..bd64f88 100644 --- a/templates/kin/tree.php +++ b/templates/kin/tree.php @@ -536,7 +536,35 @@ $payloadJson = json_encode( } putCentered(ui, g, want); } else { - placeLoose(ui, g, true); + // ⚠️ 没有子女、也不在主干上的旁支(比如"舅子"= 我妻子的兄弟): + // 要**贴到它父母的户旁边**,而不是"推到整代最右"。 + // 第一稿用 placeLoose(往右) —— 结果舅子跑到离我很远的最右侧, + // 还和同代的人撞上(实测 D 项最小间隙 -36px)。 + var ps3 = parentsOf[String(ui)] || []; + var panchor = null; + ps3.forEach(function (p3) { if (placed[p3] && panchor === null) { panchor = p3; } }); + if (panchor !== null) { + // 放在父母那一户的右侧紧邻处(父母的其它子女已经在旁边了) + var pn = units[panchor].cards.length >= 2 ? 2 : 1; + var pw = pn * slotW; + var want2 = placed[panchor].uc + pw / 2 + SP + slotW / 2; + // 与同代已有的人避让 + var row2 = []; + units.forEach(function (u3, ui3) { + if (placed[ui3] && placed[ui3].gen === g && ui3 !== ui) { row2.push(ui3); } + }); + row2.sort(function (a, b) { return placed[a].uc - placed[b].uc; }); + for (var rj = 0; rj < row2.length; rj++) { + var rp2 = placed[row2[rj]]; + var rn2 = units[row2[rj]].cards.length >= 2 ? 2 : 1; + if (Math.abs(want2 - rp2.uc) < (slotW / 2 + rn2 * slotW / 2)) { + want2 = rp2.uc + rn2 * slotW / 2 + SP + slotW / 2; + } + } + putCentered(ui, g, want2); + } else { + placeLoose(ui, g, true); + } } });