二分法求凸多边形的外接圆最大半径
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允许范围即可。
二分法求凸多边形的外接圆最大半径相关推荐
- [转] 二分法求外接圆最大半径
[转]https://blog.csdn.net/flashmsn/article/details/94642687 题目描述: 给出N个线段长度,试将它们头尾相接组合成一个凸多边形,使凸多边形的外接 ...
- 算法笔记4.5.2二分扩展:凸多边形的外接圆之最大半径
算法笔记4.5.2二分扩展:凸多边形的外接圆之最大半径 二分法求外接圆最大半径 题目描述 思路: 代码如下 二分法求外接圆最大半径 题目描述 给出N个线段长度,试将它们头尾相接组合成一个凸多边形,使凸 ...
- Java黑皮书课后题第4章:*4.7(顶点坐标)假设一个正五边形的中心位于(0,0),其中一个点位于0点位置。编写程序,提示用户输入正五边形外接圆的半径,显示p1到p5的5个坐标,保留两位小数
*4.7(顶点坐标)假设一个正五边形的中心位于(0,0),其中一个点位于0点位置.编写程序,提示用户输入正五边形外接圆的半径,显示p1到p5为5个坐标,保留两位小数 题目 题目概述 运行示例 破题 代 ...
- 一种求凸多边形内部似最大圆的算法
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1. 背景 任意多边形内部一定有一个最大圆,但是如果我们将条件设定 ...
- 二分法求任意正弦值sin31°
通过二分法求任意sin正弦值 首先在一个水平坐标图的第一象限内,画一1/4圆,其半径为1,圆心为(0,0),该圆与x轴y轴相交点分别为R和L,也就是所求J角的范围. 通过不断二分缩小LR之间的 ...
- 三点外接圆的半径(面积)计算 Matlab实现
三点外接圆的半径(面积)计算 Matlab实现 原理介绍 如下图所示,三维空间内,过任意不共线三点可画出一个空间圆,也称作三角形的外接圆.外接圆的半径为 R,三角形的三个顶点为 A.B.C,三角形的 ...
- 7-5 二分法求多项式单根 (20分)
二分法求函数根的原理为:如果连续函数f(x)在区间[a,b]的两个端点取值异号,即f(a)f(b)<0,则它在这个区间内至少存在1个根r,即f( r )=0. 二分法的步骤为: 检查区间长度,如 ...
- python二分法求解_Python使用二分法求平方根的简单示例
这篇文章主要为大家详细介绍了Python使用二分法求平方根的简单示例,具有一定的参考价值,可以用来参考一下. 对python这个高级语言感兴趣的小伙伴,下面一起跟随512笔记的小编两巴掌来看看吧! 使 ...
- PTA 基础编程题目集 7-18 二分法求多项式单根 C语言
PTA 基础编程题目集 7-18 二分法求多项式单根 C语言 二分法求函数根的原理为:如果连续函数f(x)在区间[a,b]的两个端点取值异号,即f(a)f(b)<0,则它在这个区间内至少存在1个 ...
最新文章
- R语言str_extract函数从字符串中抽取匹配模式的字符串
- 3Mysql 的常用操作
- 三层路由中限制VLAN间转发,但其他转发正常事例
- 好文深思:1.3 万亿条数据查询,如何做到毫秒级响应?
- 汇编语言串指令经典题目
- mysql 事务 注意 优化_MySQL入门详解——事务、锁、优化
- React Suspense提供Redux的替代方案
- 小米再添猛将!原中兴手机CEO曾学忠加盟
- vue的matcher_一张思维导图辅助你深入了解 Vue | Vue-Router | Vuex 源码架构
- 电路元件伏安特性的测量与multisim仿真(附工程文件)
- 池化层(pooling layer) 感受野(Receptive Field) 神经网络的基本组成
- Wangle源码分析:编解码Handler
- PCB设计---焊接工艺
- 虚拟机怎么安装geany_75 个最常用的 Linux 应用程序(2018 年)
- 个人申请微信支付接口教程(免签约支付)
- 怎样教四岁的孩子学画画
- Netflix Movies and TV Shows(Netflix影视剧数据集)
- 三平面映射TriPlanar
- 楚留香打开服务器全部维护,​《楚留香》07月05日维护公告
- java中的垃圾回收算法