缩放点以匹配背景。Actionscript 3 (英语)

Scaling points to match background. Actionscript 3

提问人:PKYNI 提问时间:7/2/2014 更新时间:7/7/2014 访问量:130

问:

使用我在网上找到的一些代码帮助我为我尝试制作的程序创建了一个缩放函数。它是制作一张地图,允许用户标记点。目前,代码仅在地图图像上放大,但我无法让点图标重新对齐到它们最初的位置。我无法计算它的数学。

用于放大和缩小的代码

if (mev.shiftKey) {
    image.scaleX = Math.max(scaleFactor*image.scaleX, minScale);
    image.scaleY = Math.max(scaleFactor*image.scaleY, minScale);
}

if (mev.ctrlKey) {
    image.scaleX = Math.min(1/scaleFactor*image.scaleX, maxScale);
    image.scaleY = Math.min(1/scaleFactor*image.scaleY, maxScale);
    mat = image.transform.matrix.clone();
    MatrixTransformer.matchInternalPointWithExternal(mat,internalCenter,externalCenter);
    image.transform.matrix=mat;

这允许图像根据以下因素进行缩放

    public var scaleFactor:Number = 0.8;
    public var minScale:Number = 0.25;
    public var maxScale:Number = 2.0;

当我尝试移动覆盖在此图像上的指针图标时,会出现此问题。它们目前不会变大或缩小,但是我无法通过数学方法让它们将正确数量的像素从鼠标位置移开,以便它们仍然对齐。目前我正在使用以下公式

//decrease zoom
stage.getChildAt(i).x = stage.getChildAt(i).x * scaleFactor;

//increase zoom
stage.getChildAt(i2).x = stage.getChildAt(i2).x / scaleFactor;

有什么想法吗?我使用的代码来自 http://www.flashandmath.com/howtos/zoom/

ActionScript-3 比例 公式

评论

0赞 BotMaster 7/2/2014
你不能直接将因子应用于 x 属性,这将给你带来错误的结果。相反,首先计算 x 位置应该在不缩放的情况下的位置,然后应用缩放因子,然后设置 x 属性。
0赞 PKYNI 7/3/2014
你好,试过了。当我放置图钉/指针时,我可以得到正确的位置,但是当我添加比例因子时,它不会适当地移动。stage.getChildAt(i).x 是缩放前的正确位置。我确定我需要一个公式,但想不起来
0赞 BotMaster 7/3/2014
这种功能非常容易实现,因为它只涉及一个因子值。有明确定义的静态位置 x 和 y,并且比例因子应用于两者,这就是它的结束。例如,定义良好的位置 x:100、y:200 且比例因子为 0.5 将变为 x:50、y:100。这真的没什么难的。您可以通过将新的 x,y 位置(缩放)除以缩放因子来检查缩放是否正确,结果应始终为相同的值。
0赞 PKYNI 7/7/2014
问题是用户可以放大地图上的任何位置,并且比例因子以复合方式增加,我将上传一个演示到我的服务器,以便您可以看到它当前的作用以及当前代码,以便能够下载,因为比例因子和引脚的位置让我发疯,我无法很好地解释它
0赞 PKYNI 7/7/2014
查看尝试和源代码的网站链接在这里链接

答:

0赞 BotMaster 7/7/2014 #1

问题中缺少很多元素,例如下面的移动地图。无论如何,现在已经解决了......

如果你不是数学天才,不能同时处理 2 个数学公式,那就不要,一个接一个地解决它们,然后将它们组合起来。同样,不要使用 point 的 x,y 属性进行计算,而是创建特定属性(例如在自定义类中)。为了方便起见,我将在这里命名它们的起源。 给定一个原点属性为 x:100、y:200 的点,它在地图上的位置为(假设地图是左上角的坐标,如果没有相应地调整):

point.x = map.x + point.origin.x;
point.y = map.y + point.origin.y;

定位已解决,现在您需要求解规模,这很简单:

point.x = point.origin.x * scaleFactor;
point.y = point.origin.y * scaleFactor;

两个系统都已解决,现在您可以将两者结合起来:

point.x = map.x + (point.origin.x * scaleFactor);
point.y = map.y + (point.origin.y * scaleFactor);