2016-02-09 51 views
0

我有我的代碼工作翻譯,唯一的問題是我似乎無法居中它。 我試圖做 「translate = translate * center」,並將它移動到它的右上角。我不確定我還能做什麼。我知道我的矩陣功能正常工作,我在這裏錯過了什麼?2D轉換,C++,旋轉/平移/比例/居中

oid viewContext::calculate() { 
std::cout << "calculate" << std::endl; 

/* 
* reinitialize these values 
*/ 
translated.clear(); 
translated[0][0] = 1; 
translated[1][1] = 1; 
translated[2][2] = 1; 

//translated = translated * center; 
//if translate is called 
if (whichMethod == trans) { 
    translated = translated * center; 
    translated = translated * S; 
    translated = translated * T; 
} 

的,如果在上面的代碼語句是我是想出來的,我知道它的非必要的。

matrix viewContext::model_to_device(const matrix& param) { 

    std::cout << "model to device" << std::endl; 

    //matrix hold_values = param; 

    matrix hold_values = translated * param; 

    return hold_values; 

} 

我的翻譯,旋轉等方法看起來像這樣。在這種方式被格式化很好,他們稱之爲計算()在結束

void viewContext::rotator(double degree) { 
std::cout << "Rotate" << std::endl; 

double theta = ((degree * M_PI)/180); 
R[0][0] = cos(theta); 
R[0][1] = -1 * sin(theta); 
R[1][0] = sin(theta); 
R[1][1] = cos(theta); 
calculate(); 

}

viewContext::viewContext() : 
     translated(3, 3), inverted(3, 3), center(3, 3), T(3, 3), S(3, 3), R(3, 
       3) { 
    //clear matrix just incase it isn't empty 
    //Should be empty but this is precautionary 
    translated.clear(); 

    inverted.clear(); 

    /* 
    * Constant values 
    * echelon form 
    */ 
    T[0][0] = 1; 
    T[1][1] = 1; 
    T[2][2] = 1; 

    /* 
    * Constant values 
    * 300 = x, 400 = y to put at origin. 
    */ 
    center[0][0] = 1; 
    center[0][2] = width; 
    center[1][1] = -1; 
    center[1][2] = height; 
    center[2][2] = 1; 

    /* 
    * Constant values 
    * Echelon form 
    */ 
    S[0][0] = 1; 
    S[1][1] = 1; 
    S[2][2] = 1; 

    //TODO 
// /* 
// * Constant values 
// * Echelon form 
// */ 
    translated[0][0] = 1; 
    translated[1][1] = 1; 
    translated[2][2] = 1; 

    /* 
    * Constant values 
    * Echelon form 
    */ 
    R[0][0] = 1; 
    R[0][1] = 0; 
    R[1][0] = 0; 
    R[1][1] = 1; 
    R[2][2] = 1; 

    calculate(); 
} 

那是我的構造,其中中心實施的一部分。

private: 

    /* translation matrix */ 
    matrix translated; 

    /* translation inverse matrix */ 
    matrix inverted; 

    /* to center the image */ 
    matrix center; 

    matrix T; 
    matrix S; 
    matrix R; 

    const int height = 300; 
    const int width = 400; 
    void calculate(); 

    int whichMethod; 
}; 

情況下(KEY_U): 的std :: COUT < < 「鍵按下向下」 < <的std :: ENDL; tY = tY-20; vContext.translation(tX,tY); gc-> clear(); derived→draw(gc,& vContext); 休息;

我不完全確定我會做錯什麼。 我使用鍵盤翻譯(向上,向下箭頭鍵和什麼不是。向左) 完美的作品,但由於我的中心部分已實施,它將移動到右上角,然後開始翻譯。我不確定發生了什麼問題。 任何幫助將不勝感激!

+0

你的問題並沒有提供很多關於你在做什麼的信息,但它看起來像是在均勻座標系中的平移和旋轉的矩陣表示。你在哪裏使用它們? OpenGL的?請記住,使用矩陣時,順序很重要,所以你'翻譯=中心* S * T'首先適用於T,然後S,然後居中,如果你以後計算'翻譯* coordinateVector' – Anedar

+0

@Andar對不起我的其他帖子,有人寫我提供了太多的信息。 我在一個基於Linux的虛擬機上。 center是我的矩陣,它包含您在代碼中看到的內容。T包含已翻譯的座標。 S包括縮放後的座標。 我是否應該在這裏放置代碼部分? 但是,我先居中,然後縮放,然後翻譯。我相信這是實施它的正確方法。 有什麼我失蹤? –

+1

從你發佈的代碼中,'center','R'和'translated'是矩陣。但是S和T是什麼?你期望'model_to_device()'做什麼?你應該提供與你的問題相關的所有信息 - 只有那些相關的信息。 – Anedar

回答

0

我假設你的矩陣乘法正確實施,那麼你的翻譯矩陣構建爲

translated = 1 * center * S * T 

其中1是你最初的身份矩陣。

我進一步從您的意見認爲parammodel_to_device()是一個座標向量,導致

hold_values = translated * param 
hold_values = center * S * T * param 

正如你可能會看到,第一個運營商應用到實際PARAM爲T,則S,然後中心。所以,首先你轉換座標,然後縮放它們(縮放中心在(0,0)),然後使用你的中心矩陣來轉換它們(寬度,高度)並反轉y。所以基本上你先翻譯,然後縮放,然後居中。

+0

翻譯初始化爲在rref中很多,在對角線上有1s。 但我想我明白你的意思,所以我真的應該有 翻譯= T * S *中心 在我的計算()部分? 所以我在做我的數學倒退呢? –

+0

從我所說的 翻譯=翻譯*中心; 翻譯=翻譯* S; 翻譯=翻譯* T; 所以這並不意味着我先乘以中心,那麼S,那麼T?而不是反之亦然 –

+0

您按這個順序相乘矩陣,是的,但是您總是從左邊翻譯過來,右邊是另一個矩陣。矩陣乘法不可交換。請參閱http://en.wikipedia.org/wiki/Matrix_multiplication – Anedar