D2D を使用してビットマップを表示する WinRT アプリに取り組んでいます。ビットマップでパンとズームができるようにマルチタッチを組み込むことを検討しています。
OnManipulatedUpdated イベントを使用して累積変換を更新しています。累積的な倍率を見つける方法を見つけましたが、累積的な平行移動係数を見つけることができないようです (ユーザーが拡大縮小された画像のサイズを超えてパンすることは望ましくありません。
累積翻訳が何であるかを調べる方法はありますか?
これが私のコードです:
D2D1::Matrix3x2F m_mxTransform;
property float CurrentScaleFactor
{
float get() { return sqrt(fabs(m_mxTransform.Determinant())); }
}
void OnManipulationUpdated(
_In_ Windows::UI::Input::GestureRecognizer^ recognizer,
_In_ Windows::UI::Input::ManipulationUpdatedEventArgs^ args)
{
Point position = args->Position;
Point positionDelta = args->Delta.Translation;
float currentScale = CurrentScaleFactor;
float preAdjustedScale = args->Delta.Scale;
ManipulationDelta adjustedDelta = LimitManipulationScale(args->Delta, currentScale);
float newScale = currentScale * adjustedDelta.Scale;
//Update the transformation to
D2D1::Matrix3x2F transformDelta;
if (preAdjustedScale == adjustedDelta.Scale)
{
transformDelta =
D2D1::Matrix3x2F::Scale(adjustedDelta.Scale, adjustedDelta.Scale, D2D1::Point2F(args->Position.X, args->Position.Y)) *
D2D1::Matrix3x2F::Translation(args->Delta.Translation.X, args->Delta.Translation.Y);
}
else // don't translate
{
transformDelta =
D2D1::Matrix3x2F::Scale(adjustedDelta.Scale, adjustedDelta.Scale, D2D1::Point2F(args->Position.X, args->Position.Y));
}
m_mxTransform = m_mxTransform * transformDelta;
....
m_d2dContext->SetTransform(m_mxTransform);
}