2013-02-05 24 views
1

我试图实现一个选择工具,如流行的图形编辑器,如gimp或photoshop,如果你按住Shift选择,它保持一个比例。在下面的代码是它的主要部分,为了简单起见,我把它作为一个正方形。 该代码计算鼠标位置,移动Block类的X,Y位置,然后调整它的宽度和高度。如果按下Shift键,它会变成方形。如果我从右下或左右方向移动,它几乎可以工作,但在其他情况下,它会改变整个块的位置。任何方案?如何保持一个矩形工具的比例

private void ItemsControl_MouseMove(object sender, System.Windows.Input.MouseEventArgs  e) 
{ 
    if (((ItemsControl)sender).IsMouseCaptured) 
    { 
    Block = new Block(); 

    Point mpi = GuidesSnap(e.GetPosition((ItemsControl)sender)); 

    double dx = mpi.X - mp.X; 
    double dy = mpi.Y - mp.Y; 

    switch (draggingState) 
    { 
     case 0: 
     if (Math.Sqrt(dx * dx + dy * dy) > 2) 
     draggingState = 1; 
     break; 
     case 1: 
     block.X = (int)Math.Round(mp.X); 
     block.Y = (int)Math.Round(mp.Y); 
     block.Width = 3; 
     block.Height = 3; 
     draggingState = 2; 
     break; 
     case 2: 
     if (dx < 0) 
     { 
      block.X = (int)Math.Round(mp.X + dx); 
     } 
     if (dy < 0) 
     { 
      block.Y = (int)Math.Round(mp.Y + dy); 
     } 
     block.Width = (int)Math.Abs(Math.Round(dx)); 
     block.Height = Keyboard.Modifiers == ModifierKeys.Shift ? block.Width : (int)Math.Abs(Math.Round(dy)); 
     break; 
    } 
    } 
} 

回答

0

如果你想保持东西的比例,那么你只需要计算一个基于另一个的坐标。所以当X改变时,你将Y设置为(AspectRatio * X)。或者,您可以使用毕达哥拉斯定理来计算从起点开始的距离,然后用它来计算X和Y--但中心点是相同的:为了保持纵横比,您至少需要一个基于该值的变量另一个。

+0

我看到了,这就是我所做的,在示例中保留了1的比例,所以双方都是平等的,但可以是任何其他值,因为我将选区移动到该区域时不起作用。 –

+0

那么,实际上毕达哥拉斯的提示是非常有帮助:) –

+0

很高兴我能帮忙! – sircodesalot

相关问题