1

我目前有代码,当用户单击与以下区域相对应的多个锚点时,它会根据鼠标移动调整矩形的大小:Left、Top、Right、Bottom、TopLeft、TopRight、BottomLeft、BottomRight。

因此用户可以单击并拖动顶部锚点,它将根据鼠标的位置调整矩形的顶部坐标。所有其他锚点都一样。

事实上,我想通过根据动作捕捉矩形的适当边来强制执行固定比例(例如 2:3 或 5:7)。我已经为左、上、右和下锚做了这个,因为它很容易,如果我调整宽度,我只需要根据比例自动调整高度,反之亦然。

我遇到的困难是当用户拖动诸如右下角或左上角锚点之类的角时。我需要弄清楚如何选择拍摄哪一面。我有鼠标坐标和矩形的左、上、右和下。

这是我尝试过的代码:

case Anchor.BottomRight:
    float maxRight = CursorPosition.X;
    float maxBottom = CursorPosition.Y;

    float newRight = Bounds.Left + (Bounds.Width * widthRatio);
    float newBottom = Bounds.Top + (Bounds.Height * heightRatio);

    if (newRight < maxRight)
    {
        Width = Height * widthRatio;
    }
    else
    {
        Height = Width * heightRatio;
    }

    break;

在 2:3 的固定比率示例中,widthRatio 为 0.666,heightRatio 为 1.5。

这段代码有一半的时间可以工作,但当然它基本上是 50/50 的工作机会。我必须确定一个合适的条件来捕捉宽度或高度。

4

2 回答 2

1

我想到了。

if (Height * widthRatio <= Width)
    Width = Height * widthRatio;
else if (Width * heightRatio <= Height)
    Height = Width * heightRatio;

这将以固定比率模拟 Photoshop 中的功能。

于 2013-03-14T19:02:27.677 回答
0

只需捕捉到具有更高比率的那个。无论哪个更大,都应该驱动矩形的形状。只要确保你抓住了所有的情况——都 > 1,都 < 1,和一个或另一个:

bool calcHeight;
if (widthRatio >= 1 && heightRatio >=1)
{
    calcHeight= (widthRatio > heightRatio);
}
else if (widthRatio < 1 && heightRatio < 1)
{
    calcHeight= (widthRatio < heightRatio); // because the width change is "bigger"
}
else if (widthRatio >= 1)
{
    calcHeight= (widthRatio > (1.0/heightRatio)); // get them both > 1
}
else
{
    calcHeight= (widthRatio < (1.0/heightRatio)); // get them both < 1
}

if (calcHeight)
{
    Height = Width * heightRatio;
} else {
    Width = Height * widthRatio;
}

当然,这是假设我知道你在谈论你的比率。我假设它是旧长度(或宽度)与新长度(或宽度)的比率。

强烈推荐的一件事是 - 在用户拖动锚点时强制纵横比约束,而不是在他们放置锚点时。如果这样做,用户的感觉会更加直观。

于 2013-03-14T18:34:29.980 回答