點的變換
時間限制:2000 ms | 記憶體限制:65535 kb
難度:5
描述 平面上有不超過10000個點,座標都是已知的,現在可能對所有的點做以下幾種操作:
平移一定距離(m),相對x軸上下翻轉(x),相對y軸左右翻轉(y),座標縮小或放大一定的倍數(s),所有點對座標原點逆時針旋轉一定角度(r)。
操作的次數不超過1000000次,求最終所有點的座標。
輸入 只有一組測試資料
測試資料的第一行是兩個整數n,m,分別表示點的個數與操作的個數(n<=10000,m<=1000000)
隨後的一行有n對數對,每個數對的第乙個數表示乙個點的x座標,第二個數表示y座標,這些點初始座標大小絕對值不超過100。
隨後的m行,每行代表一種操作,行首是乙個字元:
首字元如果是m,則表示平移操作,該行後面將跟兩個數x,y,表示把所有點按向量(x,y)平移;
首字元如果是x,則表示把所有點相對於x軸進行上下翻轉;
首字元如果是y,則表示把所有點相對於y軸進行左右翻轉;
首字元如果是s,則隨後將跟乙個數p,表示座標放大p倍;
首字元如果是r,則隨後將跟乙個數a,表示所有點相對座標原點逆時針旋轉一定的角度a(單位是度)
輸出 每行輸出兩個數,表示乙個點的座標(對結果四捨五入到小數點後1位,輸出一位小數字)
點的輸出順序應與輸入順序保持一致
樣例輸入
2 5
1.0 2.0 2.0 3.0
x y
m 2.0 3.0
s 2.0
r 180
樣例輸出
-2.0 -2.0
0.0 0.0
對所有的操作,我們可以用乙個矩陣儲存起來,一系列的操作,我們可以利用矩陣相乘,來儲存!
在多個矩陣操作中,下乙個操作的矩陣一定 左乘 上面所有操作結果矩陣。
即後乙個操作矩陣一定放在前面操作的左邊。
同時由於矩陣沒有乘法交換律,所以絕對不能弄反。
例如按上述順序操作(先旋轉,再縮放,再關於y軸對稱,然後再關於x軸對稱,最後在平移)
上面來自部落格
注意:
1. cmath庫中cos(a) , sin(a) 要求輸入的引數應該為弧度,要將角度換成弧度再輸入
2. 角度化為弧度 , 弧度=角度/180 * pi
3. pi = acos(-1.0)
下面**的思路:
1. 開始是定義3*3矩陣temp,將其初始化為單位矩陣(因為要做乘法)
2. 然後,每接收乙個操作命令,用該操作對應的3*3矩陣pin,去左乘 temp , 即pin * temp 。然後把結果儲存在temp上,也就是說,temp儲存的是前面所有操作的乘積。
3. 所有操作都執行完成後,定義乙個3*3矩陣next ,每次接收乙個點的座標,然後右乘temp. 注意:這裡與上面不同,這裡要求右乘temp ,即temp * next 。
next的形式為
其中xi為第i個點的橫座標,yi為第i個點的縱座標
期間總是不小心改了temp的值,這裡要注意
#include
#include
#include
#include
using
namespace
std;
#define pi acos(-1.0)
typedef
structnode;
node temp;
node multiply(node l,char c)
memset(f.k,0,sizeof(f.k));
for(int i=0;i<3;i++)
}return f;
}void pingyi()
void xfanzhuan()
void yfanzhuan()
void pbei()
void axzhuan()
int main()
memset( temp.k,0,sizeof(temp.k));
temp.k[0][0]=1;
temp.k[1][1]=1;
temp.k[2][2]=1;
char c;
for(int i=0;iscanf("%c",&c);
//printf("c %c\n",c);
switch(c)
}//printf("cos 180 %lf sin 180 %lf\n",cos(180),sin(180));
node next;
for(int i=0;imemset(next.k,0,sizeof(next.k));
next.k[0][0]=a[0][i];
next.k[1][0]=a[1][i];
next.k[2][0]=a[2][i];
next=multiply(next,'r');
printf("%0.1lf %0.1lf\n",next.k[0][0],next.k[1][0]);
}return
0;}
點的變換(矩陣轉化)
link 時間限制 2000 ms 記憶體限制 65535 kb 難度 5 描述 平面上有不超過10000個點,座標都是已知的,現在可能對所有的點做以下幾種操作 平移一定距離 m 相對x軸上下翻轉 x 相對y軸左右翻轉 y 座標縮小或放大一定的倍數 s 所有點對座標原點逆時針旋轉一定角度 r 操作的...
從UIImage的矩陣變換看矩陣運算的原理
1.矩陣的基本知識 struct cgaffinetransform cgaffinetransform cgaffinetransformmake cgfloat a,cgfloat b,cgfloat c,cgfloat d,cgfloat tx,cgfloat ty 為了把二維圖形的變化統一在...
從UIImage的矩陣變換看矩陣運算的原理
1.矩陣的基本知識 struct cgaffinetransform cgaffinetransform cgaffinetransformmake cgfloat a,cgfloat b,cgfloat c,cgfloat d,cgfloat tx,cgfloat ty 為了把二維圖形的變化統一在...