题意:在一个左下角(0,0)右上角(10,10)的正方形里,有个东西藏在里面,一开始主角站在(0,0)点,然后他可以选择移动到(x,y)点,这时如果新点比旧点更接近目标,则得到“Hotter”,更远则”Colder”,距离一样则是”Same”,然后这个(x,y)作为旧点继续重复上述移动,每次移动后输出目标可能存在的区域的面积,如果不存在这样的面积输出0.00。
比较简单的半平面交问题,通过给出的信息不断切割目标范围。
假设原先的点是p0,到达的点是p1,那么可以先求出线段p0p1的中垂线,那么在这条线上的点就是到p0和p1距离一样。反过来如果说得到的是”Same”,说明目标范围就是一条线,线的面积是0。。。后面不用算了,全部输出0即可。
求出中垂线的话,这个中垂线可以用点和向量表示,那么我们就可以通过远近的情况确定出目标式在这个向量的左边还是右边,如果是右边还要转个方向,因为半平面交是保留左边的。利用这条线切割原先的区域就可以得到新的区域,然后就是简单算面积了。
PS:各种SB错误本地就调了1个钟,幸好交上去1Y。
#include
#include
#include
#include
using namespace std; #define pb push_back const double eps = 1e-8; int dcmp(double x){ if(fabs(x)
0; } typedef vector
Polygon; Polygon init(){ Polygon p; p.pb(Point(0.0, 0.0)); p.pb(Point(10.0, 0.0)); p.pb(Point(10.0, 10.0)); p.pb(Point(0.0, 10.0)); return p; } Point GetIntersection(Point A, Vector v, Point B, Vector w){ Vector u = A-B; double t = det(w, u)/det(v, w); return A+v*t; } bool OnSegment(Point P, Point A, Point B){ return dcmp(det(A-P, B-P))==0 && dcmp(dot(A-P, B-P))<0; } double Area(Polygon &p){ double S = 0.0; if(p.size()<=1) return 0.0; for(int i=1; i
= 0) newpoly.pb(C); if(dcmp(det(L.v, C-D)) != 0){ Point ip = GetIntersection(L.P, L.v, C, D-C); if(OnSegment(ip, C, D)){ newpoly.pb(ip); } } } /* puts("new"); for(int i=0; i
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/204413.html原文链接:https://javaforall.net
