三点法创建圆

包含头文件:#include <math.h>

求幂函数:long lpow = pow(x,y);//其作用是计算x的y次方。x、y及函数值都是double型

绝对值: double dfabs = fabs(x ); //求 double 型x的绝对值 , 计算|x|, 当x不为负时返回 x,否则返回 -x

开平方: float sqrt (float),double sqrt (double),double long sqrt(double long) // 一个非负实数的平方根, 注意没有sqrt (int),但是返回值可以为int

算法原理为:

假设圆心坐标为(x,y,z) ,已知的三点坐标分别为(x 1 ,y 1 ,z 1 ) 、 (x 2 ,y 2 ,z 2 )和(x 3 ,y 3 ,z 3 ) ,可以直接建立的方程是:

计算出圆心位置之后,就可以使用计算两点距离的函数,计算出圆形的半径。

// 使用数学方法
double xysm, xyse, xy;
AcGePoint3d ptCenter;
double radius; 
xy = pow(pt1[X], 2) + pow(pt1[Y], 2);
xyse = xy - pow(pt3[X], 2) - pow(pt3[Y], 2);
xysm = xy - pow(pt2[X], 2) - pow(pt2[Y], 2);
xy = (pt1[X] - pt2[X]) * (pt1[Y] - pt3[Y]) - (pt1[X] - pt3[X]) * (pt1[Y] -
pt2[Y]);
// 判断参数有效性
if (fabs(xy) < 0.000001)
{
AfxMessageBox("所输入的参数无法创建圆形!");
return 0;
}
// 获得圆心和半径
ptCenter[X] = (xysm * (pt1[Y] - pt3[Y]) - xyse * (pt1[Y] - pt2[Y])) / (2 *
xy);
ptCenter[Y] = (xyse * (pt1[X] - pt2[X]) - xysm * (pt1[X] - pt3[X])) / (2 *
xy);
ptCenter[Z] = 0;
radius = sqrt((pt1[X] - ptCenter[X]) * (pt1[X] - ptCenter[X]) +
(pt1[Y] - ptCenter[Y]) * (pt1[Y] - ptCenter[Y]));
if (radius < 0.000001)
{
AfxMessageBox("半径过小!");
return 0;
}

// 使用几何类

AcGeCircArc2d geArc(pt1, pt2, pt3);
AcGePoint3d ptCenter(geArc.center().x, geArc.center().y, 0);

 

转载于:https://my.oschina.net/u/2930533/blog/1578117

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值