diff --git a/src/views/keyNodeRecognition3/components/anchorGraph.vue b/src/views/keyNodeRecognition3/components/anchorGraph.vue index 9001568..a4944a0 100644 --- a/src/views/keyNodeRecognition3/components/anchorGraph.vue +++ b/src/views/keyNodeRecognition3/components/anchorGraph.vue @@ -171,11 +171,28 @@ onMounted(() => { // 5. 节点分布在各自combo圆内 nodes.forEach(node => { const combo = combos.find(c => c.id === node.comboId); - // 随机分布在combo圆内 - const angle = Math.random() * 2 * Math.PI; - const radius = Math.random() * (combo.r - nodeSize / 2); - node.x = combo.x + Math.cos(angle) * radius; - node.y = combo.y + Math.sin(angle) * radius; + let valid = false; + let tryCount = 0; + let x, y; + const placed = nodes.filter(n => n.comboId === node.comboId && n !== node); + while (!valid && tryCount < 100) { + const angle = Math.random() * 2 * Math.PI; + const radius = Math.random() * (combo.r - nodeSize / 2); + x = combo.x + Math.cos(angle) * radius; + y = combo.y + Math.sin(angle) * radius; + valid = true; + for (const other of placed) { + const dx = x - other.x; + const dy = y - other.y; + if (Math.sqrt(dx * dx + dy * dy) < nodeSize) { + valid = false; + break; + } + } + tryCount++; + } + node.x = x; + node.y = y; }); // 6. 用 layout: null,G6 不再自动布局