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

📄 gmcadview.cpp

📁 《Visual C++.NET MFC类库应用详解》程序实例
💻 CPP
📖 第 1 页 / 共 5 页
字号:
            EndY=BeginY-m_HH;

	        dc.MoveTo(BeginX,BeginY);
	        dc.LineTo(EndX,EndY);
	        double b1x=2*Axisx-BeginX;
	        double e1x=2*Axisx-EndX;
	        dc.MoveTo(b1x,BeginY);
	        dc.LineTo(e1x,EndY);

            Vol=pi*m_HH*(pDoc->PreDD*pDoc->PreDD+pDoc->PreDD*m_DD+m_DD*m_DD)/12;
			Area=pi*m_HH*(pDoc->PreDD+m_DD)/2;

		    pRevSurf=new CYuanTai(BeginX,BeginY,EndX,EndY,Axisx,m_HH,pDoc->PreDD,Vol,Area);
	        pDoc->AddRevSurf(pRevSurf);
			
			pDoc->PreDD=m_DD;
			break;
		}
		case XIANXING_H1:
		{
			char symb='+';
            double x0,y0;
            if(pDoc->CurrentDesign==CHONGTOU_DESIGN && H1Number==0)
			{
			    m_DD=m_RR2-sqrt(m_RR2*m_RR2-m_RR*m_RR/4.0);
				pDoc->m_TotalH=m_HH;  // m_HH为总高
	            pDoc->m_RH=m_HH-m_DD;  // m_DD为高度H
	            FirstY=CenterY+m_HH/2.0;

                BeginX=Axisx;
		        BeginY=FirstY;
                EndX=Axisx-m_RR/2.0;  // m_RR为直径
                EndY=BeginY-m_DD;
				symb='+';
                x0=Axisx;
				y0=FirstY-m_RR2;

		        SymmetryArc(&dc,Axisx,x0,y0,m_RR2,BeginX,BeginY,EndX,EndY,symb);

                Vol=pi*m_DD*m_DD*(m_RR2-m_DD/3.0);
				Area=2*pi*m_RR2*m_DD;

			    pRevSurf=new CHuTai(BeginX,BeginY,EndX,EndY,Axisx,x0,
		             y0,m_RR2,symb,m_DD,pDoc->PreDD,Vol,Area);
	            pDoc->AddRevSurf(pRevSurf);
            
			    pDoc->PreDD=m_RR;

			}
			else
			{
			    pDoc->m_RH=pDoc->m_RH-m_HH;
                EndX=Axisx-m_DD/2.0;
                EndY=BeginY-m_HH;
			    symb=m_RP.GetAt(0);

                if(EndX==BeginX)
				{
                    y0=(EndY+BeginY)/2.0;
                    double tempx=sqrt(fabs(m_RR*m_RR-((BeginY-EndY)/2.0)*((BeginY-EndY)/2.0)));
		            if(symb=='+')
				        x0=EndX+tempx;
				    else
				        x0=EndX-tempx;
				}
		        else
				{
                    double k,kk,ta,tb,xx,xy,tx,ty;
		            k=(BeginY-EndY)/(BeginX-EndX);
                    kk=1/k;
                    ta=(BeginY-EndY)*(BeginY-EndY)+(BeginX-EndX)*(BeginX-EndX);
                    tb=sqrt(m_RR*m_RR-ta/4.0);
                    xx=tb/sqrt(1+kk*kk);
                    xy=tb*fabs(kk)/sqrt(1+kk*kk);
                    tx=(BeginX+EndX)/2.0;
                    ty=(BeginY+EndY)/2.0;
                    if(k>0)
					{
			            if(symb=='+')
						{   x0=tx+xx; y0=ty-xy;}
                        else
						{   x0=tx-xx; y0=ty+xy;}
					}
				    else
					{
                        if(symb=='+')
						{   x0=tx+xx; y0=ty+xy;}
                        else
						{   x0=tx-xx; y0=ty-xy;}
					}
				}
		        SymmetryArc(&dc,Axisx,x0,y0,m_RR,BeginX,BeginY,EndX,EndY,symb);

                Vol=Vol_HuTai(Axisx,m_HH,m_RR,x0,y0,EndY,symb);
		        Area=Area_HuTai(Axisx,m_HH,m_RR,x0,y0,EndY,symb);

			    pRevSurf=new CHuTai(BeginX,BeginY,EndX,EndY,Axisx,x0,
		             y0,m_RR,symb,m_HH,pDoc->PreDD,Vol,Area);
	            pDoc->AddRevSurf(pRevSurf);
            
			    pDoc->PreDD=m_DD;
			}

			H1Number++;
			break;
		}
		case XIANXING_H2:
		{
			char symb='+';
            double tr,tempr,x0,y0,a;
			pDoc->m_RH=pDoc->m_RH-m_HH;
            EndX=Axisx-m_DD/2.0;
            EndY=BeginY-m_HH;
            tempr=((Axisx-m_DD/2-BeginX)*(Axisx-m_DD/2-BeginX)+m_HH*m_HH)/(2*m_HH);
            a=Axisx-m_RR/2;
            if(m_RR>m_DD)
               symb='+';
            else
               symb='-';
          			
            if(EndX==BeginX)
			{
                y0=(EndY+BeginY)/2.0;
                if(m_RR>m_DD)
				{
                   tr=m_HH*m_HH/(8*(EndX-a))+(EndX-a)/2;
                   x0=a+tr;
				}
                else
				{
                   tr=m_HH*m_HH/(8*(a-EndX))+(a-EndX)/2;
                   x0=a-tr;
				}
			}
	        else
			{
                double k,kk,xc,yc,b,a1,b1,c1;
				k=(BeginY-EndY)/(BeginX-EndX);
                kk=-1/k;
                xc=(BeginX+EndX)/2;
                yc=(BeginY+EndY)/2;
                b=yc-kk*xc;
                a1=kk*kk;
                b1=2*kk*(b-EndY)-2*EndX+2*a;
                c1=EndX*EndX+(b-EndY)*(b-EndY)-a*a;
                if(m_RR>m_DD)
                   x0=(-b1-sqrt(b1*b1-4*a1*c1))/(2*a1);
                else
                   x0=(-b1+sqrt(b1*b1-4*a1*c1))/(2*a1);
                y0=kk*x0+b;
                if(m_RR>m_DD)
				   tr=x0-a;
				else
                   tr=a-x0;
                if(tr<=tempr)
				{  
					MessageBox("参数不合理!");
					break;
				}
			}
		    SymmetryArc(&dc,Axisx,x0,y0,tr,BeginX,BeginY,EndX,EndY,symb);

            Vol=Vol_HuTai(Axisx,m_HH,tr,x0,y0,EndY,symb);
		    Area=Area_HuTai(Axisx,m_HH,tr,x0,y0,EndY,symb);

			pRevSurf=new CHuTai(BeginX,BeginY,EndX,EndY,Axisx,x0,
		            y0,tr,symb,m_HH,pDoc->PreDD,Vol,Area);
	        pDoc->AddRevSurf(pRevSurf);
            
			pDoc->PreDD=m_DD;
			break;
		}
		case XIANXING_XH:
		{
			pDoc->m_RH=pDoc->m_RH-m_HH;
            EndX=Axisx-m_DD/2.0;
            EndY=BeginY-m_HH;
			char symb=m_RP.GetAt(0);
            double x0,y0,xc,yc,temp;
            double alfa,beta,gama;
            if(fabs(m_HH1)>0.000001)    // 有h1
			{
                y0=BeginY-m_HH-m_HH1;
                if(symb=='+')
                   x0=EndX+sqrt(m_RR*m_RR-m_HH1*m_HH1);
                else
                   x0=EndX-sqrt(m_RR*m_RR-m_HH1*m_HH1);
                if(BeginX!=x0)
                   alfa=atan((BeginY-y0)/(BeginX-x0));
                   if(alfa<0)
                       alfa=pi+alfa;
                else
                   alfa=pi/2;
                temp=sqrt((y0-BeginY)*(y0-BeginY)+(x0-BeginX)*(x0-BeginX));
                if(temp<=m_RR)
                   MessageBox("参数不合理!");
                else
				{
                   beta=acos(m_RR/temp);
                   if(symb=='+')
				   {
                       gama=(pi-alfa-beta);
                       xc=x0-m_RR*cos(gama);
                       yc=y0+m_RR*sin(gama);
				   }
                   else
				   {
                       gama=alfa-beta;
                       xc=x0+m_RR*cos(gama);
                       yc=y0+m_RR*sin(gama);
				   }
                   if(yc>=BeginY || yc<=EndY)
                       MessageBox("参数不合理!");
				}
			}
            else   // 无h1
			{
                if(EndX>BeginX)
                   x0=BeginX+m_RR;
                else
                   x0=BeginX-m_RR;
                if(EndX>BeginX)
                   symb='+';
                else
                   symb='-';
                double tx=fabs(EndX-BeginX);
                double ty=sqrt(2*m_RR*tx-tx*tx);
                y0=EndY+ty;
                xc=BeginX;
                yc=y0;
                temp=sqrt((y0-BeginY)*(y0-BeginY)+(x0-BeginX)*(x0-BeginX));
                if(temp<=m_RR || yc>=BeginY || yc<=EndY)
                   MessageBox("参数不合理!");;
            }
	   // 直线部分     
			dc.MoveTo(BeginX,BeginY);
	        dc.LineTo(xc,yc);
	        double b1x=2*Axisx-BeginX;
	        double e1x=2*Axisx-xc;
	        dc.MoveTo(b1x,BeginY);
	        dc.LineTo(e1x,yc);
            double temph,tempd;
			temph=fabs(BeginY-yc);
			tempd=fabs(Axisx-xc)*2;
            double Vol1=pi*temph*(pDoc->PreDD*pDoc->PreDD+pDoc->PreDD*tempd+tempd*tempd)/12;
			double Area1=pi*temph*(pDoc->PreDD+tempd)/2;


		    pRevSurf=new CYuanTai(BeginX,BeginY,xc,yc,Axisx,temph,pDoc->PreDD,Vol1,Area1);
	        pDoc->AddRevSurf(pRevSurf);
			
			pDoc->PreDD=tempd;            
      // 弧线部分
		    SymmetryArc(&dc,Axisx,x0,y0,m_RR,xc,yc,EndX,EndY,symb);

            double Vol2=Vol_HuTai(Axisx,m_HH-temph,m_RR,x0,y0,EndY,symb);
		    double Area2=Area_HuTai(Axisx,m_HH-temph,m_RR,x0,y0,EndY,symb);

			pRevSurf=new CHuTai(xc,yc,EndX,EndY,Axisx,x0,
		          y0,m_RR,symb,m_HH-temph,pDoc->PreDD,Vol2,Area2);
	        pDoc->AddRevSurf(pRevSurf);
            
			pDoc->PreDD=m_DD;
            Vol=Vol1+Vol2;
			Area=Area1+Area2;
			break;
		}
		case XIANXING_HX:
		{
			pDoc->m_RH=pDoc->m_RH-m_HH;
            EndX=Axisx-m_DD/2.0;
            EndY=BeginY-m_HH;
			char symb=m_RP.GetAt(0);
            double x0,y0,xc,yc,temp;
            double alfa,beta,gama;
            if(fabs(m_HH1)>0.000001)    // 有h1
			{
                y0=BeginY-m_HH1;
                if(symb=='+')
				   x0=BeginX+sqrt(m_RR*m_RR-m_HH1*m_HH1);
                else
				   x0=BeginX+sqrt(m_RR*m_RR-m_HH1*m_HH1);
                if(EndX!=x0)
				{
                   alfa=atan((EndY-y0)/(EndX-x0));
                   if(alfa<0)
                       alfa=pi+alfa;
                }
				else
                   alfa=pi/2;
                temp=sqrt((y0-EndY)*(y0-EndY)+(x0-EndX)*(x0-EndX));
                if(temp<=m_RR)
                   MessageBox("参数不合理!");
                else
				{
                   beta=asin(m_RR/temp);
                   if(symb=='+')
                      gama=alfa+beta;
                   else
                      gama=alfa-beta;
                
                   double bc=sqrt(temp*temp-m_RR*m_RR);
                   xc=EndX+bc*cos(gama);
                   yc=EndY+bc*sin(gama);
                   if(yc>=BeginY || yc<=EndY)
                      MessageBox("参数不合理!");
                }
			}
			else    // 无h1
			{
                if(EndX>BeginX)
                   x0=EndX-m_RR;
                else
                   x0=EndX+m_RR;
                if(EndX>BeginX)
                   symb='-';
                else
                   symb='+';
                double tx=fabs(EndX-BeginX);
                double ty=sqrt(2*m_RR*tx-tx*tx);
                y0=BeginY-ty;
                xc=EndX;
                yc=y0;
                temp=sqrt((y0-EndY)*(y0-EndY)+(x0-EndX)*(x0-EndX));
                if(temp<=m_RR || yc>=BeginY || yc<=EndY)
                   MessageBox("参数不合理!");
            }
      // 弧线部分
		    SymmetryArc(&dc,Axisx,x0,y0,m_RR,BeginX,BeginY,xc,yc,symb);
            double temph,tempd;
			temph=fabs(BeginY-yc);
			tempd=fabs(Axisx-xc)*2;
            double Vol1=Vol_HuTai(Axisx,temph,m_RR,x0,y0,yc,symb);
		    double Area1=Area_HuTai(Axisx,temph,m_RR,x0,y0,yc,symb);

			pRevSurf=new CHuTai(BeginX,BeginY,xc,yc,Axisx,x0,y0,m_RR,
		          symb,temph,pDoc->PreDD,Vol1,Area1);
	        pDoc->AddRevSurf(pRevSurf);
			pDoc->PreDD=tempd;        
            
	   // 直线部分     
			dc.MoveTo(xc,yc);
	        dc.LineTo(EndX,EndY);
	        double b1x=2*Axisx-xc;
	        double e1x=2*Axisx-EndX;
	        dc.MoveTo(b1x,yc);
	        dc.LineTo(e1x,EndY);

            double Vol2=pi*(m_HH-temph)*(pDoc->PreDD*pDoc->PreDD+pDoc->PreDD*m_DD+m_DD*m_DD)/12;
			double Area2=pi*(m_HH-temph)*(pDoc->PreDD+m_DD)/2;


		    pRevSurf=new CYuanTai(xc,yc,EndX,EndY,Axisx,m_HH-temph,pDoc->PreDD,Vol2,Area2);
	        pDoc->AddRevSurf(pRevSurf);
			pDoc->PreDD=m_DD;
            Vol=Vol1+Vol2;
			Area=Area1+Area2;
			
			break;
		}
		case XIANXING_HH:
		{
			pDoc->m_RH=pDoc->m_RH-m_HH;
            EndX=Axisx-m_DD/2.0;
            EndY=BeginY-m_HH;
			char symb1=m_RP.GetAt(0);
			char symb2=m_RP2.GetAt(0);
            double x01,y01,x02,y02,xc,yc,wc;
			double alfa,alfa1,alfa2,beita,o1b,o1bb,o2a,o2aa;

            if(fabs(m_HH1)>0.001)    // 已知h1,未知h2
			{
                y01=BeginY-m_HH1;
                wc=sqrt(m_RR*m_RR-m_HH1*m_HH1);
                if(symb1=='+')
                    x01=BeginX+wc;
                else
                    x01=BeginX-wc;
                o1b=(EndY-y01)*(EndY-y01)+(EndX-x01)*(EndX-x01);
                o1bb=sqrt(o1b);

                if(symb1=='+')
				{
                    if(symb2=='+')   // 已知h1: symb1='+', symb2='+'
					{
                       if(EndX==x01)
						  alfa1=pi/2;
                       else
					   {
                          alfa1=atan((EndY-y01)/(EndX-x01));
                          if(alfa1<0)
                             alfa1=pi+alfa1;
                       }   
                       alfa2=acos((o1b+m_RR2*m_RR2-(m_RR-m_RR2)*(m_RR-m_RR2))/(2*sqrt(o1b)*m_RR2));
                       if(m_RR>m_RR2)
                          alfa=alfa1+alfa2;
                       else
                          alfa=alfa1-alfa2;
                       x02=EndX+m_RR2*cos(alfa);
                       y02=EndY+m_RR2*sin(alfa);
                       if(x01==x02)
                          beita=pi/2;
                       else
                          beita=atan((y02-y01)/(x02-x01));
                       xc=x02-m_RR2*cos(beita);
                       yc=y02-m_RR2*sin(beita);
					}
                    else     // 已知h1: symb1='+', symb2='-'
					{
                       if(EndX==x01)
                          alfa1=pi/2;
                       else
					   {
                          alfa1=atan((EndY-y01)/(EndX-x01));
                          if(alfa1<0)
                             alfa1=alfa1+pi;
					   }  
                       alfa2=acos((o1b+m_RR2*m_RR2-(m_RR+m_RR2)*(m_RR+m_RR2))/(2*sqrt(o1b)*m_RR2));
                       alfa=alfa1+alfa2;
                       x02=EndX+m_RR2*cos(alfa);
                       y02=EndY+m_RR2*sin(alfa);
                       if(x01==x02)
                           beita=pi/2;
                       else
					   {
                           beita=atan((y02-y01)/(x02-x01));
                           if(beita<0)
                              beita=beita+pi;
                       }
                       xc=x02+m_RR2*cos(beita);
                       yc=y02+m_RR2*sin(beita);
                    }
				}
                else  //symb1='-'
				{
                    if(symb2=='+')    // 已知h1: symb1='-', symb2='+'
					{
                       if(EndX==x01)
					      alfa1=pi/2;
                       else
					   {
                          alfa1=atan((EndY-y01)/(EndX-x01));
                          if(alfa1<0)
                             alfa1=alfa1+pi;
                       }

⌨️ 快捷键说明

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