⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gmcaddoc.cpp

📁 《Visual C++.NET MFC类库应用详解》程序实例
💻 CPP
📖 第 1 页 / 共 2 页
字号:
             ynb2=yb2-s*cosb;
		  }
          else
		  {
             xna1=xa1+s*(xa1-xc1)/r1;
             yna1=ya1+s*(ya1-yc1)/r1;
             xnb1=xb1+s*(xb1-xc1)/r1;
             ynb1=yb1-s*(yc1-yb1)/r1;
             
             xna2=xa2+s*sinb;
             yna2=ya2+s*cosb;
             xnb2=xb2+s*sinb;
             ynb2=yb2+s*cosb;
          }
       }
       if( jlh1 != 1 )  //若为第一条弧则不求交点
	   {
          a=1+k2*k2;
          B=2*k2*(ynb2-k2*xnb2-yc1)-2*xc1;
          if(xc2>xa2)    //圆心在右
		  {
             c=xc1*xc1+(ynb2-k2*xnb2-yc1)*(ynb2-k2*xnb2-yc1)-(r1-s)*(r1-s);
		  }
          else               //圆心在左
		  {
             c=xc1*xc1+(ynb2-k2*xnb2-yc1)*(ynb2-k2*xnb2-yc1)-(r1+s)*(r1+s);
          }
          delta=sqrt(B*B-4*a*c);
          x1=(-B-delta)/2/a;
          x2=(-B+delta)/2/a;
          y1=k2*x1-k2*xnb2+ynb2;
          y2=k2*x2-k2*xnb2+ynb2;
          if(sqrt((x1-xna2)*(x1-xna2)+(y1-yna2)*(y1-yna2))<sqrt((x2-xna2)*(x2-xna2)+(y2-yna2)*(y2-yna2)))
		  {
             xnb1=x1;
             ynb1=y1;
		  }
          else
		  {
             xnb1=x2;
             ynb1=y2;
          }
       }
    }
    xna2=xnb1;  //上一次的终点为下一次的起点
    yna2=ynb1;
    
	TempStruct tt;
	tt.xna1=xna1;
	tt.xna2=xna2;
	tt.xnb1=xnb1;
	tt.xnb2=xnb2;
	tt.yna1=yna1;
	tt.yna2=yna2;
	tt.ynb1=ynb1;
	tt.ynb2=ynb2;
	return tt;
}
void qgxdyj(CStdioFile *fp,double qdx,double qdy,double zdy)
{
    CString outstr;
	double dfr=2.0;    //倒圆角半径
    outstr.Format("pline %f,%f a ce %f,%f %f,%f l\n",qdx+dfr,qdy,qdx+dfr,qdy-dfr,qdx,qdy-dfr);
    fp->WriteString(outstr);
    outstr.Format("%f,%f a ce %f,%f %f,%f \n",qdx,zdy+dfr,qdx+dfr,zdy+dfr,qdx+dfr,zdy);
    fp->WriteString(outstr);
}

FPOINT linecircle(double cx,double cy, double r, double k)
{
    FPOINT fp;
    double jj=52.5*k+cy-k*cx;
    double a=1+k*k;
    double B=2*k*jj-2*cx-2*k*cy;
    double c=cx*cx+cy*cy+jj*jj-r*r-2*cy*jj;
    double delta=sqrt(B*B-4*a*c);
    double x1=(-B+delta)/2.0/a;
    double x2=(-B-delta)/2.0/a;
    if(x1>cx-52.5)
       fp.x=x1;
    else
       fp.x=x2;
    fp.y=fp.x*k+jj;
	return fp;
}

