山东省第四届ACM程序设计竞赛A题:Rescue The Princess(向量旋转)
Description
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.
Input
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).
Output
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.
Sample Input
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
Sample Output
(-50.00,86.60) (-86.60,50.00) (-36.60,136.60) (1.00,1.00)
Hint
这个题想赢求坐标不是很方便,最好还是用向量旋转的方法
我们令a(x1,y1),b(x2,y2),角度为A
则
公式:
x3 = (x2-x1)*cosA-(y2-y1)*sinA+x1;
y3 = (x2-x1)*sinA - (y2-y1)*cosA + y1;
代码如下
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
#define maxn 110
#define INF 0x3f3f3f3f
#define mem(a,b) memset(a,b,sizeof(a))
typedef long long ll;
int gcd(int a,int b){return b?gcd(b,a%b):a;}
int main()
{
double r,x1,x2,y1,y2;
double x3,y3;
int n;
cin >> n;
while(n--){
cin >> x1>>y1>>x2>>y2;
x3 = (x2-x1)/2-(y2-y1)/2*sqrt(3)+x1;
y3 = (y2-y1)/2+(x2-x1)/2*sqrt(3)+y1;
printf("(%.2f,%.2f)\n",x3,y3);
}
return 0;
}