多边形的最大内切圆的实现

BOOL CPline::FindIncircle(double a)//这是一个多段线类的成员函数,把其中的点设成参数就可以满足别的需求了

{

int Max=500;//设置最大循环次数

int i1,i2; //记录最小和次小的位置

double sumx,sumy;

sumx=sumy=0; //其中,A点是距离最近的点,B点是次近的点

PointStruct A, B,C,O,O1,tempPt; //A,B,分别为最小,和次小距离的两个垂足,o为设定初始计算圆心

float distf,dists,dist;

float distfn,distsn;// a 为步长因子

m_PointList[m_Number]=m_PointList[0]; //

O.x=(m_PointList[0].x+m_PointList[2].x)/2; //这里取了第一点和第三点连线的中点 //

O.y=(m_PointList[0].y+m_PointList[2].y)/2;

for(int i=0;i

sumx+=m_PointList[i].x;

sumy+=m_PointList[i].y;

}

O.x=sumx/m_Number;

O.y=sumy/m_Number;

do {

Max--;

distf=dists=10.0E10; //循环获取圆心离每个边的距离,获得最小和次小距离,并且保存各个垂足

for(int i=0; i

dist=CalRealDist(O.x,O.y,m_PointList[i].x,m_PointList[i].y,m_PointList[i+1].x,m_PointList[i+1].y,tempPt);

if(dist

dists=distf; distf=dist; i2=i1; //保存最小

i1=i;

}

if(distdistf) {

dists=dist;

i2=i;

}

}

CalRealDist(O.x,O.y,m_PointList[i1].x,m_PointList[i1].y, m_PointList[i1+1].x,m_PointList[i1+1].y, A);

CalRealDist(O.x,O.y,m_PointList[i2].x,m_PointList[i2].y, m_PointList[i2+1].x,m_PointList[i2+1].y, B); //其中C点是参考点

C.x=A.x+distf/(distf+dists)*(B.x-A.x);

C.y=A.y+distf/(distf+dists)*(B.y-A.y);

do { //计算新的内切园圆心坐标

distfn=distsn=10.0E10;

if(C.x==O.x&&C.y==O.y) //判断圆心是否和AB共线

{

C.x=A.x;

C.y=A.y;

}

O1.x=O.x+a*(O.x-C.x)/sqrt((O.x-C.x)*(O.x-C.x)+(O.y-C.y)*(O.y-C.y));

O1.y=O.y+a*(O.y-C.y)/sqrt((O.x-C.x)*(O.x-C.x)+(O.y-C.y)*(O.y-C.y)); //重新计算内切圆的最小半径 for (i=0; i

dist=CalRealDist(O1.x,O1.y,m_PointList[i].x,m_PointList[i].y, m_PointList[i+1].x, m_PointList[i+1].y, tempPt);

if(dist

distfn=dist; //保存最小

}

}

if(distfn

} while(distfn0.00001); //这里判断说明了

//将新计算的O1点赋值给O点

O.x=O1.x; O.y=O1.y;

} while(a>0.00001&&Max>0);

m_center.x=O1.x;

m_center.y=O1.y;

m_radius=distfn;

retur

n TRUE;

}


相关文章

  • 对双圆四边形的性质的探讨
  • 第4卷第4期遵义师范学院学报Vol. 4, No. 4 2002年12月Journal of Zunyi Normal College Dec. 2002 对双圆四边形的性质的探讨 张少华 (遵义师范学院数学系, 贵州遵义 563002) ...

  • 人教版九年级上册数学课本知识点归纳1
  • 人教版九年级上册数学课本知识点归纳 第二十一章 二次根式 一.二次根式 1.二次根式:把形如a (a ≥0) 的式子叫做二次根式, " 示二次根号. 2.最简二次根式:若二次根式满足:①被开方数不含分母:②被开方数中不含能开得尽方 ...

  • 初中数学顺口溜(大全)
  • 初中数学顺口溜(大全) 有理数的加法运算:同号相加一边倒:异号相加"大"减"小",符号跟着大的跑:绝对值相等"零"正好.[注]"大"减"小" ...

  • 初中数学定义公式大全
  • 初中数学定义.定理.公理.公式汇编 寇本义老师 直线.线段.射线 1. 过两点有且只有一条直线. (简:两点决定一条直线) 2. 两点之间线段最短 3. 同角或等角的补角相等. 同角或等角的余角相等. 4. 过一点有且只有一条直线和已知直线 ...

  • 输电管塔结构强度分析软件
  • 第23卷 第8期 电 力 建 设 ElectricPowerConstruction Vol.23 No.8Aug,2002 ・34・ 2002年8月 输电管塔结构强度分析软件 李清华,鲍务均,龙小乐 (武汉大学,武汉市,430072) [ ...

  • 初三奥数培训试题
  • 2014届初三(上)奥数A 班寒假培训试题(6) 班级 姓名 座号 成绩 一.选择题(35分) 1.若a ≠b ). A B . C D .0 2.△ABC 外接圆的半径为R ,AC 分别关于AB .BC 对称所得的两条直线相交于点K ,△ ...

  • 教学设计三角形内切圆
  • ★ 2014年唐山市第五十二中学 人教版全日制初中<数学>九年级上 高秋燕 2014年11月 三角形的内心 一.教材分析 1.教材背景 三角形内切圆是在学习了直线与圆的位置关系,掌握了切线长定理,并理解了三角形外心之后,学习的又 ...

  • 初三数学中考模拟试题2
  • 初三数学中考模拟试题(二) 一.选择题:(每题4分,共40分) 1.下列运算,正确的是( ) A .a ·a = a B. 2 4 8 11 =- -a -b a -b C .a - 1 ) =1 =-a D.(tan30 -3a 2.北京 ...

  • 人教版九年级上册数学公式汇总
  • 第二十一章 二次根式 1.一个正数有两个平方根:在实数范围内,负数没有平方根. 2.一般地,我们把形如 (a ≥0)的式子叫做二次根式," "称为二次根号. 3a (a ≥0)是一个非负数. 当a 为带分数是,要把a 改 ...

© 2024 范文参考网 | 联系我们 webmaster# 12000.net.cn