画像のハンドルをShiftキー押下しながらドラッグしたときに、画像のアスペクト比を維持したまま拡大・縮小したい
解決したいこと
C# & WPFでベクターグラフィックスドローイングツールを開発しています。GRAPHERという名前です。
※下にソースコードへの案内を記載しております。よろしければそちらを参照ください。
このツールの、画像をリサイズする機能を実装しようとしているところです。画面左のツールから「picture」をクリックして、現れるファイルダイアログで、貼り付けたい画像の場所を指定して、実際にキャンバスに画像をドラッグで描きます。その後、画像をクリックし、選択状態にしてハンドルを表示させます。ここで、左上、右上、左下、右下のコーナーをドラッグすると、画像がリサイズ(拡大・縮小)します。
単純な画像をリサイズする機能は簡単に実装できましたが、今度はShiftキーを押している間は、画像のアスペクト比が維持されるように拡大・縮小して描画するようにしたいです。
そこで、コミット0454b73のように実装しました。
右上、右下、左下のコーナーをShiftキーを押しながらドラッグすると、画像のアスペクト比を維持しながら拡大・縮小するようになりました。
コーナーをShiftキーを押しながらドラッグする処理はgrapher.Controls.ResizeThumb.csで定義しています。
double top = picViewModel.Top.Value;
dragDeltaVertical = Math.Min(Math.Max(-minTop, e.VerticalChange), minDeltaVertical);
picViewModel.Top.Value = top + dragDeltaVertical;
picViewModel.Height.Value = picViewModel.Height.Value - dragDeltaVertical;
picViewModel.Width.Value = (picViewModel.Height.Value / picViewModel.FileHeight) * picViewModel.FileWidth;
dragDeltaVertical = Math.Min(-e.VerticalChange, minDeltaVertical);
picViewModel.Height.Value = picViewModel.Height.Value - dragDeltaVertical;
picViewModel.Width.Value = (picViewModel.Height.Value / picViewModel.FileHeight) * picViewModel.FileWidth;
double left = picViewModel.Left.Value;
dragDeltaHorizontal = Math.Min(Math.Max(-minLeft, e.HorizontalChange), minDeltaHorizontal);
picViewModel.Left.Value = left + dragDeltaHorizontal;
picViewModel.Width.Value = picViewModel.Width.Value - dragDeltaHorizontal;
picViewModel.Height.Value = (picViewModel.Width.Value / picViewModel.FileWidth) * picViewModel.FileHeight;
発生している問題
左上のコーナーをShiftキーを押しながらドラッグする処理のコードを試しながら書いたのですが、正しく動作しませんでした。
試したコードはこのようなものです。
double top = picViewModel.Top.Value;
dragDeltaVertical = Math.Min(Math.Max(-minTop, e.VerticalChange), minDeltaVertical);
picViewModel.Top.Value = top + dragDeltaVertical;
double left = picViewModel.Left.Value;
dragDeltaHorizontal = Math.Min(Math.Max(-minLeft, e.HorizontalChange), minDeltaHorizontal);
picViewModel.Left.Value = left + dragDeltaHorizontal;
picViewModel.Width.Value = (picViewModel.Left.Value + picViewModel.Width.Value) - (picViewModel.Left.Value + dragDeltaHorizontal);
picViewModel.Height.Value = (picViewModel.Top.Value + picViewModel.Height.Value) - (picViewModel.Top.Value + dragDeltaVertical);
ソースコード
GRAPHER
https://github.com/dhq-boiler/grapher
gitリポジトリ
https://github.com/dhq-boiler/grapher.git
何か私の見落とし、致命的な勘違いなど気づいたところがあれば、回答していただけると助かります。よろしくお願いいたします。