http://acm.sdibt.edu.cn/JudgeOnline/problem.php?id=3230
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)
题意:给出A与B的坐标,要求从A到B逆时针转动位置找到一个C点,使他们组成一个等边三角形
思路:
1、求已知线段的斜角:tgα=(y1-y2)/(x1-x2)
2、求已知线段的长度:L=√((y1-y2)^2+(x1-x2)^2)
3、求第三点的坐标:
x3=x2+L*cos(α+60);y3=y2+L*sin(α+60)
而且我们可以发现,如果全部以A点为基底的话,那么求出的C点一定全部都是在A->B的逆时针上,还记得训练时本来已经推出这个公式了,但是当时脑筋很死,没有想到这一点,一直在考虑多种情况,结果反而落于下乘了,在这里我要好好反省
#include <stdio.h> #include <math.h> const double pi = acos(-1.0); int main() { int t; double x1,x2,x3,y1,y2,y3,l,at; scanf("%d",&t); while(t--) { scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2); at = atan2(y2-y1,x2-x1); printf("%lf\n",(y2-y1)/(x2-x1)); printf("%lf\n",at); l = sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); x3 = x1+l*cos(at+pi/3.0); y3 = y1+l*sin(at+pi/3.0); printf("(%.2lf,%.2lf)\n",x3,y3); } return 0; }