d3力导向图增加节点_d3.js 画力导向图 带箭头 文字 方形节点 动态添加节点

该博客主要介绍了如何使用d3.js库来创建力导向图,并添加箭头、文字以及方形节点。通过`svg_coordinate.js`计算节点与连线的交点,实现动态添加节点时的精确布局。文中详细讲解了不同角度下箭头坐标计算方法以及判断连线与坐标轴关系的逻辑。
摘要由CSDN通过智能技术生成

svg_coordinate.js  用于计算矩形与连线的交点位置

var coordinate = {};

/**

* 判断直线与水平线夹角

* @param x1 点1的x坐标

* @param y1 点1的y坐标

* @param x2 点2的x坐标

* @param y2 点2的y坐标

* @returns {number}角度

*/

coordinate.findAngle= function(x1,y1,x2,y2){

var k = (y1-y2)/(x1-x2);

var result = Math.atan(k)*180/Math.PI;

return result;

};

//计算箭头坐标

coordinate.findArrowPoint = function(x1,y1,x2,y2,rectWidth,rectHeight){

var rect_x = rectWidth/2;

var rect_y = rectHeight/2;

var x;

var y;

var selection = coordinate.findSelection(x1,y1,x2,y2);

//如果与x轴水平,并在点2的左侧

if(11 == selection){

x = x2 - rect_x;

y = y2;

return [x,y]

}

//如果与y轴水平,并在点2的上面

if(22 == selection){

x = x2;

y = y2 - rect_y;

return [x,y]

}

//如果与x轴水平,并在点2的右侧

if(33 == selection){

y = y2;

x = x2 + rect_x;

return [x,y]

}

//如果与y轴水平,并在点2的下面

if(44 == selection){

x = x2;

y = y2 + rect_y;

return [x,y]

}

var angle = Math.abs(coordinate.findAngle(x1,y1,x2,y2));

var x_offset = 0;

var y_offset = 0;

if(1 == selection){

if(angle == 45){

x = x2 - rect_x;

y = y2 - rect_y;

return [x,y];

}

if(angle < 45){

y_offset = rect_x * coordinate.tan(angle);

y = y2 - y_offset;

x = x2 - rect_x;

return [x,y]

}

x_offset = rect_y / coordinate.tan(angle);

y = y2 - rect_y;

x = x2 - x_offset;

return [x,y];

}

if(2 == selection){

if(angle == 45){

x = x2 + rect_x;

y = y2 - rect_y;

return [x,y];

}

if(angle < 45){

y_offset = rect_x * coordinate.tan(angle);

y = y2 - y_offset;

x = x2 + rect_x;

return [x,y]

}

x_offset = rect_y / coordinate.tan(angle);

y = y2 - rect_y;

x = x2 + x_offset;

return [x,y];

}

if(3 == selection){

if(angle == 45){

x = x2 + rect_x;

y = y2 + rect_y;

return [x,y];

}

if(angle < 45){

y_offset = rect_x * coordinate.tan(angle);

y = y2 + y_offset;

x = x2 + rect_x;

return [x,y]

}

x_offset = rect_y / coordinate.tan(angle);

y = y2 + rect_y;

x = x2 + x_offset;

return [x,y];

}

if(4 == selection){

if(angle == 45){

x = x2 - rect_x;

y = y2 + rect_y;

return [x,y];

}

if(angle < 45){

y_offset = rect_x * coordinate.tan(angle);

y = y2 + y_offset;

x = x2 - rect_x;

return [x,y]

}

x_offset = rect_y / coordinate.tan(angle);

y = y2 + rect_y;

x = x2 - x_offset;

return [x,y];

}

};

coordinate.tan = function (angle){

return Math.tan(angle*Math.PI/180)

};

coordinate.findSelection = function(x1,y1,x2,y2){

var up = 0;

if(y1-y2 < 0 ){

up = 1

}else if(y1-y2 > 0){

up = -1

}

var left = 0;

if(x1 - x2 < 0){

left = 1;

}else if(x1 - x2 > 0){

left = -1;

}

if(up > 0 && left > 0){

return 1;

}

if(up > 0 && left <0){

return 2;

}

if(up < 0 && left < 0){

return 3;

}

if(up < 0 && left > 0){

return 4;

}

if(up == 0 && left > 0){

return 11

}

if(left == 0 && up > 0){

return 22

}

if(up == 0 && left < 0){

return 33

}

if(left == 0 && up <0){

return 44

}

};

Title

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值