fix(value_rank): 社交边标签改为离线偏移避免遮挡线条
- 边标签由中点改为法线方向偏移显示,不再压在线条上 - 标签左右交错摆放,降低多边场景下重叠概率 - 偏移距离随线宽自适应并设置最小值,保证可读性
This commit is contained in:
@@ -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>'
|
||||
|
||||
Reference in New Issue
Block a user