高级翻译

下图显示了翻译的两种解释。

图,首先显示简单的翻译,其中对象在不旋转的情况下移动,然后显示高级翻译,这涉及到移动旋转

在示例 A 中,简单转换示例将移动对象而不旋转。 在示例 B 中,对象在转换期间旋转,具体取决于对象接触点的位置。 如果按 Single-Finger 旋转中所述启用单指旋转,则可以启用复杂的翻译。 下图显示了执行翻译时单指旋转的各种组件。

显示单指旋转组件的 插图:透视点、透视点和透视点

移动对象时,将重新计算半径,并移动透视点。

以下代码演示了在实现 ManipulationDelta 中可实现复杂翻译的一种方法。

    //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);       
   

注意

在计算透视点和半径之前发生对象转换。 这样,如果用户在移动对象时对对象执行扩展,则对象将正确移动。