题意:
给出两个点求第二个点绕从原点到第一个点这条轴旋转 r或 − r 得到两个点,输出 z 坐标更大的那个点;
首先普及一下罗德里格斯旋转公式:
对于他的推导及介绍可以访问这个佬罗德里格斯公式 理解、推导_罗格里德斯公式_Bingjian-Gong的博客-CSDN博客
思路:
如果学会了罗德里格斯公式那么这个题是可以直接秒的。
AC代码:
#include<bits/stdc++.h>
#define lmw ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define int long long
using namespace std;
const int N=1e6+10;
const double eps=1e-10;
double a,b,c,x,y,z,r;
const double pi=acos(-1);
struct point{
double a,b,c;
point(double aa,double bb,double cc){
a=aa,b=bb,c=cc;
}
};
double get_dist(point a){
return sqrt(a.a*a.a+a.b*a.b+a.c*a.c);
}
point operator* (point a,double u){
return point(a.a*u,a.b*u,a.c*u);
}
double operator*(point a,point b){
return a.a*b.a+a.b*b.b+a.c*b.c;
}
point operator+(point a,point b){
return point (a.a+b.a,a.b+b.b,a.c+b.c);
}
point operator^(point a,point b){
return point(a.b*b.c-b.b*a.c,a.c*b.a-b.c*a.a,a.a*b.b-a.b*b.a);
}
point get_v(point a,point b,double angle){
double co=cos(angle),si=sin(angle);
return b+((a*si)^b)+((a*(1-co))^(a^b));
}
int check(double x,double y){
if(fabs(x-y)<eps) return 0;
if(x<y) return -1;
return 1;
}
void solve(){
cin>>a>>b>>c>>x>>y>>z>>r;
point k=point(a,b,c);
r=r/180*pi;
double d=get_dist(k);
k=point(a/d,b/d,c/d);
point v={x,y,z};
point x=get_v(k,v,r);
point y=get_v(k,v,-r);
if(check(x.c,y.c)==1){
cout<<fixed<<setprecision(10)<<x.a<<" "<<x.b<<" "<<x.c<<"\n";
}
else cout<<fixed<<setprecision(10)<<y.a<<" "<<y.b<<" "<<y.c<<"\n";
}
signed main(){
lmw;
int t;
cin>>t;
while(t--){
solve();
}
}