我使用raphael路径创建了一个多边形。可以拖动多边形的顶点以拉伸以更改多边形的形状/大小。
测试正在运行here
现在我要实现的是,如果我在边缘上进行dblclick,它应该创建一个新的顶点。所以它可以作为一个牵引点。
任何人都可以帮我确定路径中某个点的位置:
var p = r.path("M100,300L100,100L250,300z");
如果在200,250上发生鼠标事件,如何识别路径数组中的哪个位置,新点命令是否合适?
var p = r.path("M100,300L200,250L100,100L250,300z");
OR
var p = r.path("M100,300L100,100L200,250L250,300z");
答案 0 :(得分:2)
我的实现略有不同,但是你可以随时调整它(如果这太多了(我实际上只要在纸上的任何地方点击鼠标就可以在多边形中插入新点)。
Raphael.el.MakeDraggable
:添加处理程序以拖放任何元素(即点或多边形)Raphael.el.InsertPoint
:在多边形Paper.circle()
var oPaper = Raphael('#paper', '100%', '100%');
var oPoint = oPaper.circle(nX, nY, nRadius);
oPoint.MakeDraggable();
Paper.path()
oPolygon.data()
var oPaper = Raphael('#paper', '100%', '100%');
var oPolygon = oPaper.path(sPath);
oPolygon.InsertPoint(oPoint);
为了在多边形的路径中插入新创建的点,我遵循了以下两个步骤:
这两个步骤易于理解,但难以实施(尤其是第一步)。这是第一步详述。假设你在多边形的每一边循环(一边等于2个点),我们需要提供一个包含所有距离的数组,这样我们才能得到最低的数据。
C +-------+ A + M
\ | The shortest / The shortest
\ | distance is [MG] / distance is [MA]
\ G +--------+ M C +----+ A
\ | \ |
\ | \ |
\ | \ |
\| \|
+ B + B
包含距离的数组现在应包含oM与多边形边之间的所有距离。我们需要找到较低的(可以有多个具有相同的值)。因此,遍历它并构建另一个包含最低距离索引的数组。
获得此新阵列后,请检查其长度:
// Don't forget to bind points to their polygon
oPolygon.data('points', oPoints); // oPoints is a Raphael set containing the points
// There are different approaches, mine was to bind the other way as well
oPoint.data('polygon', oPolygon);