题意:
给定一个岛的n个点,问这n个点组成的图形中最大的内切圆的半径。
题解:
想到的是给定了n个点,首先应该是考虑什么时候有内切圆,有内切圆说明这个多边形内部有核。
没核的时候呢?
我们在刚好没核的情况下把所有的边都向外平移r,那么我们不就能找到一个半径为r的内切圆了嘛。
换个角度,从外往内移动,这个时候我们就能求出来最大的半径长度了。
我们假设p1p2这条线段平移到BC上去,那么我们就需要知道Fp1和BF的长度。
计算方法是勾股定理。
cosθ=E*p2/p1p2.
并且cosθ=Fp1/Bp1.
其中Bp1是我们要移动的长度,是一个已知量,p1和p1坐标也知道,我们能够很容易求出来p1和p2的长度以及Ep2的长度。
于是们就求出来Fp1和FB的长度了。注意是用P1去减P2,保证结果是负数(代表左移)...
注意不要计算错误了~~~~~~~~~~~
计算方法应该是横坐标减小,纵坐标增大的!
void change(Point p1,Point p2,Point &a,Point &b,double mid){
double len=p1.distance(p2);
double x=(p1.y-p2.y)*mid/len;
double y=(p2.x-p1.x)*mid/len;
a.x=p1.x+x;
a.y=p1.y+y;
b.x=p2.x+x;
b.y=p2.y+y;
}
移动后判半平面交就行了!