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

1 に答える 1

0

何かの比率を維持したい場合は、ある座標を別の座標に基づいて計算するだけです。したがって、X が変化すると、Y を (AspectRatio * X) に等しく設定します。または、ピタゴラスの定理を使用して開始点からの距離を計算し、それを使用して X と Y を計算することもできますが、中心点は同じです。アスペクト比を維持するには、値に基づく少なくとも 1 つの変数が必要です。別の。

于 2013-02-05T19:54:55.200 に答える