fix(value_rank): 社交边标签改为离线偏移避免遮挡线条

- 边标签由中点改为法线方向偏移显示,不再压在线条上

- 标签左右交错摆放,降低多边场景下重叠概率

- 偏移距离随线宽自适应并设置最小值,保证可读性
This commit is contained in:
liuwei
2026-04-21 15:49:08 +08:00
parent 6f4efcfa72
commit b61d20612e

View File

@@ -1334,7 +1334,7 @@ class ValueRankPlugin(MessagePluginInterface):
# 1. 每条边中点标注“a->b / b->a”
# 2. 使用白底半透明标签提升可读性,避免与连线重叠难辨识。
edge_label_parts: List[str] = []
for a, b, mention_count, score, a_to_b_count, b_to_a_count in selected_edges:
for edge_idx, (a, b, mention_count, score, a_to_b_count, b_to_a_count) in enumerate(selected_edges, start=1):
ax, ay = pos_map[a]
bx, by = pos_map[b]
normalized = max(0.12, min(score / max_edge_score, 1.0))
@@ -1346,7 +1346,18 @@ class ValueRankPlugin(MessagePluginInterface):
)
# 通过字典序固定方向,确保同一条边每次渲染文案方向一致。
# 标签文案改为“昵称 + 双向次数 + 恶搞关系标签”,不再展示 wxid。
# 为避免标签压在线条上,这里把标签放到“线段法线方向”的偏移位置。
mx, my = (ax + bx) / 2.0, (ay + by) / 2.0
dx, dy = (bx - ax), (by - ay)
edge_len = max(math.hypot(dx, dy), 1.0)
# 线段法线单位向量逆时针旋转90度
nx, ny = (-dy / edge_len), (dx / edge_len)
# 交错方向,减少多条边标签都挤在同一侧导致重叠。
side_sign = 1.0 if (edge_idx % 2 == 0) else -1.0
# 偏移距离与线宽相关,至少 22 像素,保证不贴线。
offset = max(22.0, 14.0 + stroke_width * 2.4)
label_x = mx + nx * offset * side_sign
label_y = my + ny * offset * side_sign
nick_a = cm.get_group_name(group_id, a) or a
nick_b = cm.get_group_name(group_id, b) or b
@@ -1366,7 +1377,7 @@ class ValueRankPlugin(MessagePluginInterface):
label_text = f"{nick_a}{nick_b} {a_to_b_count}/{b_to_a_count} {relation_tag}"
safe_label = html.escape(label_text)
edge_label_parts.append(
f'<g transform="translate({mx:.1f},{my:.1f})">'
f'<g transform="translate({label_x:.1f},{label_y:.1f})">'
f'<rect x="-170" y="-12" width="340" height="24" rx="8" ry="8" fill="rgba(255,255,255,0.82)"></rect>'
f'<text x="0" y="5" text-anchor="middle" font-size="12" fill="#4E5F7D">{safe_label}</text>'
f'</g>'