nyoj ACM 點的變換 矩陣運算

2021-07-30 03:15:28 字數 2772 閱讀 9597

點的變換

時間限制: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 為了把二維圖形的變化統一在...