- bool CC3PDlg::calCircleCenter(PD3Point p1,PD3Point p2,double &radium)
- //input p1[0] p1[1] p1[2]
- //output p2[0] circle center coordinate
- // p2[1] normal
- // radium
- {
- double dPx,dQx,dRx;
- double dPy,dQy,dRy;
- double dPz,dQz,dRz;
- double dX0,dY0,dZ0;
- double dR;
- dPx=p1[0].x;
- dQx=p1[1].x;
- dRx=p1[2].x;
- dPy=p1[0].y;
- dQy=p1[1].y;
- dRy=p1[2].y;
- dPz=p1[0].z;
- dQz=p1[1].z;
- dRz=p1[2].z;
- //算平面法量
- double pi,pj,pk;
- double x1=dQx-dPx;
- double x2=dRx-dPx;
- double y1=dQy-dPy;
- double y2=dRy-dPy;
- double z1=dQz-dPz;
- double z2=dRz-dPz;
- pi=y1*z2-z1*y2;
- pj=z1*x2-x1*z2;
- pk=x1*y2-y1*x2;
- if((pi==0)&&(pj==0)&&(pk==0))
- {
- return FALSE;
- }
- //求PQ和PR的中垂线
- //1,过PQ的中点(Mx,My,Mz),
- double dMx,dMy,dMz;
- dMx=(dPx+dQx)/2;
- dMy=(dPy+dQy)/2;
- dMz=(dPz+dQz)/2;
- //与(Mi,Mj,Mk)=(pi,pj,pk)×(x1,y1,z1)垂直
- double dMi,dMj,dMk;
- dMi=pj*z1-pk*y1;
- dMj=pk*x1-pi*z1;
- dMk=pi*y1-pj*x1;
- //2,过PR的中点(Nx,Ny,Nz),
- double dNx,dNy,dNz;
- dNx=(dPx+dRx)/2;
- dNy=(dPy+dRy)/2;
- dNz=(dPz+dRz)/2;
- //与(Ni,Nj,Nk)=(pi,pj,pk)×(x2,y2,z2)垂直
- double dNi,dNj,dNk,ds;
- dNi=pj*z2-pk*y2;
- dNj=pk*x2-pi*z2;
- dNk=pi*y2-pj*x2;
- //归一
- // ds=dNi*dNi+dNj*dNj+dNk*dNk;
- ds=pi*pi+pj*pj+pk*pk;
- ds=sqrt(ds);
- if(ds==0)
- {
- p2[1].x=0;
- p2[1].y=0;
- p2[1].z=0;
- }
- else
- {
- p2[1].x=pi/ds;
- p2[1].y=pj/ds;
- p2[1].z=pk/ds;
- }
- //得到的两条中垂线为{X=dMx+dMi*tm;Y=dMy+dMj*tm;Z=dMz+dMk*tm;} 或(X-dMx)/dMi=(Y-dMy)/dMj=(Z-dMz)/dMk;
- // {X=dNx+dNi*tn;Y=dNy+dNj*tn;Z=dNz+dNk*tn;} 或(X-dNx)/dNi=(Y-dNy)/dNj=(Z-dNz)/dNk;
- //解两直线交点
- double tm,tn;
- tn=((dMy-dNy)*dMi+dMj*(dNx-dMx))/(dNj*dMi-dMj*dNi);
- tm=(dNx+dNi*tn-dMx)/dMi;
- dX0=dMx+dMi*tm;
- dY0=dMy+dMj*tm;
- dZ0=dMz+dMk*tm;
- p2[0].x=dX0;
- p2[0].y=dY0;
- p2[0].z=dZ0;
- //得半径
- dR=(dX0-dPx)*(dX0-dPx)+(dY0-dPy)*(dY0-dPy)+(dZ0-dPz)*(dZ0-dPz);
- dR=sqrt(dR);
- radium=dR;
- return TRUE;
- }
空间3点,计算圆心坐标
最新推荐文章于 2024-08-08 14:05:44 发布