在好例子网,分享、交流、成长!
您当前所在位置:首页C/C++ 开发实例C/C++语言基础 → 多点寻找最小外接圆

多点寻找最小外接圆

C/C++语言基础

下载此实例
  • 开发语言:C/C++
  • 实例大小:8.46KB
  • 下载次数:11
  • 浏览次数:228
  • 发布时间:2016-07-11
  • 实例类别:C/C++语言基础
  • 发 布 人:小皮
  • 文件格式:.c
  • 所需积分:2
 相关标签: 外接圆 c

实例介绍

#include <ansi_c.h>
 
  
#define LL long long  
#define PI (acos(-1.0))  
#define EPS (1e-10)  
  

  
typedef struct 
{  
    double x,y,a;  
}P;
P p[1100],cp[1100]; 
  
struct L  
{  
    P p1,p2;  
} line[50];  
  
double X_Mul(P a1,P a2,P b1,P b2)  
{  
    P v1 = {a2.x-a1.x,a2.y-a1.y},v2 = {b2.x-b1.x,b2.y-b1.y};  
    return v1.x*v2.y - v1.y*v2.x;  
}  

//¼ÆËãÁ½µã¼ä¾à
double Cal_Point_Dis(P p1,P p2)  
{  
    return sqrt((p1.x-p2.x)*(p1.x-p2.x) (p1.y-p2.y)*(p1.y-p2.y));  
}  

//¼ÆËãÁ½µã¼ä¾àµÄƽ·½
double Cal_Point_Dis_Pow_2(P p1,P p2)  
{  
    return (p1.x-p2.x)*(p1.x-p2.x) (p1.y-p2.y)*(p1.y-p2.y);  
}  
  
P Cal_Segment_Cross_Point(P a1,P a2,P b1,P b2)  
{  
    double t = X_Mul(b1,b2,b1,a1) / X_Mul(a1,a2,b1,b2);  
    P cp = {a1.x (a2.x-a1.x)*t, a1.y (a2.y-a1.y)*t};  
    return cp;  
}  
  
//¹æ·¶Ïཻ  
int Is_Seg_Cross_Without_Point(P a1,P a2,P b1,P b2)  
{  
    double xm1 = X_Mul(a1,a2,a1,b1);  
    double xm2 = X_Mul(a1,a2,a1,b2);  
    double xm3 = X_Mul(b1,b2,b1,a1);  
    double xm4 = X_Mul(b1,b2,b1,a2);  
  
    return (xm1*xm2 < (-EPS) && xm3*xm4 < (-EPS));  
}  
  
//ÏòÁ¿abÓëXÖáÕý·½ÏòµÄ¼Ð½Ç  
double Cal_Angle(P t,P p)  
{  
    return ((t.x-p.x)*(t.x-p.x) 1 - (t.x-p.x-1)*(t.x-p.x-1))/(2*sqrt((t.x-p.x)*(t.x-p.x) (t.y-p.y)*(t.y-p.y)));  
}  
  
//¼ÆËã ¡Ïb2.a.b1 µÄ´óС  
double Cal_Angle_Three_Point(P a,P b1,P b2)  
{  
    double l1 = Cal_Point_Dis_Pow_2(b1,a);  
    double l2 = Cal_Point_Dis_Pow_2(b2,a);  
    double l3 = Cal_Point_Dis_Pow_2(b1,b2);  
  
    return acos( (l1 l2-l3)/(2*sqrt(l1*l2)) );  
}  
  
int cmp_angle(P p1,P p2)  
{  
    return (p1.a < p2.a || (fabs(p1.a-p2.a) < EPS && p1.y < p2.y) ||(fabs(p1.a-p2.a) < EPS && fabs(p1.y-p2.y) < EPS && p1.x < p2.x)   );  
}  
  
//pΪµã¼¯  Ó¦¸Ã±£Ö¤ÖÁÉÙÓÐÈýµã²»¹²Ïß  
//n Ϊµã¼¯´óС  
//·µ»ØֵΪ͹°üÉϵ㼯ÉϵĴóС  
//͹°üÉϵĵã´æ´¢ÔÚcpÖÐ  
int Creat_Convex_Hull(P *p,int n)  
{  
    int i,top;  
    P re; //re Ϊ½¨Á¢¼«½ÇÅÅÐòʱµÄ²Î¿¼µã  ÏÂ×óµã  
  
    for(re = p[0],i = 1; i < n; i)  
    {  
        if(re.y > p[i].y || (fabs(re.y-p[i].y) < EPS && re.x > p[i].x))  
            re = p[i];  
    }  
  
    for(i = 0; i < n; i)  
    {  
        if(p[i].x == re.x && p[i].y == re.y)  
        {  
            p[i].a = -2;  
        }  
        else p[i].a = Cal_Angle(re,p[i]);  
    }  
  
    //sort(p,p n,cmp_angle);  
//Sort(input_array, total_num, ANALYSIS_SORT_ASCENDING, output_array)
  
    top =0 ;  
    cp[top ] = p[0];  
    cp[top ] = p[1];  
  
    for(i = 2 ; i < n;)  
    {  
        if(top < 2 || X_Mul(cp[top-2],cp[top-1],cp[top-2],p[i]) > EPS)  
        {  
            cp[top ] = p[i ];  
        }  
                    else  
        {  
            --top;  
        }  
    }  
  
    return top;  
}  
  
