一个问题是,当您设置ddx
或ddy
定位在一侧时,您会将该值作为椭圆的中心点反馈回来,以便它们“捕捉”到一侧。
第二件事是你在这个边界框的左上角进行计算,而不是这个(ox + dx)的实际计算位置。这就是造成混乱的原因。
这不是最漂亮的实现,但我想尽量减少对代码的更改,用这个替换 move 函数:
move = function (dx, dy) {
var width =this.paper.width,
height = this.paper.height,
thisBox = this.getBBox()
//, box = {
// "x" :thisBox.width,
// "y" :thisBox.height,
// "x2" :width-thisBox.width,
// "y2" :height-thisBox.height,
// "width" :width-thisBox.width,
// "height" :height-thisBox.height
// };
// var outOfBound=!Raphael.isBBoxIntersect(thisBox,box)
;
console.log(thisBox.width,width,thisBox.x,thisBox
,this.ox);
var ddx = this.ox + dx;
var ddy = this.oy + dy;
if (this.type == 'ellipse') {
ddx -= thisBox.width / 2;
ddy -= thisBox.height / 2;
}
if(ddx < 0){
ddx = 0;
}else if(ddx>width-thisBox.width ){
ddx = width-thisBox.width;
}
if(ddy < 0){
ddy = 0;
}else if(ddy>height-thisBox.height ){
ddy = height-thisBox.height;
}
var att = this.type == "rect" ? {x: ddx, y: ddy} : {cx: ddx + (thisBox.width / 2), cy: ddy + (thisBox.height / 2)};
this.attr(att);
for (var i = connections.length; i--;) {
r.connection(connections[i]);
}
r.safari();
}
在开始时,我们根据 的位置计算ddx
和ddy
作为左上角this
。(如果是椭圆,则进行调整,如ox
中心oy
坐标)。
然后它与以前大致相同,尽管当我们将值设置回来时,我们会重新调整椭圆的值。您可以更改存储/使用的值以避免重复计算。
这对我行得通。
编辑
将代码复制到它自己的fiddle中。