2013-03-14 47 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