当调整另一个图像的大小时,KineticJS会重新计算图像的位置

KineticJS recalculate position of image when another is resized

本文关键字:图像 新计算 计算 位置 KineticJS 另一个 调整 小时      更新时间:2023-09-26

好吧,这更像是一个数学问题,但它使用的是我开发的KineticJs代码。目前我有一个舞台和层次,这一切都设置得很好。一旦一个特定的组被调整了大小(让我们称之为背景),我就使用一个函数来更新另一个组的位置(好吧,称之为前景),使用

.move ({x: (calculation), y: (calculation)})

方法。我希望前景重新定位,使其在调整大小后在背景中的位置不变。ie:它随着bg移动,如果bg上有一个小圆圈,我把前景放在这个圆圈里,调整大小后前景应该仍然在圆圈里

我的变量如下(数字不应该仅仅代表什么):

bgX = the background width before resize.
bgXfinal = the background width after resize.
bgY = the background height before resize.
bgYfinal = the background height after resize.
fgX = foreground position x  (from topleft point) within the bg.
fgY = foreground position y (from topleft point) within the bg.

背景通过这个数学计算按比例调整大小(以及其他计算,但这是主要部分):

bgYfinal = bottomLeft.getY() - topLeft.getY();
bgXfinal = image.getWidth() * bgYfinal / image.getHeight();

我需要的是.move()的x和y位置的坐标计算;方法,我无法计算出来,无论出于什么原因,我都无法计算出来。无论图像是变大还是变小,计算都应该有效,因为它缩小的结果将给出负的x/y调整,而它放大的结果将提供正的x/y调整。

目前我有:

// bg size is increasing
if ( bgX < bgXfinal ) {
    group.move( {  x: (bgXfinal - bgX), y: (bgYfinal - bgY) } );
}
// bg size is decreasing
if ( bgX > bgXfinal ) {
    group.move( {  x: (bgXfinal - bgX), y: (bgYfinal - bgY) } );
}

显然,这是不正确的,因为获取差异并将其添加到位置会使前景按预期移动,但移动太大。如果我除以2,把前景正好放在中心,它就起作用了。但是我需要它适用于背景上的任何位置,如果你精通数学的Id喜欢在背景增加/减少时确定前景位置的正确计算

好吧,经过一些研究,我发现KineticJs中有一种方法支持这种功能。setPosition();该方法可以基于从包含图像的大小调整提供的计算来重置内部图像的位置。这里的数学:

var x = innerGroup.getPosition().x,
    y = innerGroup.getPosition().y,
    newX = x / oldX * newWidth,
    newY = y / oldY * newHeight;
    innerGroup.setPosition( { x: newX, y: newY } );
    innerLayer.draw();

将其放入重新调整大小时重新计算容器尺寸的代码部分,内部组的位置将与外部组新调整大小的尺寸成比例变化。