mark一个宝藏文章,个人认为简单易懂:
添加链接描述
附上博主代码:

#include<cstdio>
#include<cmath>
const double PI=acos(-1.0);
const double eps=1e-5;//比较精度
//求圆心角之和
double totalCornerAngles(double edges[],int n,double r){double sum = 0.0;for(int i =0;i<n;i++)sum+=asin(edges[i]/2/r)*2;return sum;
}int main(){int N;//边数scanf("%d",&N);//输入边数double edges[100];//边长数组double sum;//圆心角之和double maxAngle=0.0;//最长边对应的圆心角double maxEdge=0.0;//最长边//初始化edgesfor(int i=0;i<N;i++){scanf("%lf",&edges[i]);if(edges[i]>maxEdge)maxEdge = edges[i];//保存最大边}//以最长边为直径求圆心角之和,若为2π则直接返回sum = totalCornerAngles(edges,N,maxEdge/2);if(fabs(sum-PI*2)<eps){printf("外接圆的最大半径是最大边的一半:%.2f",maxEdge/2);return 0 ;}//半径大于最大边的一半(即斜边大于直角边)double left =maxEdge/2,right=10000000,mid;double other=0;//在误差范围内循环求解while(right -left >eps){mid = (right + left) /2;maxAngle=asin(maxEdge/2/mid)*2;//求出最大边对应的圆心角sum = totalCornerAngles(edges,N,mid);other=sum-maxAngle;//如果除去最大圆心角的其他圆心角之和小于π,说明圆心在多边形外面if(other<PI){sum=other+2*PI-maxAngle;if( sum<2*PI)left = mid;elseright = mid;}//圆心在多边形里面else{if(sum>2*PI)left = mid;elseright = mid;}}printf("外接圆的最大半径是:%.2lf",mid);return 0;}

补上自己的一点思考:
将边长从小到大排序。
先从边长考虑
首先如果圆的周长小于边长和说明r过小。(避免构造圆上边出现首尾相连的情况,不是很精确,可以辅以圆心角之和<2PI)
在已假定半径为r的圆上任选一个起点,开始以每一条边长edge[i]为半径,假定为逆时针方向选点,知道选择到第n-1个点时:
落点为n1,2 ,如果此时点1与点n-1的距离恰好等于edge[n],则表示找到解,
否则若dist(1,n-1)>edge[n],则说明构造出来的圆太小了,mid<rmax,mid向右更新。
若dist(1,n-1)<edge[n],mid向左更新。
转换成角度考虑:若前N-1个圆心角之和>PI,则说明圆心在多边形内部,考虑SUM all > 2PI 圆小了,SUM all < 2PI 圆大了。
若前n-1个圆心角之和小于PI, 则说明圆心在多边形外部,若SUM n-1 > angle max 则圆大了, SUM n-1 < angle max 则圆小了。

结果均用二分维护到eps允许范围即可。

二分法求凸多边形的外接圆最大半径相关推荐

  1. [转] 二分法求外接圆最大半径

    [转]https://blog.csdn.net/flashmsn/article/details/94642687 题目描述: 给出N个线段长度,试将它们头尾相接组合成一个凸多边形,使凸多边形的外接 ...

  2. 算法笔记4.5.2二分扩展:凸多边形的外接圆之最大半径

    算法笔记4.5.2二分扩展:凸多边形的外接圆之最大半径 二分法求外接圆最大半径 题目描述 思路: 代码如下 二分法求外接圆最大半径 题目描述 给出N个线段长度,试将它们头尾相接组合成一个凸多边形,使凸 ...

  3. Java黑皮书课后题第4章:*4.7(顶点坐标)假设一个正五边形的中心位于(0,0),其中一个点位于0点位置。编写程序,提示用户输入正五边形外接圆的半径,显示p1到p5的5个坐标,保留两位小数

    *4.7(顶点坐标)假设一个正五边形的中心位于(0,0),其中一个点位于0点位置.编写程序,提示用户输入正五边形外接圆的半径,显示p1到p5为5个坐标,保留两位小数 题目 题目概述 运行示例 破题 代 ...

  4. 一种求凸多边形内部似最大圆的算法

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.    背景 任意多边形内部一定有一个最大圆,但是如果我们将条件设定 ...

  5. 二分法求任意正弦值sin31°

    通过二分法求任意sin正弦值 ​ 首先在一个水平坐标图的第一象限内,画一1/4圆,其半径为1,圆心为(0,0),该圆与x轴y轴相交点分别为R和L,也就是所求J角的范围. ​ 通过不断二分缩小LR之间的 ...

  6. 三点外接圆的半径(面积)计算 Matlab实现

    三点外接圆的半径(面积)计算 Matlab实现 原理介绍 如下图所示,三维空间内,过任意不共线三点可画出一个空间圆,也称作三角形的外接圆.外接圆的半径为 R,三角形的三个顶点为 A.B.C,三角形的 ...

  7. 7-5 二分法求多项式单根 (20分)

    二分法求函数根的原理为:如果连续函数f(x)在区间[a,b]的两个端点取值异号,即f(a)f(b)<0,则它在这个区间内至少存在1个根r,即f( r )=0. 二分法的步骤为: 检查区间长度,如 ...

  8. python二分法求解_Python使用二分法求平方根的简单示例

    这篇文章主要为大家详细介绍了Python使用二分法求平方根的简单示例,具有一定的参考价值,可以用来参考一下. 对python这个高级语言感兴趣的小伙伴,下面一起跟随512笔记的小编两巴掌来看看吧! 使 ...

  9. PTA 基础编程题目集 7-18 二分法求多项式单根 C语言

    PTA 基础编程题目集 7-18 二分法求多项式单根 C语言 二分法求函数根的原理为:如果连续函数f(x)在区间[a,b]的两个端点取值异号,即f(a)f(b)<0,则它在这个区间内至少存在1个 ...

最新文章

  1. R语言str_extract函数从字符串中抽取匹配模式的字符串
  2. 3Mysql 的常用操作
  3. 三层路由中限制VLAN间转发,但其他转发正常事例
  4. 好文深思:1.3 万亿条数据查询,如何做到毫秒级响应?
  5. 汇编语言串指令经典题目
  6. mysql 事务 注意 优化_MySQL入门详解——事务、锁、优化
  7. React Suspense提供Redux的替代方案
  8. 小米再添猛将!原中兴手机CEO曾学忠加盟
  9. vue的matcher_一张思维导图辅助你深入了解 Vue | Vue-Router | Vuex 源码架构
  10. 电路元件伏安特性的测量与multisim仿真(附工程文件)
  11. 池化层(pooling layer) 感受野(Receptive Field) 神经网络的基本组成
  12. Wangle源码分析:编解码Handler
  13. PCB设计---焊接工艺
  14. 虚拟机怎么安装geany_75 个最常用的 Linux 应用程序(2018 年)
  15. 个人申请微信支付接口教程(免签约支付)
  16. 怎样教四岁的孩子学画画
  17. Netflix Movies and TV Shows(Netflix影视剧数据集)
  18. 三平面映射TriPlanar
  19. 楚留香打开服务器全部维护,​《楚留香》07月05日维护公告
  20. java中的垃圾回收算法

热门文章

  1. 微信8.0更新,表情会动了,快去仍个炸弹!
  2. Web前端学习书籍推荐
  3. PDF去除水印(4)-根据颜色移除对象
  4. 烧结钕铁硼的磁场取向与充磁
  5. python爬取steam250游戏详细信息和下载游戏介绍视频
  6. 【知识图谱】神经网络综述
  7. 计算机登录用户认证,一种计算机系统用户身份验证方法与流程
  8. 计算机无法验证驱动程序需要,win7系统提示Windows无法验证此设备所需驱动程序数字签名的详细处理技巧...
  9. .net ,blog
  10. 在任务管理器结束某些任务后电脑突然白屏