1

現在、ユーザーが次の領域に対応する複数のアンカーをクリックしたときに、マウスの動きに基づいて長方形のサイズを変更するコードがあります: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の確率で機能します。幅または高さのいずれかをスナップするための適切な条件を特定する必要があります。

4

2 に答える 2

1

私はそれを考え出した。

if (Height * widthRatio <= Width)
    Width = Height * widthRatio;
else if (Width * heightRatio <= Height)
    Height = Width * heightRatio;

これにより、Photoshopの機能が固定比率でエミュレートされます。

于 2013-03-14T19:02:27.677 に答える
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;
}

もちろん、これは私があなたの比率についてあなたが話していることを知っていることを前提としています。古い長さ(または幅)と新しい長さ(または幅)の比率だと思っていました。

私が強くお勧めすることの1つは、ユーザーがアンカーを配置するときではなく、ユーザーがアンカーをドラッグしているときにアスペクト比の制約を強制することです。そうすれば、感覚はユーザーにとってはるかに直感的になります。

于 2013-03-14T18:34:29.980 に答える