微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript – 如何使用raphael.js为每个角绘制一个带控制点的多边形

如何使用raphael.js在多边形的每个角上绘制带控制点的多边形形状.

控制点应该是可拖动的,当控制点移动时,相关线也应该移动.有什么想法吗?

解决方法:

这是一种方法.首先为每个控制点绘制一个圆,如下所示:

// Creates canvas
var paper = Raphael("canvas1", "100%", "100%");

// create small circle for each polygon point
var p1 = paper.circle(150, 50, 5).attr("fill", "blue");
var p2 = paper.circle(200, 100, 5).attr("fill", "blue");
var p3 = paper.circle(200, 200, 5).attr("fill", "blue");
var p4 = paper.circle(100, 200, 5).attr("fill", "blue");
var p5 = paper.circle(100, 100, 5).attr("fill", "blue");

接下来,我们需要连接控制点,以便在更新时线条会自动重绘.在this question中有一个方便的功能,我在这里重现它,稍微修改以适应我们的需要(它现在侦听拖动事件,接受行属性作为参数并修复我在评论中注意到的错误原问题):

// Modified from: https://stackoverflow.com/questions/9956186/raphael-js-maintain-path-between-two-objects
// Call paper.connect(obj1,obj2,attributes)
// That draws a line between the two objects and maintains the line when the objects are animated
Raphael.fn.connect = function(obj1, obj2, attribs) {
    // list of paths each object has
    if (!obj1.connections) obj1.connections = []
    if (!obj2.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(attribs)
    // 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.drag.*", 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'))
                });
            }
        }
    });
}

使用此功能,我们现在可以连接相邻的控制点.

// connect adjacent polygon points
paper.connect(p1,p2,{stroke:"red"});
paper.connect(p2,p3,{stroke:"red"});
paper.connect(p3,p4,{stroke:"red"});
paper.connect(p4,p5,{stroke:"red"});
paper.connect(p5,p1,{stroke:"red"});

接下来我们想让我们的控制点可拖动.我们可以这样做:

// make points draggable
var start = function () {
    this.ox = this.attr("cx");
    this.oy = this.attr("cy");
},
move = function (dx, dy) {
    this.attr({cx: this.ox + dx, cy: this.oy + dy});
},
up = function () {};
paper.set(p1,p2,p3,p4,p5).drag(move, start, up);

将所有这些放在一起将为您提供一个带有可拖动顶点和边的多边形,这些顶点在拖动顶点时会更新.

你可以在行动here中看到它的一个例子

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