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;
}

移动后判半平面交就行了!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值