0

我试图防止旋转的标签被拖出屏幕,但我无法弄清楚如何在旋转状态下获取对象的 MinX、MaxX、MinY 和 MaxY 。getHeight & getWidth 只返回旋转前的值。

这是一个说明问题的示例:

 var stage = new Kinetic.Stage({
     container: 'container',
     width: window.innerWidth,
     height: window.innerHeight
 });

 var layer = new Kinetic.Layer();

 var labelLeft = new Kinetic.Label({
     x: 95,
     y: 180,
     opacity: 1.0,
     listening: true,
     draggable: true,
     rotationDeg: -45,
     text: {
         text: 'Pointing Arrow',
         fontFamily: 'Calibri',
         fontSize: 20,
         padding: 5,
         fill: 'white'
     },
     rect: {
         fill: 'blue',
         pointerDirection: 'left',
         pointerWidth: 20,
         pointerHeight: 38,
         stroke: 'black',
         strokeWidth: 2
     },
     dragBoundFunc: function (pos) {
         var newY = pos.y < 50 ? 50 : pos.y;
         return {
             x: pos.x,
             y: newY
         };
     }
 });

 layer.add(labelLeft);

 // add the layer to the stage
 stage.add(layer);

http://jsfiddle.net/fSnnA/4/

在这个例子中,我使用了 dragBoundFunc 来防止标签被拖到 y=50 以上。但由于标签已旋转,其实际最高点 (MinY) 已更改,因此您可以将其向上拖动并部分移出视图。

我真正需要的是一个返回绝对当前 MinX、MaxX、MinY 和 MaxY 的函数——考虑到旋转角度和文本长度并不总是相同的。

任何人都可以帮忙吗?

4

1 回答 1

3

这是计算旋转矩形(标签)的边界框大小的方法。

var w =    label.getWidth();
var h =    label.getHeight();
var rads = label.getRotation();
var c =    Math.abs(Math.cos(rads));
var s =    Math.abs(Math.sin(rads));
var newWidth =  h * s + w * c;
var newHeight = h * c + w * s;

然后假设你总是围绕中心旋转,左/上边界是:

var centerX = label.getX()+label.getWidth()/2;
var centerY = label.getY()+label.getHeight()/2;

var MinX = centerX - newWidth/2;
var MinY = centerY - newHeight/2;

[免责声明:这只是我的想法 - 相应地审查它!]

于 2013-05-15T19:36:53.950 回答