[转]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;}

[转] 二分法求外接圆最大半径相关推荐

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

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

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

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

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

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

  4. 【第4期-智能驾驶汽车系列术语概念解析】第2节:基于三点求外接圆的曲率计算方法

    目录 一.利用三次多项式曲线求曲率的缺陷 二.基于三点求外接圆的曲率计算方法 三.实例介绍 1.MATLAB代码 2. 结果展示 总结 一.利用三次多项式曲线求曲率的缺陷 在第4期第一节中,我们利用三 ...

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

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

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

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

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

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

  8. 用C语言解“二分法求多项式单根”题

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

  9. 用Python解“二分法求多项式单根 ”题

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

最新文章

  1. vb科学计算机x y,vb程序用vb实现系统的计算器功能1/x,sqrt,%,+/-, 爱问知识人
  2. 5G NGC — N3IWF 非 3GPP 互通功能
  3. golang中图片转base64_golang base64编码
  4. 日志信息jar包 slf4j-api、slf4j-log4j12、log4j 之间的关系和使用
  5. Memcache查看运行状况
  6. 动手动脑-Java重载
  7. Java SecurityManager checkDelete()方法与示例
  8. imeoptions android,软键盘小记Android:imeOptions
  9. WEB运用程序如何实现高效可维护?
  10. mysql数据库腾讯云添加用户,解决腾讯云cdb的基础版mysql不支持新建账号
  11. python c++ 批量命名文件夹内的图像
  12. MPAndroidChart绘制图形表
  13. 线下见面会,下一站定啦!
  14. java.lang.IllegalStateException崩溃处理——4种情形
  15. 一天一个产品分析之Finger_米米米米粒口红_新浪博客
  16. 基于DBSCAN聚类算法的超像素实时分割
  17. Windows 右键菜单修复
  18. 国际短信平台怎么找?
  19. 请不要“妖魔化”外包
  20. EasyUI给databox,timebox赋予当前时间

热门文章

  1. 软件开发工程师面试题目
  2. 流程引擎camunda
  3. CSS实现文本超过部分,超出两行,超出部分省略号显示
  4. 大学生学完python靠几个接单网站兼职,实现经济独立,1年可开设自己的工作室!
  5. 服务器实时状态检测源码,开源运维监控框架Netdata——实时监控系统性能
  6. 开源大模型成功的背后离不开中国研究人员的贡献
  7. 加入创业公司大干一场?谈股权和薪水前你要了解这些
  8. Flink实时计算指标对数方案
  9. 如何打造高性能大数据分析平台
  10. 计算机辅助制图教学设计,高中信息技术 计算机辅助制图教案 苏教版