double Vol_HuTai(double Axisx,double h, double r, double x0, double y0, double Y, 
		char symbol)
{
    double a,b,v1,v2,v3,v4,v5,tv,vol; 
	a = y0-Y;
    b = Axisx-x0;
    v1 = pi*h*(b*b+r*r-a*a+a*h-h*h/3.0);
    v2 = (h-a)*sqrt(fabs(r*r-(h-a)*(h-a)))/2.0;
	v3 = r*r*asin((h-a)/r)/2.0;
    v4 = a*sqrt(fabs(r*r-a*a))/2.0;
    v5 = r*r*asin(-a/r)/2.0;
    tv = 2*pi*b*(v2+v3+v4-v5);
    if(symbol=='+')
       vol = v1+tv;
    else
       vol = v1-tv;
	return vol;
}

double Area_HuTai(double Axisx,double h, double r, double x0, double y0, double Y, 
		char symbol)
{
    double a,b,a2,a3,a4,a5,aa,area;
    a = y0-Y;
    b = Axisx-x0;
    a2 =(h-a)*sqrt(fabs(r*r-(h-a)*(h-a)))/2.0;
	a3 =r*r*asin((h-a)/r)/2.0;
    a4 =a*sqrt(fabs(r*r-a*a))/2.0;
    a5 =r*r*asin(-a/r)/2.0;
    aa =2*pi*(a2+a3+a4-a5);
    if(symbol=='+')
       area = 2*pi*b*h+aa;
    else
       area = 2*pi*b*h-aa;
	return area;
}

void SymmetryLine(CDC *pDC,double cx,double bx,double by,double ex,double ey)
{
	pDC->MoveTo(bx,by);
	pDC->LineTo(ex,ey);
	double b1x=2*cx-bx;
	double e1x=2*cx-ex;
	pDC->MoveTo(b1x,by);
	pDC->LineTo(e1x,ey);
}

void SymmetryArc(CDC *pDC,double cx,double x0,double y0,double r,
	    double bx,double by,double ex,double ey,char symbol)
{
    double RectLx1,Recty1,RectLx2,Recty2;
	double x0d,RectRx1,RectRx2,bRx,eRx;
	RectLx1=x0-r;
	Recty1=y0+r;
	RectLx2=x0+r;
	Recty2=y0-r;
    
	x0d=2*cx-x0;
	RectRx1=x0d-r;
	RectRx2=x0d+r;
	bRx=2*cx-bx;
	eRx=2*cx-ex;
	if(symbol=='+')
	{
	    pDC->Arc(RectLx1,Recty1,RectLx2,Recty2,bx,by,ex,ey);
	    pDC->Arc(RectRx1,Recty1,RectRx2,Recty2,eRx,ey,bRx,by);
	}
	else
	{
	    pDC->Arc(RectLx1,Recty1,RectLx2,Recty2,ex,ey,bx,by);
	    pDC->Arc(RectRx1,Recty1,RectRx2,Recty2,bRx,by,eRx,ey);
	}
}

/////////////////////////////////////////////////////////////////////////////
// CRevSurf类
IMPLEMENT_SERIAL(CRevSurf,CObject,1)
void CRevSurf::Serialize(CArchive &ar)
{
	if(ar.IsStoring())
		ar<<m_XX<<m_Bx<<m_By<<m_Ex<<m_Ey<<m_H<<PreDD<<m_Vol<<m_Area;

	else
		ar>>m_XX>>m_Bx>>m_By>>m_Ex>>m_Ey>>m_H>>PreDD>>m_Vol>>m_Area;
}

/////////////////////////////////////////////////////////////////////////////
// CCuboid类
IMPLEMENT_SERIAL(CCuboid,CRevSurf,1)
CCuboid::CCuboid(double Bx,double By,double Ex,double Ey,double h,double predd,double Vol,double Area)
{
    m_XX='R';
	m_Bx=Bx;
	m_By=By;
	m_Ex=Ex;
	m_Ey=Ey;
	m_H=h;
	PreDD=predd;
	m_Vol=Vol;
	m_Area=Area;
}
void CCuboid::Drawing(CDC *pDC)
{
	pDC->MoveTo(m_Bx,m_By);
	pDC->LineTo(m_Ex,m_By);
	pDC->LineTo(m_Ex,m_Ey);
	pDC->LineTo(m_Bx,m_Ey);
	pDC->LineTo(m_Bx,m_By);
}
void CCuboid::Serialize(CArchive &ar)
{
	CRevSurf::Serialize(ar);
}

