主要原因是因为 jtopo 4.8源码里面有一个地方连线判断错了,把那个源码改了就好。
先看看效果
网上也有类似的,但是下载需要收费,最后终于在github上看到了一个
https://github.com/wenyuan/jtopo_topology
/*
如果存在点之间存在多条线 那么每条线应该相互之间有间距
TODO 调整 原代码 在2个点之间有连续的环形线(A_Z,Z_A...)会产生计算不正确的BUG
因为A_Z会进行一次paint紧接着Z_A也会进行一次,虽然正确的计算出了偏移量,但是角度确是计算相反了
所以当f为负数时 应该交换 b与c的坐标
*/
// 获得线的路线 返回 顶点按顺序排列的坐标数组
this.getPath = function () {
var a = [], b = this.getStartPosition(), c = this.getEndPosition();
if (this.nodeA === this.nodeZ)
return [b, c];
var d = e(this.nodeA, this.nodeZ);//点之间的线的条数
if (1 >= d) return [b, c];
var f = Math.atan2(c.y - b.y, c.x - b.x);//计算线的角度系数
//发出点的拐点坐标
var g = {
x: b.x + this.bundleOffset * Math.cos(f),//半径(斜边)* Math.cos(f) = 偏移横坐标 + b.x = 发出点的拐点横坐标
y: b.y + this.bundleOffset * Math.sin(f)//半径(斜边)*Math.sin(f) = 偏移纵坐标 + b.y = 发出点的拐点横坐标
},
//终止点的拐点坐标
h = {
x: c.x + this.bundleOffset * Math.cos(f - Math.PI),//由于-PI 所以角度相反
y: c.y + this.bundleOffset * Math.sin(f - Math.PI)//由于-PI 所以角度相反
},
i = f - Math.PI / 2,
j = f - Math.PI / 2;
var k = (d - 1) * this.bundleGap / 2,
l = this.bundleGap * this.nodeIndex,
m = {
x: g.x + l * Math.cos(i),
y: g.y + l * Math.sin(i)
},
n = {
x: h.x + l * Math.cos(j),
y: h.y + l * Math.sin(j)
};
m = {
x: m.x + k * Math.cos(i - Math.PI),
y: m.y + k * Math.sin(i - Math.PI)
},
n = {
x: n.x + k * Math.cos(j - Math.PI),
y: n.y + k * Math.sin(j - Math.PI)
};
var ft = Math.atan2(b.y - c.y, b.x - c.x);
var it = ft - Math.PI / 2;
var jt = ft - Math.PI / 2;
var temp1x = c.x + this.bundleOffset * Math.cos(ft) + l * Math.cos(it) + k * Math.cos(it - Math.PI);
var temp1y = c.y + this.bundleOffset * Math.sin(ft) + l * Math.sin(it) + k * Math.sin(it - Math.PI);
var temp2x = b.x + this.bundleOffset * Math.cos(f) + l * Math.cos(jt) + k * Math.cos(jt - Math.PI);
var temp2y = b.y + this.bundleOffset * Math.sin(f) + l * Math.sin(jt) + k * Math.sin(jt - Math.PI);
a.push({x: b.x, y: b.y});
if ((i * f > 0) && i < 0) {
a.push({x: m.x, y: m.y});
a.push({x: n.x, y: n.y});
} else {
a.push({x: temp2x, y: temp2y});
a.push({x: temp1x, y: temp1y});
}
a.push({x: c.x, y: c.y});
return a
},
最主要的是这段代码
在源码中找到这个方法,将我这个方法替换成源码中的那个方法就OK了