2013-03-14 16 views
0

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

回答

1

我想通了。

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

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

+0

太棒了!如果它不适合两种情况会发生什么?那么它的比例已经适当了? – 2013-03-14 19:07:12

+0

这是正确的。 – 2013-03-14 19:10:18

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; 
} 

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

有一件事我会非常高推荐是 - 当用户拖动您的锚时强制宽高比约束,而不是当他们放置时。如果你这样做,用户的感觉会更加直观。

+0

这仍然只是基于一方的捕捉。我希望它根据鼠标的位置根据宽度或高度进行捕捉。一个例子是矩形选框工具如何在Photoshop中以固定比例工作。 – 2013-03-14 18:56:44