本文主要是介绍poj3525 半平面交最大内切圆半径,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题意:
给定一个岛的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;
}
移动后判半平面交就行了!
这篇关于poj3525 半平面交最大内切圆半径的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!