1. 程式人生 > >用二維變換矩陣表示一個矩形(rect)

用二維變換矩陣表示一個矩形(rect)

在2d處理圖形的時候,矩形(rect)被用到的地方相當的多。
最主要的是用在影象位置的表示上。
rect由4個數表示:x, y, width,height 或 left, top, right, bottom。
但是,如果影象發生了旋轉(例如30度),rect就無法表示影象的位置了,有一種可行的表示方案是用4個點表示(x1,y1),(x2,y2)(x3,y3),(x4,y4).

adobe pdf 提供了一種利用二維變換矩陣(M)表示rect的高效方法:
用一個固定的rect 和一個變換矩陣(M)來表示。
為了方便運算,固定的rect的位置為: x=0, y=0,wdith=1, height=1;
最終的rect被認為是經過M變換後得到的新區域。
最終的位置處理巧妙的轉換成了對矩陣的處理。在記錄的時候,rect是固定的,無需記錄,只需記錄矩陣(6個數)即可,因此記錄一個旋轉矩陣用此方法只需6個數即可。
下面是依據此法,計算旋轉影象的4個頂點(傳入的是一個表示影象位置的矩陣):

void MatGetRectVertex(const double *m_in, double *vertex_out){
    // llx
    vertex_out[0] = m_in[4];

    // lly
    vertex_out[1] = m_in[5];

    // ulx
    vertex_out[2] = m_in[4] + m_in[2];

    // uly
    vertex_out[3] = m_in[5] + m_in[3];

    // urx
    vertex_out[4] = m_in[4] + m_in[0] + m_in[2];

    // ury
    vertex_out[5
] = m_in[5] + m_in[1] + m_in[3]; // lrx vertex_out[6] = m_in[4] + m_in[0]; // lry vertex_out[7] = m_in[5] + m_in[1]; }