/////////////////////////////////////////////////////////////////////////////
// CHLine类
IMPLEMENT_SERIAL(CHLine,CRevSurf,1)
CHLine::CHLine(double Bx,double By,double Ex,double Ey,double h,double predd,double Vol,double Area)
{
    m_XX='H';
	m_Bx=Bx;
	m_By=By;
	m_Ex=Ex;
	m_Ey=Ey;
	m_H=h;
	PreDD=predd;
	m_Vol=Vol;
	m_Area=Area;
}
void CHLine::Drawing(CDC *pDC)
{
	pDC->MoveTo(m_Bx,m_By);
	pDC->LineTo(m_Ex,m_Ey);
}
void CHLine::Serialize(CArchive &ar)
{
	CRevSurf::Serialize(ar);
}

/////////////////////////////////////////////////////////////////////////////
// CYuanTai类
IMPLEMENT_SERIAL(CYuanTai,CRevSurf,1)
CYuanTai::CYuanTai(double Bx,double By,double Ex,double Ey,double Ax,
	double h,double predd,double Vol,double Area)
{
    m_XX='L';
	m_Bx=Bx;
	m_By=By;
	m_Ex=Ex;
	m_Ey=Ey;
	m_Axisx=Ax;
	m_H=h;
	PreDD=predd;
	m_Vol=Vol;
	m_Area=Area;

}
void CYuanTai::Drawing(CDC *pDC)
{
    SymmetryLine(pDC,m_Axisx,m_Bx,m_By,m_Ex,m_Ey);
}
void CYuanTai::Serialize(CArchive &ar)
{
	CRevSurf::Serialize(ar);
	if(ar.IsStoring())
        ar<<m_Axisx;
	else
		ar>>m_Axisx;
}

/////////////////////////////////////////////////////////////////////////////
// CHuTai类
IMPLEMENT_SERIAL(CHuTai,CRevSurf,1)
CHuTai::CHuTai(double Bx,double By,double Ex,double Ey,double Ax,double x0,double y0,
	double r, char LorR,double h,double predd,double Vol,double Area)
{
    m_XX='A';
	m_Bx=Bx;
	m_By=By;
	m_Ex=Ex;
	m_Ey=Ey;
	m_Axisx=Ax;
	m_x0=x0;
	m_y0=y0;
	m_r=r;
	m_LorR=LorR;
	m_H=h;
	PreDD=predd;
	m_Vol=Vol;
	m_Area=Area;
}
void CHuTai::Drawing(CDC *pDC)
{
    SymmetryArc(pDC,m_Axisx,m_x0,m_y0,m_r,m_Bx,m_By,
		m_Ex,m_Ey,m_LorR);

}
void CHuTai::Serialize(CArchive &ar)
{
	CRevSurf::Serialize(ar);
	if(ar.IsStoring())
		ar<<m_Axisx<<m_x0<<m_y0<<m_r<<m_LorR;
	else
		ar>>m_Axisx>>m_x0>>m_y0>>m_r>>m_LorR;
}

