Как получить ограничивающую рамку, которая содержит все элементы в Paper.js? - PullRequest
0 голосов
/ 21 октября 2018

Как мы можем получить ограничивающий Rectangle, который содержит все элементы в проекте?

В настоящее время я вычисляю их один за другим:

calc-bounds = (scope) ->
    fit = {}
    for layer in scope.project.layers
        for item in layer.children
            for <[ top left ]>
                if item.bounds[..] < fit[..] or not fit[..]?
                    fit[..] = item.bounds[..]
            for <[ bottom right ]>
                if item.bounds[..] > fit[..] or not fit[..]?
                    fit[..] = item.bounds[..]
    #console.log "fit bounds: ", fit
    top-left = new scope.Point fit.left, fit.top
    bottom-right = new scope.Point fit.right, fit.bottom
    new scope.Rectangle top-left, bottom-right

Обоснование

Функция "Fit all", которая устанавливает project.center и project.zoom, будет нужнарасчет.

1 Ответ

0 голосов
/ 22 октября 2018

Вы можете просто объединить (объединить) все границы от всех элементов.

Это вернет Прямоугольник , который плотно подходит всемэлементы, или ограничивающий прямоугольник.

Вот Эскиз .

А вот код:

var items = [
    new Path.Circle({
        position: new Point(100, 200),
        radius: 50,
        fillColor: 'blue'
    }),
    new Path.Circle({
        position: new Point(200, 70),
        radius: 50,
        fillColor: 'purple'
    }),
    new Path.Circle({
        position: new Point(400, 100),
        radius: 50,
        fillColor: 'magenta'
    })
]

// Unite all bounds from all items.
var unitedBounds = items.reduce((bbox, item) => {
    return !bbox ? item.bounds : bbox.unite(item.bounds)
}, null)

// Draw the united bounds.
var bbox = new Path.Rectangle(unitedBounds)
bbox.strokeColor = 'black'
...