Title Link: http://acm.hdu.edu.cn/showproblem.php?pid=4793
Problem-Solving report: There is a circular medal on a plane, the radius is Rm, the center of the Circle is (0,0), and there is a circle range center is also (0,0), the radius is r,r > Rm, now throws a coin to the plane, the initial center position of the coin is (x, y), the radius is R, Give the speed of the coin vector, the coin will be reflected when the medal, note that the reflection is the original way back, not according to the common sense of the line in accordance with the route of the center, said always thought it was so, WA for a long time, then, let you ask the coin and the circle of the intersection of the total time is how much.
First, pass the origin, make a line l parallel to the velocity vector, and then find the distance d (x, y) to the line L, and then pass a series of Pythagorean theorem to find out the way. It is worth noting that there are several cases to be awarded.
First, the direction of the velocity with (x, Y) and the origin of the line of the vector angle is not the range of [0,90], and then after satisfying this condition also to judge, when D > R+r, the coin will be directly past without a circular range, so the time is directly 0, when Rm+r < D < R+r, Coins go through a circular range, but do not collide with medal, and when D < rm+r, coins collide with medal.
1#include <cstdio>2#include <cstring>3#include <iostream>4#include <algorithm>5#include <cmath>6 using namespacestd;7 Const DoubleEPS = 1e-8, PI = ACOs (-1.0);8 9 struct PointTen { One Doublex, y; APointDoublex =0,Doubley =0): X (x), Y (y) {} - DoubleLen () - { the returnsqrt (x*x+y*y+EPS); - } - }; -InlineDoubledis (point p1,point p2) + { - returnsqrt ((p1.x-p2.x) * (p1.x-p2.x) + (P1.Y-P2.Y) * (P1.Y-P2.Y) +EPS); + } A DoubleGet_dis (Point v,point p) at { - if(Fabs (V.X*P.Y-P.X*V.Y) < EPS)return 0; - DoubleSi = (v.x*p.y-p.x*v.y)/dis (Point (0,0), V)/P.len (); - returnP.len () *fabs (SI); - } - intjudge (Point P,point v) in { - Point temp; totemp.x =-1*p.x; +TEMP.Y =-1*p.y; - return(Temp.x*v.x+temp.y*v.y <0) || (Fabs (TEMP.X*V.X+TEMP.Y*V.Y) <EPS); the } * intMain () $ {Panax Notoginseng //freopen ("In.txt", "R", stdin); - DoubleRm,r,r; the Point p,v; + while(SCANF ("%LF%LF%LF%LF%LF%LF%LF", &rm,&r,&r,&p.x,&p.y,&v.x,&v.y)! =EOF) A { the if(judge (p,v)) + { -printf"0.0000\n"); $ Continue; $ } - DoubleV =V.len (); - DoubleD = Get_dis (v,p);//get the distance from the movement of the coin to the Origin . the //printf ("%.3lf\n", D); - DoubleAns =0;Wuyi if(D < Rm+r)//would collide, pits, in which case the reflection of the subject was contrary to common sense, and has been WA here the { - DoubleL = sqrt ((r+r) * (r+r)-d*d+eps)-sqrt ((rm+r) * (rm+r)-d*d+eps);//the distance from the beginning of the circle to the collision WuAns + = (L/V); - //ans + = (r-rm)/V; About } $ Else if(d > Rm+r && D < r +R) - { - Doublet = sqrt ((r+r) * (r+r)-d*d+eps)/V; - } A Else //does not enter a circular range + { theprintf"0.00000\n"); - Continue; $ } theprintf"%lf\n",2*ans+EPS); the } the return 0; the}
View Code
HDU 4793 Collision (2013 Changsha Regional Race game c)