/////////////////////////////////////////////////////////////////////////////
// CPingDi类
IMPLEMENT_SERIAL(CPingDi,CRevSurf,1)
CPingDi::CPingDi(double Axisx,double Bx,double By,double xc,double yc,
		double x01,double y01,double r1,double x02,double y02,double r2,
		double h,double predd,double Vol,double Area)
{
    m_XX='P';
	m_Bx=Bx; m_By=By;
	m_Ex=xc; m_Ey=yc;
    m_Ax=Axisx;
	m_R1=r1;  //r1 
	m_R2=r2;  //m_RR
	m_x1=x01;m_y1=y01;
	m_x2=x02;m_y2=y02;
	m_H=h;PreDD=predd;
	m_Vol=Vol; m_Area=Area;
}
void CPingDi::Drawing(CDC *pDC)
{
       double RectLx1,Recty1,RectLx2,Recty2;
	   double x2d,RectRx1,RectRx2,bRx,eRx;
	   RectLx1=m_x2-m_R1;
	   Recty1=m_y2+m_R1;
	   RectLx2=m_x2+m_R1;
	   Recty2=m_y2-m_R1;
       pDC->Arc(RectLx1,Recty1,RectLx2,Recty2,m_Bx,m_By,m_Ex,m_Ey);       

       x2d=2*m_Ax-m_x2;
	   RectRx1=x2d-m_R1;
	   RectRx2=x2d+m_R1;
	   bRx=2*m_Ax-m_Bx;
	   eRx=2*m_Ax-m_Ex;
	   pDC->Arc(RectRx1,Recty1,RectRx2,Recty2,eRx,m_Ey,bRx,m_By);

	   SymmetryArc(pDC,m_Ax,m_x1,m_y1,m_R2,m_Ax,m_By,m_Ex,m_Ey,'+');
}
void CPingDi::Serialize(CArchive &ar)
{
	CRevSurf::Serialize(ar);
	if(ar.IsStoring())
	{
		ar<<m_Ax<<m_R1<<m_R2<<m_x1<<m_y1<<m_x2<<m_y2;
	}
	else
	{
		ar>>m_Ax>>m_R1>>m_R2>>m_x1>>m_y1>>m_x2>>m_y2;
	}
}

