點的變換(矩陣轉化)

2021-07-04 09:32:07 字數 2229 閱讀 7555

link:

時間限制:

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.0xy

m 2.0 3.0

s 2.0

r 180

樣例輸出

-2.0 -2.0

0.0 0.0

**

經典問題

分析:如果按照題目描述的那樣模擬,肯定會超時。這時就要找一種快速變換的方法。

對這兩條公式的證明:詳見

這樣就可以先算出經過m次變換後形成的最終矩形,然後用點的座標乘以矩形就可以求出答案。

ac code:

#include#include#include#include#include#include#include#include#define ll long long 

#define maxn 1000010

using namespace std;

const int inf=0x3f3f3f3f;

const double pi=acos(-1.0);

struct pointp[maxn];

//----以下為矩陣快速冪模板-----//

//const int mod=1000;//模3,故這裡改為3即可

int mod=2;

const int num=4;//定義矩陣能表示的最大維數

int n;//n表示矩陣的維數,以下的矩陣加法、乘法、快速冪都是按n維矩陣運算的

struct mat

void init()//將其初始化為單位矩陣

return ans;

}mat pow_sum(mat a,int num)//(a+a^2+a^3....+a^n)%mod 矩陣的冪和

mat mov(mat a,double x,double y)

mat x_ud(mat a)

mat y_lr(mat a)

mat s_large(mat a,double p)

mat rot(mat a,double angle)

void output(mat a)//輸出矩陣 }}

//----以上為矩陣快速冪模板-----//

int main()

a.init();

n=3;

while(m--)

else if(ch=='s')

else if(ch=='r')

} for(i=1;i<=n;i++)

return 0;

}

nyoj ACM 點的變換 矩陣運算

點的變換 時間限制 2000 ms 記憶體限制 65535 kb 難度 5 描述 平面上有不超過10000個點,座標都是已知的,現在可能對所有的點做以下幾種操作 平移一定距離 m 相對x軸上下翻轉 x 相對y軸左右翻轉 y 座標縮小或放大一定的倍數 s 所有點對座標原點逆時針旋轉一定角度 r 操作的...

NYOJ 298 點的變換 矩陣乘法

最好還是自己手推一下矩陣式子.不算太難.但是有一些小知識 首先當然是矩陣的細節.矩陣是不支援交換率的.所以如圖的式子乘進去時要放在左邊.還有的比如說 cmath裡的sin函式用的是弧度制.需要把度數 180 m pi m pi是cmath裡定義的常數 double在取固定小數字的時候小負數四捨五入會...

(Python)矩陣轉化

曉萌最近在做乙個翻轉的應用,你可能也知道,其實是由乙個個的點組成的。於是,曉萌想先做乙個可以翻轉矩陣的程式,來解決他問題的核心部分。輸入第一行包括由空格分開的整數 m,n,t 0 n,m 200 m,n,t 0m 20 0 tt 的值為 0 0 或 1 1。其中 m m 和 n n 分別表示待處理矩...