New routers can be defined in the `joint.routers` namespace (e.g. `joint.routers.myRouter`) or passed directly as a function to the `router` property of a link (or to the `defaultRouter` option of a paper).

In either case, the router function must return an array of route points that the link should go through (not including the start/end connection points). The function is expected to have the form `function(vertices, args, linkView)`:

vertices | Array<g.Point> | The vertices of the route.
args | object | An object with additional optional arguments passed to the router method by the user when it was called (the `args` property).
linkView | dia.LinkView | The LinkView of the connection. The Link model can be accessed as the `model` property; this may be useful for writing conditional logic based on link attributes.

Example of a router defined in the `joint.routers` namespace:

    joint.routers.randomWalk = function(vertices, args, linkView) {

        var NUM_BOUNCES = args.numBounces || 20;

        vertices = joint.util.toArray(vertices).map(g.Point);

        for (var i = 0; i < NUM_BOUNCES; i++) {

            var sourceCorner = linkView.sourceBBox.center();
            var targetCorner = linkView.targetBBox.center();

            var randomPoint = g.Point.random(sourceCorner.x, targetCorner.x, sourceCorner.y, targetCorner.y);
            vertices.push(randomPoint)
        }

        return vertices;
    }

    var link = new joint.shapes.standard.Link();
    link.source(source);
    link.target(target);

    link.router('randomWalk', {
        numBounces: 10
    });

An example of a router passed as a function is provided below. Notice that this approach does not enable passing custom `args` nor can it be serialized with the `graph.toJSON()` function.

    var link = new joint.shapes.standard.Link();
    link.source(source);
    link.target(target);

    link.router(function(vertices, args, linkView) {

        var NUM_BOUNCES = 20;

        vertices = joint.util.toArray(vertices).map(g.Point);

        for (var i = 0; i < NUM_BOUNCES; i++) {

            var sourceCorner = linkView.sourceBBox.center();
            var targetCorner = linkView.targetBBox.center();

            var randomPoint = g.Point.random(sourceCorner.x, targetCorner.x, sourceCorner.y, targetCorner.y);
            vertices.push(randomPoint)
        }

        return vertices;
    });