Javascript 如何避免D3.js中的圆重叠

Javascript 如何避免D3.js中的圆重叠,javascript,d3.js,Javascript,D3.js,我正在d3中绘制这张图。有一个问题,这些圆重叠(A和F)。由于数据是动态的,我如何确保没有圆圈相互重叠。任何线索将不胜感激 附上以下代码: const svgWidth=1000; 常数svgHeight=1000; 常量象限1=‘象限1’; 常数quadrant2=‘quadrant2’; 常量quadrant3=‘quadrant3’; 常数quadrant4=‘quadrant4’; 让mouseEnterTimeout,mouseOutTimeout; 常数数据={ 名称:“根”,

我正在d3中绘制这张图。有一个问题,这些圆重叠(A和F)。由于数据是动态的,我如何确保没有圆圈相互重叠。任何线索将不胜感激

附上以下代码:

const svgWidth=1000;
常数svgHeight=1000;
常量象限1=‘象限1’;
常数quadrant2=‘quadrant2’;
常量quadrant3=‘quadrant3’;
常数quadrant4=‘quadrant4’;
让mouseEnterTimeout,mouseOutTimeout;
常数数据={
名称:“根”,
儿童:[
{
名称:“A”,
儿童:[
{name:“A1”,值:7},{name:“A2”,值:8},{name:“A3”,值:9},{name:“A4”,值:10},{name:“A5”,值:10}
]
},
{
名称:“B”,
儿童:[
{name:“B1”,值:11},{name:“B2”,值:7},{name:“B3”,值:8},
]
},
{
名称:“C”,
数值:10
},
{
名称:“D”,
数值:10
},
{
名称:“E”,
数值:10
},
{
名称:“F”,
儿童:[
{名称:“F1”,值:11},{名称:“F2”,值:7},{名称:“F3”,值:8},{名称:“F4”,值:5},{名称:“F5”,值:3},{名称:“F6”,值:10}
]
}
],
链接:[{从:“A5”到:“B3”,色码:'绿色'},{从:“B3”到:“A5”,色码:'蓝色'},{从:“A3”到:“C”,色码:'蓝色'},{从:“A2”到:“E”,色码:'蓝色'},{从:“B1”到:“D”,色码:'红色'},{从:“B2”到:“B3”,色码:'蓝色'},{从:“B1”到:“C”,色码:'红色'}]
};
const cloneObj=项目=>{
如果(!item){return item;}//null,则检查未定义的值
让类型=[数字、字符串、布尔],
结果;
//如果有人创建了新字符串('aaa')或新数字('444'),则规范化原语;
type.forEach(函数(类型){
if(类型的项目实例){
结果=类型(项目);
}
});
如果(结果类型==“未定义”){
if(Object.prototype.toString.call(item)=“[Object Array]”){
结果=[];
item.forEach(函数(子级、索引、数组){
结果[指标]=cloneObj(儿童);
});
}else if(项目类型==“对象”){
//测试这是DOM
if(item.nodeType&&typeof item.cloneNode==“函数”){
结果=项克隆节点(真);
}否则,如果(!item.prototype){//请检查这是否为文本
如果(项目实例截止日期){
结果=新日期(项目);
}否则{
//它是一个对象文本
结果={};
对于(让我加入项目){
结果[i]=cloneObj(第[i]项);
}
}
}否则{
//取决于你在这里想要什么,
//只需保留引用,或创建新对象
if(false&&item.constructor){
//不建议这样做,原因是什么
结果=新项。构造函数();
}否则{
结果=项目;
}
}
}否则{
结果=项目;
}
}
返回结果;
}
常量findNode=(父级,名称)=>{
if(parent.name==name)
返回父母;
if(父项、子项){
for(让父对象的子对象。子对象){
const found=findNode(子级,名称);
如果(找到){
发现退货;
}
}
} 
返回null;
}
const findNodeFounders=(父级,名称)=>{
if(parent.name==name)
返回[父];
const children=parent.children | | parent._children;
if(儿童){
为了(让孩子成为孩子){
const found=findNode祖先(子级,名称);
//log('FOUND:',FOUND);
如果(找到){
返回[…找到,父项];
}
}
} 
返回null;
}
设markerCount=0;
常量标记=(颜色,val)=>{
val=val+(markerCount++);
追加(“svg:defs”)。选择全部(“标记”)
.数据([val])
.enter().append(“svg:marker”)
.attr(“id”,字符串)
.attr(“视图框”,“0-5 10”)
.attr(“参考文献”,60)
.attr(“参考文献”,0)
.attr(“markerWidth”,6)
.attr(“markerHeight”,6)
.attr(“方向”、“自动”)
.样式(“填充”,颜色)
.append(“svg:path”)
.attr(“d”,“M0,-5L10,0L0,5”);
返回“url(#“+val+”);
}
//节点点击代码
const nodeColor='#ffefefef';
const isneightrlink=(节点,链接)=>{
返回link.from.data.name==node.name | | link.to.data.name==node.name
}
const getNodeColor=(节点、邻居、计数、isSelectEvent、prevOpacity)=>{
如果(isSelectEvent){
if(neights.indexOf(node.name)<0&&!node.selected&&selectedNodeCount){
返回0.2;
} 
返回1;
}否则{
如果(已选择节点计数){
if(neights.indexOf(node.name)>-1&&!node.selected){
返回selectedNodeCount?0.2:1;
}
返回不透明度;
}否则{
返回1;
}
}
}
const getTextColor=(节点,邻居)=>{
if(neights.indexOf(node.name)<0){
返回“灰色”;
}
返回;
}
常量getLinkColor=(节点,链接)=>{
返回isNeighborLink(节点,链接)?“绿色”:“e5”;
}
常量GetNeights=(节点)=>{
返回data.links.reduce((邻居,链接)=>{
if(link.to==node.name){
邻居。推送(链接。从)
}else if(link.from==node.name){
邻居推送(链接到)
}
返回