dhq_boiler
@dhq_boiler

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

画像のハンドルをShiftキー押下しながらドラッグしたときに、画像のアスペクト比を維持したまま拡大・縮小したい

Q&A

Closed

解決したいこと

C# & WPFでベクターグラフィックスドローイングツールを開発しています。GRAPHERという名前です。

2021-06-14.png

※下にソースコードへの案内を記載しております。よろしければそちらを参照ください。

このツールの、画像をリサイズする機能を実装しようとしているところです。画面左のツールから「picture」をクリックして、現れるファイルダイアログで、貼り付けたい画像の場所を指定して、実際にキャンバスに画像をドラッグで描きます。その後、画像をクリックし、選択状態にしてハンドルを表示させます。ここで、左上、右上、左下、右下のコーナーをドラッグすると、画像がリサイズ(拡大・縮小)します。

単純な画像をリサイズする機能は簡単に実装できましたが、今度はShiftキーを押している間は、画像のアスペクト比が維持されるように拡大・縮小して描画するようにしたいです。
そこで、コミット0454b73のように実装しました。

右上、右下、左下のコーナーをShiftキーを押しながらドラッグすると、画像のアスペクト比を維持しながら拡大・縮小するようになりました。

コーナーをShiftキーを押しながらドラッグする処理はgrapher.Controls.ResizeThumb.csで定義しています。

  • 右上コーナーをShiftキー押しながらドラッグ
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;
  • 右下コーナーをShiftキー押しながらドラッグ
dragDeltaVertical = Math.Min(-e.VerticalChange, minDeltaVertical);
picViewModel.Height.Value = picViewModel.Height.Value - dragDeltaVertical;
picViewModel.Width.Value = (picViewModel.Height.Value / picViewModel.FileHeight) * picViewModel.FileWidth;
  • 左下コーナーをShiftキー押しながらドラッグ
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

何か私の見落とし、致命的な勘違いなど気づいたところがあれば、回答していただけると助かります。よろしくお願いいたします。

0

2Answer

自己解決しました。

DesigneItemViewModelBaseクラスにRightプロパティとBottomプロパティを持たせるようにして
次のようにすればできました。

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;
picViewModel.Top.Value = picViewModel.Bottom.Value - picViewModel.Height.Value;
0Like

アスペクト比を考慮する部分が抜けていますね。
以下のコードで動くと思います。(すごく雑に書いたので手直しの必要はあるかと思います。)

double left = picViewModel.Left.Value;
double top = picViewModel.Top.Value;
dragDeltaHorizontal = Math.Min(e.HorizontalChange, minDeltaHorizontal);
picViewModel.Left.Value = left + dragDeltaHorizontal;
picViewModel.Top.Value = top + (dragDeltaHorizontal / picViewModel.FileWidth) * picViewModel.FileHeight;
picViewModel.Width.Value = picViewModel.Width.Value - dragDeltaHorizontal;
picViewModel.Height.Value = (picViewModel.Width.Value / picViewModel.FileWidth) * picViewModel.FileHeight;
0Like

Comments

  1. @dhq_boiler

    Questioner

    回答ありがとうございます!

Your answer might help someone💌