【问题标题】:Resizing a rectangle and snapping to a fixed ratio调整矩形大小并捕捉到固定比例
【发布时间】:2013-03-03 06:23:16
【问题描述】:

我目前有代码,当用户单击多个锚点时,该代码会根据鼠标移动调整矩形的大小,这些锚点对应于以下区域: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 的工作机会。我必须确定一个合适的条件来捕捉宽度或高度。

【问题讨论】:

    标签: c# .net math aspect-ratio


    【解决方案1】:

    我想通了。

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

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

    【讨论】:

    • 太棒了!如果它不适合任何一种情况会发生什么?那它的比例已经合适了?
    【解决方案2】:

    只需捕捉到具有较高比率的那个。无论哪个更大,都应该驱动矩形的形状。只要确保你抓住了所有的情况——都 > 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;
    }
    

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

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

    【讨论】:

    • 这仍然只是基于一侧的捕捉。我希望它根据鼠标所在位置的宽度或高度来捕捉。一个例子是矩形选框工具如何在 Photoshop 中以固定比例工作。
    猜你喜欢
    • 1970-01-01
    • 2012-09-30
    • 1970-01-01
    • 2018-10-18
    • 1970-01-01
    • 2018-03-01
    • 2012-02-11
    • 2017-06-27
    • 2019-04-06
    相关资源
    最近更新 更多