int Is_Seg_Parallel(P a1,P a2,P b1,P b2)  
{  
    double xm1 = X_Mul(a1,a2,a1,b1);  
    double xm2 = X_Mul(a1,a2,a1,b2);  
  
    return (fabs(xm1) < EPS && fabs(xm2) < EPS);  
}  
  
int Point_In_Seg(P m,P a1,P a2)  
{  
    double l1 = Cal_Point_Dis(m,a1);  
    double l2 = Cal_Point_Dis(m,a2);  
    double l3 = Cal_Point_Dis(a1,a2);  
  
    return (fabs(l1 l2-l3) < EPS);  
}  
  
//¼ÆËãÈý½ÇÐÎÍâ½ÓÔ²Ô²ÐÄ  
P Cal_Triangle_Circumcircle_Center(P a, P b, P c)  

    P mp1 = {(b.x a.x)/2,(b.y a.y)/2}, mp2 = {(b.x c.x)/2,(b.y c.y)/2};  
    P v1 = {a.y-b.y, b.x-a.x}, v2 = {c.y-b.y, b.x-c.x};  
  
    P p1 = {mp1.x v1.x, mp1.y v1.y}, p2 = {mp2.x v2.x,mp2.y v2.y};  
  
    return Cal_Segment_Cross_Point(mp1,p1,mp2,p2);  
}  
  
int Is_Acute_Triangle(P p1,P p2,P p3)  
{  
    //Èýµã¹²Ïß  
    if(fabs(X_Mul(p1,p2,p1,p3)) < EPS)  
    {  
        return 0;  
    }  
  
    double a = Cal_Angle_Three_Point(p1,p2,p3);  
    if(a > PI || fabs(a-PI) < EPS)  
    {  
        return 0;  
    }  
    a = Cal_Angle_Three_Point(p2,p1,p3);  
    if(a > PI || fabs(a-PI) < EPS)  
    {  
        return 0;  
    }  
    a = Cal_Angle_Three_Point(p3,p1,p2);  
    if(a > PI || fabs(a-PI) < EPS)  
    {  
        return 0;  
    }  
    return 1;  
}  

//ÅжϵãÊÇ·ñÔÚÔ²ÄÚ
int Is_In_Circle(P center,double rad,P p)  
{  
    double dis = Cal_Point_Dis(center,p);  
    return (dis < rad || fabs(dis-rad) < EPS);  
}  

//¼ÆËãÖеã
P Cal_Seg_Mid_Point(P p2, P p1)  
{  
    P mp = {(p2.x p1.x) / 2, (p1.y p2.y) / 2};  
    return mp;  
}  

