Умножение с матрицей тождества в Direct2D-почему?

Я использую C++. Я видел [here](-here I should add the link-)код ниже на MSDN:

m_pRenderTarget->BeginDraw();
m_pRenderTarget->SetTransform(D2D1::Matrix3x2F::Identity());
m_pRenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::White));

Интересно, почему они умножаются с помощью матрицы идентичности. Это не меняет:
I * A = A if A * B = C. I * C = C, нетC * I = A, поэтому это не C * I = Aтак , но мой друг сказал, что если яSetTransform(identity), rendertarget становится начальным состоянием.

Почему они умножаются с помощью матрицы идентичности?

3 ответа

  1. Начальное преобразование может быть нулевым, или это может быть мусор (неинициализированный), или это может быть даже идентичность, но мы не знаем. Поэтому вы должны установить для него значение identity, чтобы знать, что такое преобразование. Независимо от того, что такое начальное преобразование на самом деле, вы должны предположить, что оно является unitialized и присвоить ему значение, прежде чем использовать его.

  2. Я видел здесь, что этот синтаксис должен использоваться, когда нужно удалить текущее преобразование

    Они говорят, если у вас есть:

     pRenderTarget->SetTransform(
        D2D1::Matrix3x2F::Rotation(20, D2D1::Point2F(100,100)));
    

    Преобразование применяется ко всем последующим операциям рисования до повторного вызоваSetTransform. Чтобы удалить текущее преобразование, вызовите SetTransformматрицу идентификаторов, возвращаемую Matrix3x2F::Identityфункцией.

    pRenderTarget->SetTransform(D2D1::Matrix3x2F::Identity());
    
  3. SetTransform не следует путать с чем-то вроде MultiplyTransform(чего не существует). Вы задаете преобразование, не добавляя его. В Direct2D, это до вас, чтобы сделать push/pop манипуляции матрицы стиля.