5298. 坐标变换(其二)
作者:
浩淼大海
,
2024-11-28 00:51:21
,
所有人可见
,
阅读 3
#include<bits/stdc++.h>
using namespace std;
//前缀和的思想运用
//在处理x.y,坐标的时候要注意,我的x是基于xy原来的值进一步计算的,y亦然,所以二者的计算是同时进行的,故需要定义一个值来存储。
const int N=1e6+5;
double mul[N];
double theta[N];
int main(){
int n,m;
cin>>n>>m;
//先进行读入操作,倍数增长的,累乘记录,角度累加;
//前缀和思想
//操作下标1开始
//double x1=1.0;double y1=0.0;
mul[0]=1;
for(int i=1;i<=n;i++){
int act;
cin>>act;
if(act==1){
double nu;
cin>>nu;
mul[i]=nu*mul[i-1];
theta[i]=theta[i-1];
}else{
double ta;
cin>>ta;
theta[i]=ta+theta[i-1];
//cout<<"$$$"<<theta[i]<<"***";
mul[i]=mul[i-1];
}
}
while(m--){
int beg,en;
cin>>beg>>en;
double m,tt;
m=mul[en]/mul[beg-1];
tt=theta[en]-theta[beg-1];
double x,y;
cin>>x>>y;
//xcosθ−ysinθ ,纵坐标为 xsinθ+ycosθ
int x1=x;//先处理x,x有变化了再用这个x去计算y的话就有问题了
x=x*cos(tt)-y*sin(tt);
y=x1*sin(tt)+y*cos(tt);
x=x*m;
y=y*m;
cout<<fixed<<setprecision(3)<<x<<" "<<y<<endl;
}
// cout<<"@"<<mul[6]<<"#"<<theta[1];
return 0;
}