v73b:家谱连线改成「每对父母一条母线」,去掉重合的横段

旧画法每个子女各画一条独立折线,在真实数据上会画出两条横段完全
重合的线(岳父母→我户 216→72 与 我父母→姐户 72→216,拐点同为
132.9),视觉上是一个「口」字框,看着像父母家和岳父母家连在一起。

新画法:父母单元中点 ──竖──→ 母线高度 ──横(只覆盖自己子女)──→
各子女 ──竖──→ 子女卡片上沿。一条线只服务一对父母,不再交叉重叠。

关键修正:子女挂点必须是**子女本人那张卡**,不是「子女所在户的中点」。
我这一户同时是两对父母的子女户(我父母→我、岳父母→妻子),
用户中点时两条竖线都落在 x=72、完全重合;改用本人卡的 x 后
妻子那条落在 105,两条线才分开。

⚠️ 这类病端点断言完全抓不到(端点都好好贴在卡片上),所以测试侧
新增「没有任何两条线段完全重合」,并在视图侧说明 bus 段是同一折线
公式的退化情形、不必单独写分支。

验证:离线 30/0、反向 13/0、真实数据+屏幕对照 11/0、
像素级 9/0、真机几何 15/0、ArkTS 守卫 905/0。
This commit is contained in:
2026-10-21 22:57:56 +08:00
parent 13f716c936
commit 8cabc35400
2 changed files with 198 additions and 29 deletions
+10 -1
View File
@@ -210,7 +210,16 @@ export struct FbKinGraphView {
const c: CanvasRenderingContext2D = this.ctx;
c.clearRect(0, 0, this.contentW, this.contentH);
// ---- 血缘:父母单元中点 → 下 → 横 → 下 → 子女顶端(与 Web 端同款折线)----
// ---- 血缘:`(x1,y1) → (x1,midY) → (x2,midY) → (x2,y2)` ----
//
// 🔴 v73b:这里**不需要**为母线(`bus`)写分支 —— 母线横段只是同一个公式的
// 退化情形(`y1 === y2 === midY` ⇒ 头和尾那两段竖线长度为 0),
// 照这个公式画出来正好是一条纯横线。三类几何都画对:
// · 主竖线 x1===x2 ⇒ 纯竖线
// · 母线横段 y1===y2===midY ⇒ 纯横线
// · 子女短竖线 x1===x2 ⇒ 纯竖线
// ⚠️ 别为了"看得更清楚"给 bus 单独写一段:两段代码会各自漂移,
// 以后改拐点或线宽就会不一致。
for (const e of this.layout.edges) {
if (e.kind === 'spouse') {
continue;