包含頭文件:#include <math.h>算法
求冪函數:long lpow = pow(x,y);//其做用是計算x的y次方。x、y及函數值都是double型函數
絕對值: double dfabs = fabs(x ); //求 double 型x的絕對值 , 計算|x|, 當x不爲負時返回 x,不然返回 -xspa
開平方: float sqrt (float),double sqrt (double),double long sqrt(double long) // 一個非負實數的平方根, 注意沒有sqrt (int),可是返回值能夠爲int3d
算法原理爲:code
假設圓心座標爲(x,y,z) ,已知的三點座標分別爲(x 1 ,y 1 ,z 1 ) 、 (x 2 ,y 2 ,z 2 )和(x 3 ,y 3 ,z 3 ) ,能夠直接創建的方程是:數學
計算出圓心位置以後,就能夠使用計算兩點距離的函數,計算出圓形的半徑。class
// 使用數學方法 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);