回分類題庫
d172: 2010 程式達人 C - GL座標轉換問題
出處:

Difficulity : N/A
Accepted : 2 Times | Submit :119 Times | Clicks : 3045
Accepted : 2 Users | Submit : 11 Users | Accepted rate : 18%
Time Limit :3000 ms | Memory Limit : 64000 KBytes
題目加入時間 : 2010-05-16 18:57

Content :

據了解,GL將盜走的一批MVIDIA的繪圖晶片藏在數個地方,並用了特殊的方式加密。所幸在情資單位的努力下,破解了GL的加密方式。我們破解得到的資料顯示,該加密系統是將一連串藏匿位置的座標,經過一連串的矩陣運算加密而成的座標轉換。

座標轉換是日常生活中常見的問題,如:3D繪圖軟體、或者是遊戲都有它的蹤跡。座標轉換最直覺的方法就是使用矩陣,物體的平移、旋轉和縮放都可以透過特定的矩陣表示,有了這些矩陣和想要轉換的座標點,透過矩陣乘法就可以得到轉換後的座標。此外,我們定義圓周率等於3.1415926。

這裡使用的座標點乃是三維空間上的一點,但為了方便起見,座標點在座標轉換時,會視為四維空間的資料,但其第四維為1(如座標(2,3,4)的表示方式為(2,3,4,1))。常見的座標轉換公式矩陣如下(皆為4X4矩陣):

一、平移矩陣:
glTranslate(x,y,z);
,其中x, y, z分別表示對x, y, z軸的平移量。

二、旋轉矩陣:
glRotate(x,y,z,angle);

表示對向量軸(x,y,z)逆時針旋轉angle度(角度),這裡的向量(x,y,z)必須經過標準化(||(x, y, z)|| = 1)。其中c代表cos(angle),s代表sin(angle)。

縮放矩陣:
glScale(x,y,z);
,其中x, y, z分別表示對x, y, z軸的縮放量。

Input :

題目包含數筆測試資料,對每筆測試資料而言,一開始會有數個三維空間中的座標點:(a,b,c),其中a, b, c都是實數。緊接著會有一個座標轉換的指令組,每行都只有一個指令,指令組是以”glBegin();”指令開始和”glEnd();”指令做為結束,在這開始指令和結束指令之間會有數組指令:"glTranslate(x,y,z);"、" glRotate(x,y,z,angle);"和"glScale(x,y,z);",分別代表平移、旋轉和縮放。其中x,y,z和angle都是實數,其意義如前所述。可以參考範例輸入。可以假設輸入的資料不會造成矩陣運算錯誤,或者有除以零的情況。

Output :

對每一組資料而言,將所有輸入的座標點經過輸入指令轉換成新的座標點。每一行依序輸出一個對應座標點(a',b',c'),分別對應該組測資輸入的座標點,經過該組的輸入指令轉換過的結果依序輸出,並四捨五入到整數。一組資料若是有5個座標點,則輸出會有五行轉換過的座標點。詳情請參考範例輸出。可以假設輸出資料並不會有溢位的情況發生。
假設有一個座標轉換的指令組如下:
glBegin();
glTranslate(0,1,0);
glRotate(0,1,0,90);
glScale(2,0,0);
glEnd();
令輸入的座標點為P,轉換過的結果為P',上述五行指令中的平移、旋轉、縮放的矩陣分別為T, R, S。則P'為TRSP相乘的結果,意即越晚下的指令會越早套用在座標點上。

Sample Input :

(1,0,0)
glBegin();
glRotate(0,0,1,180);
glEnd();
(1,1,0)
(1,0,1)
(0,1,1)
glBegin();
glTranslate(0,1,0);
glRotate(0,1,0,90);
glScale(2,0,0);
glEnd();

Sample Output :

(-1,0,0)
(0,1,-2)
(0,1,-2)
(0,1,0)

Hint :

解題率: 0

Author :


  Solve it!   Status Forum (1)

C++
C
JAVA
22028. pandia (62 ms , 508KB)
22022. admin (76 ms , 512KB)
沒有解題記錄 沒有解題記錄

執行時間會受很多因素影響因此僅供參考,主機等級請看這裡