求任意多边形的最大内接圆算法,c++编程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求任意多边形的最大内接圆算法,c++编程相关的知识,希望对你有一定的参考价值。

任意多边形,已知点数和点坐标,求多边形最大内接圆的圆心坐标和半径,编程语言是c++

将所有边看做半平面。(多边形内部是可行域)
二分半径R。
将所有半平面向里平移R的距离。
然后用半平面交判断有无解。
参考技术A 给425524763大神跪了!

Area in Triangle /// oj10229

题目大意:

给出三角形的三个顶点 再给一条绳(绳长不超过三角形周长)

求绳子在三角形中能围出的最大面积

 

题解链接 http://blog.sina.com.cn/s/blog_6a46cc3f0100tujn.html

多边形和圆 周长相同时 圆的面积更大 

而当绳长超过三角形的内接圆时 

沿着边放 对应三角的三个位置围成三段圆弧 

使得三段圆弧能围成一个圆时 面积就能更大

而此时这个小圆也会与小三角形内接 与大圆和大三角形相似

计算比例 k=(小三角周长-小内接圆周长)/(大三角周长-大内接圆周长)

那么此时 绳围面积=S大三角-(S小三角-S小内接圆)

按比例可得到小内接圆半径 可得 S小内接圆

又S大三角=底*高 -> 缩小k比例 -> S小三角=(k*底)*(k*高)=k*k*S大三角

 

技术分享图片
#include<cstdio>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
const double PI=acos(-1.0);
int main()
{
    double a,b,c,d;
    int tcase=0;
    while(~scanf("%lf%lf%lf%lf",&a,&b,&c,&d)) {
        if(a+b+c+d==0) break;
        double L=a+b+c, l=L*0.5;
        double area=sqrt(l*(l-a)*(l-b)*(l-c));
        double R=area*2.0/L, ans;
        if(a+b+c<=d) ans=area;
        else if(2.0*PI*R>=d) ans=d*d/(4.0*PI);
        else {
            double k=(L-d)/(L-2.0*PI*R);
            R*=k; // 得到小内接圆半径
            ans=area-k*k*area+PI*R*R;
        }
        printf("Case %d: %.2f
",++tcase,ans);
    }

    return 0;
}
View Code

 

以上是关于求任意多边形的最大内接圆算法,c++编程的主要内容,如果未能解决你的问题,请参考以下文章

HDU - 3644:A Chocolate Manufacturer's Problem(模拟退火, 求多边形内最大圆半径)

任意多边形中的最大内接矩形

二维空间计算几何

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

如何用opencv实现任意联通区域的最大内接圆

UVA - 11277 Cyclic Polygons(二分)