void CGMCADDoc::OnTranRefsurf() 
{
	// 瓶形立体图转换

	LPCTSTR lpszDefExt=".scr";
	static char szFilter[]="SCR Files(*.scr)|*.scr||";
    CStdioFile cf;
	CRevSurf *p;
	CFileDialog FileDlg(FALSE,lpszDefExt,NULL,OFN_OVERWRITEPROMPT,szFilter);
 	if(FileDlg.DoModal()==IDOK && cf.Open(FileDlg.GetPathName(),CFile::modeCreate | CFile::modeWrite))
	{
        CString outstr;
		double hhhh,wwwr,hy,AxisX,qdx,qdy,zdx,zdy;
        int index;
	    index=GetRevSurfNumber();
		p=GetRevSurf(1);
        CYuanTai *yyyp=(CYuanTai *)p;
		AxisX=yyyp->m_Axisx;
        qdx=2*(AxisX-p->m_Bx);
        zdx=2*(AxisX-p->m_Ex);
		qdy=p->m_By;
        zdy=p->m_Ey;
        if(qdy>zdy)hy=qdy;
		else hy=zdy;
		hhhh=295-hy;
		wwwr=-255;		

        outstr="limits 0,0 297,500\n";
        cf.WriteString(outstr);
        outstr="pline 148,195 w 0.01 0.01 148,195 \n";
        cf.WriteString(outstr);
        outstr="zoom all\n";
        cf.WriteString(outstr);

		char XX,PreXX;
		double s1,s2,s3,s4,s5,s6,s7,alfa1,alfa2,minx,xdx,xdy;
	    for(int i=0;i<index;i++)
		{
			p=GetRevSurf(i);
            XX=p->m_XX;   
            s1=p->m_Bx+wwwr;
            s2=p->m_By+hhhh;
            s3=p->m_Ex+wwwr;
            s4=p->m_Ey+hhhh;
            if(i==0)
            {   
				outstr.Format("pline %f,%f %f,%f\n",s1,s2,s1,s4);
		        cf.WriteString(outstr);
				PreXX='L';
                minx=s1;
				xdx=s1;
				xdy=(s2+s4)/2;
            }
			else
			{
                if(i==1)
				{
                   if(s2>s4)
				      outstr.Format("%f,%f\n",s1,s2);
                   else
				      outstr.Format("%f,%f\n",s3,s4);
 		           cf.WriteString(outstr);
                }                
				if(minx>s1)minx=s1;
			    if(XX=='L')
				{   
					if(PreXX=='L')
						outstr.Format("%f,%f\n",s3,s4);
					else
                        outstr.Format("l %f,%f\n",s3,s4);
 		            cf.WriteString(outstr);
				}
                if(XX=='A')
				{
			        CHuTai *hp=(CHuTai *)p;
			        s5=hp->m_x0+wwwr;
                    s6=hp->m_y0+hhhh;
                    s7=hp->m_r;
                    if(s2>s4)
					{
                       if(s1==s5)
                          alfa1=pi/2;
                       else
                          alfa1=pi+atan((s2-s6)/(s1-s5));
                       if(s3==s5)
                          alfa2=pi*1.5;
                       else
                          alfa2=pi+atan((s4-s6)/(s3-s5));
                       if(PreXX=='L')
                          outstr.Format("a a %f c %f,%f\n",(alfa2-alfa1)*180/pi,s5,s6);
                       else
                          outstr.Format("a %f c %f,%f\n",(alfa2-alfa1)*180/pi,s5,s6);
 		               cf.WriteString(outstr);
                    }
					else
					{
                       if(s1==s5)
                          alfa1=-pi/2;
                       else
                          alfa1=atan((s2-s6)/(s1-s5));
                       if(s3==s5)
                          alfa2=pi/2;
                       else
                          alfa2=atan((s4-s6)/(s3-s5));
                       if(PreXX=='L')
                          outstr.Format("a a %f c %f,%f\n",(alfa1-alfa2)*180/pi,s5,s6);
                       else
                          outstr.Format("a %f c %f,%f\n",(alfa1-alfa2)*180/pi,s5,s6);
                       cf.WriteString(outstr);
					}
				}
                if(XX=='P')   //瓶底部分
				{
			        double cx1,cy1,cx2,cy2,r1,r2,ax;
					CPingDi *pp=(CPingDi *)p;
			        cx1=pp->m_x1+wwwr;
                    cy1=pp->m_y1+hhhh;
                    r1=pp->m_R1;
			        cx2=pp->m_x2+wwwr;
                    cy2=pp->m_y2+hhhh;
                    r2=pp->m_R2;
					ax=pp->m_Ax+wwwr;

                    alfa1=pi+atan((s2-cy2)/(s1-cx2));
                    alfa2=2*pi-atan((cy2-s4)/(s3-cx2));
                    if(PreXX=='L')
                       outstr.Format("a a %f c %f,%f\n",(alfa2-alfa1)*180/pi,cx2,cy2);
                    else
                       outstr.Format("a %f c %f,%f\n",(alfa2-alfa1)*180/pi,cx2,cy2);
  	                cf.WriteString(outstr);

                    alfa1=atan((cx1-s3)/(s4-cy1));
                    if(PreXX=='L')
                       outstr.Format("a a %f c %f,%f\n",-alfa1*180/pi,cx1,cy1);
                    else
                       outstr.Format("a %f c %f,%f\n",-alfa1*180/pi,cx1,cy1);
  	                cf.WriteString(outstr);
				}
                PreXX=XX;
			}
		}
        outstr="\n";
        cf.WriteString(outstr);
        outstr="line 148,35 148,420 \n";
        cf.WriteString(outstr);
        outstr="surftab1 64\n";
        cf.WriteString(outstr);
        outstr="revsurf\n";
        cf.WriteString(outstr);
        outstr.Format("%f,%f\n",xdx,xdy);
        cf.WriteString(outstr);
        outstr="148,35 0 360\n";
        cf.WriteString(outstr);
        outstr="erase 148,35 \n";
        cf.WriteString(outstr);
        outstr="vpoint 0,4,-10\n";
        cf.WriteString(outstr);

    }
}

void CGMCADDoc::OnUpdateTranRefsurf(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
    pCmdUI->Enable(m_DesignFinish && CurrentDesign==PINGXING_DESIGN);	
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -