[转] 二分法求外接圆最大半径
[转]https://blog.csdn.net/flashmsn/article/details/94642687
题目描述:
给出N个线段长度,试将它们头尾相接组合成一个凸多边形,使凸多边形的外接圆(多边形每个顶点都在圆上)的半径最大,求该最大半径。其中N<=10^5,线段长度均不超过100,要求算法中不涉及坐标的计算。
思路:
二分算法的本质就是通过不断迭代使left 和 right 在固定条件下逐渐靠近真实值,符合一定误差,所以实际上把该题放在二分扩展里面,这个所谓的最大半径的“最大”是不在求解中的,最大应该算题干,先组成一个有外接圆的凸多边形,然后求其半径即可。不要误入歧途在“最大”上绞尽脑汁。
外接圆圆心与每个线段顶点连接后会有一个圆心角,如果圆心在凸多边形内部,则所有圆心角之和应该为2π。如果圆心在凸多边形外部,则最大的圆心角等于其他圆心角之和。
因此设定初值,求出每个线段对应的圆心角,使所有圆心角之和等于2π。不断迭代逼近真值即可。当所求圆心角大于2π时,增大r尝试,小于2π时,缩小r尝试。
当圆心在多边形外面时,当刚好外接圆在多边形上时,其他圆心角之和==最大圆心角。取圆心角之和为其他圆心角+2π-最大圆心角,同时逼近的方向与前面相反。
半径应该大于等于最大边的一半。其中等于的情况单独处理。
#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[N];//边长数组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("外接圆的最大半径是:%.2f",mid);return 0;}
[转] 二分法求外接圆最大半径相关推荐
- Java黑皮书课后题第4章:*4.7(顶点坐标)假设一个正五边形的中心位于(0,0),其中一个点位于0点位置。编写程序,提示用户输入正五边形外接圆的半径,显示p1到p5的5个坐标,保留两位小数
*4.7(顶点坐标)假设一个正五边形的中心位于(0,0),其中一个点位于0点位置.编写程序,提示用户输入正五边形外接圆的半径,显示p1到p5为5个坐标,保留两位小数 题目 题目概述 运行示例 破题 代 ...
- 二分法求任意正弦值sin31°
通过二分法求任意sin正弦值 首先在一个水平坐标图的第一象限内,画一1/4圆,其半径为1,圆心为(0,0),该圆与x轴y轴相交点分别为R和L,也就是所求J角的范围. 通过不断二分缩小LR之间的 ...
- 三点外接圆的半径(面积)计算 Matlab实现
三点外接圆的半径(面积)计算 Matlab实现 原理介绍 如下图所示,三维空间内,过任意不共线三点可画出一个空间圆,也称作三角形的外接圆.外接圆的半径为 R,三角形的三个顶点为 A.B.C,三角形的 ...
- 【第4期-智能驾驶汽车系列术语概念解析】第2节:基于三点求外接圆的曲率计算方法
目录 一.利用三次多项式曲线求曲率的缺陷 二.基于三点求外接圆的曲率计算方法 三.实例介绍 1.MATLAB代码 2. 结果展示 总结 一.利用三次多项式曲线求曲率的缺陷 在第4期第一节中,我们利用三 ...
- 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个 ...
- 用C语言解“二分法求多项式单根”题
7-18 二分法求多项式单根 二分法求函数根的原理为:如果连续函数f(x)在区间[a,b]的两个端点取值异号,即f(a)f(b)<0,则它在这个区间内至少存在1个根r,即f®=0. 二分法的步骤 ...
- 用Python解“二分法求多项式单根 ”题
7-18 二分法求多项式单根 二分法求函数根的原理为:如果连续函数f(x)在区间[a,b]的两个端点取值异号,即f(a)f(b)<0,则它在这个区间内至少存在1个根r,即f®=0. 二分法的步骤 ...
最新文章
- vb科学计算机x y,vb程序用vb实现系统的计算器功能1/x,sqrt,%,+/-, 爱问知识人
- 5G NGC — N3IWF 非 3GPP 互通功能
- golang中图片转base64_golang base64编码
- 日志信息jar包 slf4j-api、slf4j-log4j12、log4j 之间的关系和使用
- Memcache查看运行状况
- 动手动脑-Java重载
- Java SecurityManager checkDelete()方法与示例
- imeoptions android,软键盘小记Android:imeOptions
- WEB运用程序如何实现高效可维护?
- mysql数据库腾讯云添加用户,解决腾讯云cdb的基础版mysql不支持新建账号
- python c++ 批量命名文件夹内的图像
- MPAndroidChart绘制图形表
- 线下见面会,下一站定啦!
- java.lang.IllegalStateException崩溃处理——4种情形
- 一天一个产品分析之Finger_米米米米粒口红_新浪博客
- 基于DBSCAN聚类算法的超像素实时分割
- Windows 右键菜单修复
- 国际短信平台怎么找?
- 请不要“妖魔化”外包
- EasyUI给databox,timebox赋予当前时间