天天看点

sdut2603&hdu1700(向量旋转) Points on Cycle

sdut2603

地址:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2603

Rescue The Princess

Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

    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.

    Now, here comes the problem. The maze is a dimensional plane. The beast is smart, and he hidden the princess snugly. He marked two coordinates of an equilateral triangle in the maze. The two marked coordinates are A(x1,y1) and B(x2,y2). The third coordinate C(x3,y3) is the maze’s exit. If the prince can find out the exit, he can save the princess. After the prince comes into the maze, he finds out the A(x1,y1) and B(x2,y2), but he doesn’t know where the C(x3,y3) is. The prince need your help. Can you calculate the C(x3,y3) and tell him?

输入

    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).

    Please notice that A(x1,y1) and B(x2,y2) and C(x3,y3) are in an anticlockwise direction from the equilateral triangle. And coordinates A(x1,y1) and B(x2,y2) are given by anticlockwise.

输出

    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,求出一个可以与这两点组成等边三角形的点C,要求A,B,C顺序为逆时针。 

  利用向量旋转的公式,向量旋转:   B为原点,A为坐标为(x,y)的点,A`(x1,y1)为A逆时针旋转θ度的点。过A`做AB的垂线交AB于C点,过A`做   垂直于x轴的线与过c点做平行于x轴的线交于D点,过C点做垂直于x轴的线交x轴于E点。   因为∠A`CB与∠DCE都是直角,所以∠A`CD=∠BCE,所以⊿CA' D ∽⊿CBE。   则x1=CE+A`C/BC*BE,y1=BE-A`C/BC*CE。

#include<cmath>
#include<cstdio>
#include<iostream>
using namespace std;

int main()
{
	int t;
	double x1,x2,x3,y1,y2,y3;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
		x3=(x1+x2)/2-sqrt(3.0)*((y2+y1)/2-y1);    //这里sqrt(3)就是A`C/BC
		y3=(y1+y2)/2+sqrt(3.0)*((x2+x1)/2-x1);
		printf("(%.2lf,%.2lf)\n",x3,y3);
	}
}
           

hdu1700 地址:http://acm.hdu.edu.cn/showproblem.php?pid=1700

Points on Cycle

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 1290    Accepted Submission(s): 451

Problem Description There is a cycle with its center on the origin.

Now give you a point on the cycle, you are to find out the other two points on it, to maximize the sum of the distance between each other

you may assume that the radius of the cycle will not exceed 1000.  

Input There are T test cases, in each case there are 2 decimal number representing the coordinate of the given point.  

Output For each testcase you are supposed to output the coordinates of both of the unknow points by 3 decimal places of precision 

Alway output the lower one first(with a smaller Y-coordinate value), if they have the same Y value output the one with a smaller X. 

NOTE when output, if the absolute difference between the coordinate values X1 and X2 is smaller than 0.0005, we assume they are equal.  

Sample Input

2
1.500 2.000
563.585 1.251
         

Sample Output

0.982 -2.299 -2.482 0.299
-280.709 -488.704 -282.876 487.453
         

题意:给一个点,该点在一个圆心为原点的圆的边上,在圆内找两个点使这三个点距离和最大。 思路:要是三个点距离和最大,那么这三个点在圆内一定组成等边三角形。

#include<cmath>
#include<cstdio>
#include<iostream>
using namespace std;

int main()
{
	int t;
	double x1,x2,x3,y1,y2,y3;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%lf%lf",&x1,&y1);
		x2=x1/2-sqrt(3.0)*y1/2;  //因为三个点与圆心连线之间的角度为120°(等边三角形)
		y2=y1/2+sqrt(3.0)*x1/2;  //所以我们可以看为输入的这个点与圆心连线逆时针旋转两个60°
		x1=x2/2-sqrt(3.0)*y2/2;
		y1=y2/2+sqrt(3.0)*x2/2;
		x2=x1;y2=y1;
		x3=x1/2-sqrt(3.0)*y1/2;
		y3=y1/2+sqrt(3.0)*x1/2;
		x1=x3/2-sqrt(3.0)*y3/2;
		y1=y3/2+sqrt(3.0)*x3/2;
		x3=x1;y3=y1;
		if(y2-y3||(fabs(y3-y2)<0.0005&&(x2-x3)>0.0005))  //关于0.0005的判定在题目中有交代
		{
			x1=x3;x3=x2;x2=x1;
			y1=y3;y3=y2;y2=y1;
		}
		printf("%.3lf %.3lf %.3lf %.3lf\n",x2,y2,x3,y3);
	}
}