//¼ÆËã×îСÍâ½ÓÔ²
void Cal_Min_Circle(P *p, int n)  
{  
    if(n == 0)  
        return ; 
//Ö»ÓÐÒ»¸öµã
    if(n == 1)  
    { 
        printf("%.2lf %.2lf %.2lf\n", p[0].x, p[0].y, 0.00);  
        return ;  
    }
//Ö»ÓÐÁ½¸öµã
    if(n == 2)  
    {  
        printf("%.2lf %.2lf %.2lf\n",(p[1].x p[0].x) / 2,(p[0].y p[1].y) / 2, Cal_Point_Dis(p[0], p[1]) / 2);  
        return ;  
    }  
  
//³¬¹ýÁ¬¸öµã,ÏȽ«Á½µãÖÐÐÄÉèÖÃΪԲÐÄ
    P center = Cal_Seg_Mid_Point(p[0], p[1]);
P tc1;  
  
//¼ÆËã°ë¾¶
    double rad = Cal_Point_Dis(p[0],center);
double dis = -1, temp = 0.0, tra1;  
    int a = 0, b = 1, c = 2;
int i = 0, site = 0, d = 0, s1 = 0, s2 = 0, tp = 0;  
  
//¼ÆËã×î´ó°ë¾¶¼°±êʶ
    for(dis = -1, site = 0, i = 0; i < n; i)  
    {  
        temp = Cal_Point_Dis(center, p[i]);  
        if(temp > dis)  
        {  
            dis = temp;  
            site = i;  
        }  
    }  
  
//Èôijµã²»ÔÚÔ²ÉÏ
    while( Is_In_Circle(center, rad, p[site]) == 0 )  
    {  
        d = site;  
       
//¼ÆËãµã¾à
        double l1 = Cal_Point_Dis(p[a], p[d]);  
        double l2 = Cal_Point_Dis(p[b], p[d]);  
        double l3 = Cal_Point_Dis(p[c], p[d]);  
  
//aµã¾àÀë×îÔ¶
        if((l1 > l2 || fabs(l1 - l2) < EPS) && (l1 > l3 || fabs(l1 - l3) < EPS))  
        {  
            s1 = a, s2 = d, tp = b;  
        } 
//bµã¾àÀë×îÔ¶
        else if((l2 > l1 || fabs(l1 - l2) < EPS) && (l2 > l3 || fabs(l2 - l3) < EPS))  
        {  
            s1 = b, s2 = d, tp = c;  
        }  
        else  
        {  
            s1 = c, s2 = d, tp = a;  
        }  
  
//¼ÆËãÖеã
        center = Cal_Seg_Mid_Point(p[s1], p[s2]);  
//¼ÆËã¼ä¾à
        rad = Cal_Point_Dis(center, p[s1]);  
  
//ÆäÓàÈý¸öµãÈÎÒ»¸öµã²»ÔÚÔ²ÉÏ»òÕßÔ²ÄÚ
        if( Is_In_Circle(center,rad,p[a]) == 0 || Is_In_Circle(center,rad,p[b]) == 0 || Is_In_Circle(center,rad,p[c]) == 0 )  
        {  
//¼ÆËãÈý½ÇÐÎÍâ½çÔ²ÐÎ
            center = Cal_Triangle_Circumcircle_Center(p[a],p[c],p[d]);  
            rad = Cal_Point_Dis(p[d],center);  
            s1 = a,s2 = c,tp = d;  
  
//ÅжϵãÊÇ·ñÔÚÔ²ÄÚ  ²»ÔÚÔ²ÄÚ
            if(Is_In_Circle(center,rad,p[b]) == 0)  
            {  
                center = Cal_Triangle_Circumcircle_Center(p[a],p[b],p[d]);  
                rad = Cal_Point_Dis(p[d],center);  
                s1 = a,s2 = b,tp = d;  
            }  
            else  
            {  
                tc1 = Cal_Triangle_Circumcircle_Center(p[a],p[b],p[d]);  
                tra1 = Cal_Point_Dis(p[d],tc1);  
  
                if(tra1 < rad && Is_In_Circle(tc1,tra1,p[c]))  
                {  
                    rad = tra1,center = tc1;  
                    s1 = a,s2 = b,tp = d;  
                }  
            }  
  
            if(Is_In_Circle(center,rad,p[c]) == 0)  
            {  
                center = Cal_Triangle_Circumcircle_Center(p[c],p[b],p[d]);  
                rad = Cal_Point_Dis(center,p[d]);  
                s1 = c,s2 = b,tp = d;  
            }  
            else  
            {  
                tc1 = Cal_Triangle_Circumcircle_Center(p[c],p[b],p[d]);  
                tra1 = Cal_Point_Dis(p[d],tc1);  
                if(tra1 < rad && Is_In_Circle(tc1,tra1,p[a]))  
                {  
                    rad = tra1,center = tc1;  
                    s1 = b,s2 = c,tp = d;  
                }  
            }  
        }  
  
        a = s1, b = s2, c = tp;  
  
//¼ÆËã×î´ó°ë¾¶¼°±êʶ 
        for(dis = -1, site = 0, i = 0; i < n; i)  
        {  
            temp = Cal_Point_Dis(center, p[i]);  
            if(temp > dis)  
            {  
                dis = temp;  
                site = i;  
            }  
        }  
    } 

    printf("%.2f %.2f %.2f\n",center.x, center.y, rad);  
}  

//Ö÷º¯Êý
int main()  
{  
    int i = 0, n = 0;  
    while(scanf("%d", &n) && n)  
    {  
//ÔØÈëÊý¾Ý
        for(i = 0; i < n; i)  
        {  
            scanf("%lf %lf",&p[i].x,&p[i].y);  
        }

//¼ÆËã×îСÍâ½ÓÔ²
        Cal_Min_Circle(p,n);  
    }  
}


标签: 外接圆 c

实例下载地址

多点寻找最小外接圆

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警