高度な翻訳
次の図は、翻訳の 2 つの解釈を示しています。
例 A では、単純な変換の例では、オブジェクトは回転せずに移動されます。 例 B では、オブジェクトの接触点の位置に応じて、変換中にオブジェクトが回転します。 「1 本指の回転」の説明に従って 1 本指の回転を有効にした場合は、複雑な翻訳を有効にすることができます。 次の図は、平行移動を実行するときの 1 本指回転のさまざまなコンポーネントを示しています。
オブジェクトが移動されると、半径が再計算され、ピボット ポイントが移動されます。
次のコードは、複雑な翻訳を可能にする ManipulationDelta の実装でこれを行う方法の 1 つを示しています。
//Apply transformation based on rotationDelta (in radians)
FLOAT rads = 180.0f / 3.14159f;
m_dObj->Rotate(rotationDelta*rads, x, y);
// Apply translation based on scaleDelta
m_dObj->Scale(scaleDelta);
// Apply translation based on translationDelta
m_dObj->Translate(translationDeltaX, translationDeltaY);
// Set values for one finger rotations
FLOAT fPivotRadius = (FLOAT)(m_dObj->get_Width() + m_dObj->get_Height())/8.0f;
FLOAT fPivotPtX = m_dObj->get_CenterX();
FLOAT fPivotPtY = m_dObj->get_CenterY();
m_manip->put_PivotPointX(fPivotPtX);
m_manip->put_PivotPointY(fPivotPtY);
m_manip->put_PivotRadius(fPivotRadius);
注意
オブジェクト変換は、ピボット ポイントと半径が計算される前に行われます。 この方法では、ユーザーがオブジェクトの移動中にオブジェクトに対して展開を実行すると、オブジェクトは正しく移動します。
関連トピック