gpt4 book ai didi

javascript - Raphael JS - 维护两个对象之间的路径

转载 作者:搜寻专家 更新时间:2023-11-01 04:38:32 25 4
gpt4 key购买 nike

我为 Raphael JS 创建了一个插件。它基本上允许您调用

paper.connect(obj1,obj2,color)

在两个对象之间画一条线,并在对象动画时保持这条线。到目前为止,这是我想出的。它可以工作,但性能不是很好,关于我可以做些什么来实现同样的事情的任何建议。

Raphael.fn.connect = function(obj1, obj2, colour) {
// list of paths each object has
obj1.connections = []
obj2.connections = []
// get the bounding box of each object
var box1 = obj1.getBBox()
var box2 = obj2.getBBox()
// create a line/path from object 1 to object 2
var p = this.path("M" + (box1.x + box1.width / 2) + ","
+ (box1.y + box1.height / 2) + "L" + (box2.x + box2.width / 2)
+ "," + (box2.y + box2.height / 2))
// adjust attributes of the path
p.attr({
stroke : colour,
"stroke-linecap" : "round",
"stroke-opacity" : Math.max(obj1.attr('opacity'), obj2.attr('opacity'))
})
// set the start and end element for this path
p.startElement = obj1;
p.endElement = obj2;
// add the path to each of the object
obj1.connections.push(p)
obj2.connections.push(p)
// mark each object as being connected
obj1.connected = true;
obj2.connected = true;
// listen for the Raphael frame event
eve.on("raphael.anim.frame.*", function(obj) {
// if the object the frame event is fired on is connected
if (this.connected) {
// for each connection on this object
for ( var c in this.connections) {
var path = this.connections[c]; // temp path
var b1 = path.startElement.getBBox(); // get the current
// location of start
// element
var b2 = path.endElement.getBBox();// get the current location
// of end element
// move the path to the new locations
path.attr({
path : "M " + (b1.x + b1.width / 2) + " "
+ (b1.y + b1.height / 2) + "L "
+ (b2.x + b2.width / 2) + " "
+ (b2.y + b2.height / 2),
opacity : Math.max(path.startElement.attr('opacity'),
path.endElement.attr('opacity'))
});
}
}
});
}

不相信这是最好的方法,但这是我第一次使用 Raphael,所以我只是通过查看 Raphael 源代码来完成所有这些......

最佳答案

在我们的应用程序中,我们有一个线条工具。我们将带有 2 个可移动端点的线放到纸上。

我们应用程序中的所有形状都有一个关联的 VisualModel,其中包含它们内部的所有几何数据。这些 VisualModels 也兼作 Actor 。任何 Actor 都可以订阅任何其他 Actor,当发生变化时,所有感兴趣的各方都会做出响应。

像这样的系统允许通过重绘函数更改线条的路径,只要两个连接的对象修改其 X/Y 坐标,该函数就会被调用。

connecting_line.js(重绘)

redraw: function() {
var x1 = this.shapeView1.visualModel.get('x'),
y1 = this.shapeView1.visualModel.get('y'),
x2 = this.shapeView2.visualModel.get('x'),
y2 = this.shapeView2.visualModel.get('y'),
pathData;

pathData = 'M' + x1 + ',' + y1 + 'L' + x2 + ',' + y2;

this.line.attr({
path: pathData,
fill: '#000000',
stroke: LineConstants.COLOR,
'stroke-width': LineConstants.THICKNESS
});
}

我们创建了“可移动的”mixin。这个 mixin 可以让你为你的形状添加可移动性。这个 mixin 会更新 x/y 坐标,然后触发你的线类会拾取的 'change' 事件。

移动.js

handleDraggging: function(delta) {
this.shape.move(delta);
}

move: function(delta) {
//... compute movement based on delta
this.visualModel.set('x', xPosition);
this.visualModel.set('y', yPosition);
}

connecting_line.js

initialize: function(shapeView1, shapeView2) {
// ...
this.shapeView1 = shapeView1;
this.shapeView2 = shapeView2;

this.listenTo(shapeView1.visualModel, 'change:x change:y', this.redraw);
this.listenTo(shapeView2.visualModel, 'change:x change:y', this.redraw);
}

这方面的表现非常棒。您可以通过访问 eventbrite.com、创建事件、启用预留座位(第 2 步)、添加新 map 、单击左侧的“对象”并在纸上画一条线来查看它的实际效果。

关于javascript - Raphael JS - 维护两个对象之间的路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9956186/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com