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)
给你等边三角形的两个点A和B,求第三个点C的坐标;
且ABC是逆时针的;
题解1:
因为要求ABC是逆时针的,所以可以直接用B绕A逆时针旋转60°;
这里有个通用的公式,证明稍微复杂,可以加到模板里以备不时之需:
点(x1,y1)绕点(x2,y2)逆时针旋转a角度后新的坐标(X,Y)为:
X=(x1-x2)*cos(a)-(y1-y2)*sin(a)+x2;
Y=(x1-x2)*sin(a)+(y1-y2)*cos(a)+y2;
如果直接按照题意的等边三角形的情况去画图推导也可以推导出来,不过这个公式比较普适。
#include <stdio.h> #include <iostream> #include <string> #include <math.h> #include <stdlib.h> #include <algorithm> using namespace std; int main() { int t; scanf("%d", &t); while(t--){ double x1,x2,x3,y1,y2,y3; scanf("%lf%lf%lf%lf", &x1, &y1, &x2, &y2); double dx=x2-x1,dy=y2-y1; x3=dx/2-dy*sqrt(3.0)/2+x1; y3=dy/2+dx*sqrt(3.0)/2+y1; printf("(%.2lf,%.2lf)\n",x3,y3); } return 0; }
题解2:
AB线段绕A点逆时针旋转60°后B点的位置
用到平面几何求解
x3=x1+L*cos(60°+angle);
y3=y1+L*sin(60°+angle);
angle=atan2(y2-y1,x2-x1);
#include <iostream> #include<cstdio> #include<cmath> using namespace std; const double PI=acos(-1.0); int main() { int t; cin>>t; double x1,y1,x2,y2,x3,y3,angle,l; while(t--) { scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2); angle=atan2(y2-y1,x2-x1); l=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); x3=x1+l*cos(angle+PI/3.0); y3=y1+l*sin(angle+PI/3.0); printf("(%.2lf,%.2lf)\n",x3,y3); } return 0; }