Several days ago, a beast caught a beautiful princess and the princess was put in prison. To rescue the princess, a prince who wanted to marry the princess set out immediately. Yet, the beast set a maze. Only if the prince find out the maze’s exit can he save the princess.
The first line is an integer T(1 <= T <= 100) which is the number of test cases. T test cases follow. Each test case contains two coordinates A(x1,y1) and B(x2,y2), described by four floating-point numbers x1, y1, x2, y2 ( |x1|, |y1|, |x2|, |y2| <= 1000.0).
For each test case, you should output the coordinate of C(x3,y3), the result should be rounded to 2 decimal places in a line.
4 -100.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 0.00 0.00 100.00 100.00 1.00 0.00 1.866 0.50
(-50.00,86.60) (-86.60,50.00) (-36.60,136.60) (1.00,1.00)
最原始方法是算算算,在别人博客学到的是用旋转矩阵的,感觉厉害多了..
例如:把向量写成坐标形式并视为一个2*1列向量,再左乘一个2*2的矩阵,这样得到的新的2*1列向量就是旋转后的向量的坐标。(2*2矩阵结构如下:设旋转 角度为a, 那么左上角和右下角的元素为cos(a), 右上角的元素为-sin(a), 左下角的元素为sin(a))。
#include<cstdio> #include<cstring> #include<cmath> const double sq3=sqrt(3.0); double m1[1][2],m3[1][2]; double m2[2][2]= {{0.5,sq3/2},{-sq3/2,0.5}}; void so() { memset(m3,0,sizeof(m3)); for(int k=0; k<2; ++k) for(int j=0; j<=1; ++j) { //printf("m1[0][%d]=%lf m2[%d][%d]=%lf\n",k,m1[0][k],k,j,m2[k][j]); m3[0][j]+=m1[0][k]*m2[k][j]; } } int main() { int T; scanf("%d",&T); while(T--) { double x1,x2,y1,y2; scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2); m1[0][0]=x2-x1; m1[0][1]=y2-y1; so(); printf("(%.2lf,%.2lf)\n",m3[0][0]+x1,m3[0][1]+y1); } return 0; }