Вы можете получить доступ к текущей матрице преобразования панели с помощью параметра transform
.Итак, в следующем примере:
var vis = new pv.Panel()
.width(200)
.height(200);
var panel = vis.add(pv.Panel)
.event("mousewheel", pv.Behavior.zoom(1))
.fillStyle('#ccc');
var dot = panel.add(pv.Dot)
.data([[25,25],[25,75],[75,25],[75,75]])
.top(function(d) d[0])
.left(function(d) d[1])
.size(30)
.fillStyle('#999');
vis.render();
Если вы загрузите этот пример, а затем немного увеличите масштаб, вы можете получить доступ к текущей матрице преобразования следующим образом:
var t = panel.transform(),
tk = t.k, // scale factor, applied before x/y
tx = t.x, // x-offset
ty = t.y; // y-offset
Вы должны бытьвозможность определить, находится ли дочерняя метка (например, в этом примере dot
) в видимой области, применяя матрицу преобразования к ее параметрам top
и left
, а затем проверяя, находятся ли они в пределах панелиоригинальная ограничительная коробка (0,0,200,200).Для dot
выше, вы можете проверить так:
function(d) {
var t = panel.transform(),
// assuming the current dot instance is accessible as "this"
x = (this.left() + t.x) * t.k, // apply transform to dot x position
y = (this.top() + t.y) * t.k; // apply transform to dot y position
// check bounding box. Note that this is a little simplistic -
// I'm just checking dot center, not edges
return x > panel.left() && x < (panel.left() + panel.width()) &&
y > panel.top() && y < (panel.top() + panel.height());
}