📄 gmcadview.cpp
字号:
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 + -