生活随笔
收集整理的這篇文章主要介紹了
nyoj298_点的变换_错误
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
點的變換
時間限制:
2000?ms ?|? 內存限制:65535?KB 難度:
5 描述
平面上有不超過10000個點,坐標都是已知的,現在可能對所有的點做以下幾種操作:
平移一定距離(M),相對X軸上下翻轉(X),相對Y軸左右翻轉(Y),坐標縮小或放大一定的倍數(S),所有點對坐標原點逆時針旋轉一定角度(R)。????
操作的次數不超過1000000次,求最終所有點的坐標。
?
提示:如果程序中用到PI的值,可以用acos(-1.0)獲得。
輸入
只有一組測試數據
測試數據的第一行是兩個整數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 #include <iostream>
#include <cstdio>
#include <cmath>
#define PI acos(-1.0)
using namespace std;struct Point{double m[
3][
1];
};struct matrix2{double m[
3][
3];
};Point point[10005];
//點的坐標
matrix2 opera[
5];
//五種操作的對應矩陣
matrix2 ans;void init(matrix2 &
t){for(
int i=
0;i<
3;i++
){for(
int j=
0;j<
3;j++
){t.m[i][j]=
0;}}for(
int i=
0;i<
3;i++
){t.m[i][i]=
1;}
}matrix2 mult(matrix2 a,matrix2 b){//操作矩陣相乘
matrix2 t;for(
int i=
0;i<
3;i++
){for(
int j=
0;j<
3;j++
){t.m[i][j]=
0;for(
int k=
0;k<
3;k++
){t.m[i][j]+=a.m[i][k]*
b.m[k][j];}}}return t;
}Point mult2(matrix2 a,Point b){Point t;for(
int i=
0;i<
3;i++
){for(
int j=
0;j<
1;j++
){t.m[i][j]=
0;for(
int k=
0;k<
3;k++
){t.m[i][j]+=a.m[i][k]*
b.m[k][j];}}}return t;
}void moper(
double p,
double q){ans.m[0][
2]+=
p;ans.m[1][
2]+=
q;
}void soper(
double p){matrix2 tmp;init(tmp);tmp.m[0][
0]=
p;tmp.m[1][
1]=
p;ans=
mult(ans,tmp);
}void xoper(){matrix2 tmp;init(tmp);tmp.m[1][
1]=-
1;an ;
}void yoper(){matrix2 tmp;init(tmp);tmp.m[0][
0]=-
1;ans=
mult(ans,tmp);
}void roper(
float pp){matrix2 tmp;init(tmp);double tt=pp/
180.0*
PI;float aaa=
cos(tt);tmp.m[0][
0]=
aaa;aaa=-
sin(tt);tmp.m[0][
1]=
aaa;aaa=
sin(tt);tmp.m[1][
0]=
aaa;aaa=
cos(tt);tmp.m[1][
1]=
aaa;ans=
mult(ans,tmp);
}int main()
{int N,M;double p=
180;double t=p/
180.0*
PI;printf("%lf",sin(t));scanf("%d %d",&N,&
M);for(
int i=
0;i<N;i++
){scanf("%lf %lf",&point[i].m[
0][
0],&point[i].m[
1][
0]);}char o;double t1,t2;init(ans);for(
int i=
0;i<M;i++
){getchar();scanf("%c",&
o);if(o==
'X'){xoper();continue;}if(o==
'Y'){yoper();continue;}if(o==
'M'){scanf("%lf %lf",&t1,&
t2);moper(t1,t2);continue;}if(o==
'S'){scanf("%lf",&
t1);soper(t1);continue;}if(o==
'R'){scanf("%lf",&
t1);roper(t1);continue;}}for(
int i=
0;i<N;i++
){Point tt;tt=
mult2(ans,point[i]);printf("%.1lf %.1lf\n",tt.m[
0][
0],tt.m[
1][
0]);}return 0;
} ?
轉載于:https://www.cnblogs.com/TWS-YIFEI/p/5934113.html
總結
以上是生活随笔為你收集整理的nyoj298_点的变换_错误的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。