www.pudn.com > roll.rar > BBROLL.CPP
#include"stdafx.h" #include "comnfun.h" #include#include #include "bbroll.h" CBbroll::CBbroll() { char buf[150]; CStdioFile f; if(f.Open("rollgeom.dat",CFile::modeRead|CFile::typeText)) { f.ReadString(buf,150); sscanf(buf,"%lf %lf %lf %lf %lf %lf %d %d %d %d %d", &m_r1,&m_r2,&m_length,&m_angle,&m_high,&m_thick, &m_teethnum,&m_LINSEG,&m_ARCSEG,&m_DEPSEG,&m_LARCSEG); f.Close(); } else { m_high = 2.0; m_angle = 15.0; m_length = 1200.0; m_thick = 170.0; m_r1 = 1.5; m_r2 = 1.0; m_teethnum = 210; m_ARCSEG = 4; m_LINSEG = 4; m_DEPSEG = 12; m_LARCSEG = 4; } if(f.Open("rollload.dat",CFile::modeRead|CFile::typeText)) { f.ReadString(buf,150); sscanf(buf,"%lf %lf %lf %lf %lf %d %lf %lf %lf %lf", &m_force,&m_Press,&m_Rotate,&m_InnTemperature,&m_OutTemperature,&m_ActPoint, &m_Young,&m_Poisson,&m_Thermal,&m_Weight); f.Close(); } else { m_ActPoint = 3; m_force = 1.0e8; m_Press = 2.0e5; m_Rotate = 200.0; m_InnTemperature = 102.0; m_OutTemperature = 100.0; m_Young = 2.0e11; m_Poisson = 0.3; m_Thermal = 12.5e-6; m_Weight = 7.8e-6; } } BOOL CBbroll::WriteParameters(CWnd *wnd) { CStdioFile f; if( !f.Open( "rollgeom.dat", CFile::modeCreate | CFile::modeWrite | CFile::typeText ) ) { wnd->MessageBox("Unable create data file","Error"); return FALSE; } char buf[150]; sprintf(buf,"%15.5e %15.5e %15.5e %15.5e %15.5e %15.5e %5d %5d %5d %5d %5d\n", m_r1,m_r2,m_length,m_angle,m_high,m_thick, m_teethnum,m_LINSEG,m_ARCSEG,m_DEPSEG,m_LARCSEG); f.WriteString( buf ); f.Close(); return TRUE; } BOOL CBbroll::WriteLoadsParameters(CWnd *wnd) { CStdioFile f; if( !f.Open( "rollload.dat", CFile::modeCreate | CFile::modeWrite | CFile::typeText ) ) { wnd->MessageBox("Unable create data file","Error"); return FALSE; } char buf[150]; sprintf(buf,"%15.5e %15.5e %15.5e %15.5e %15.5e %5d %15.5e %15.5e %15.5e %15.5e\n", m_force,m_Press,m_Rotate,m_InnTemperature,m_OutTemperature,m_ActPoint, m_Young,m_Poisson,m_Thermal,m_Weight); f.WriteString( buf ); double t=m_Weight*m_length; MASS=t*AREA; INERT=t*MEMONT; sprintf(buf,"%19.10e %19.10e",MASS,INERT); f.WriteString( buf ); f.Close(); return TRUE; } int CBbroll::Calc_Roller() { double alfa,bita,alfag,alfad; double xx1,yy1,xx2,yy2,xx3,yy3,xx4,yy4; double ttx,tty,rr2; alfa = m_angle*M_PI/360.0; bita = M_PI/m_teethnum; if( alfa <= bita ) return 1; RCENOUT = (m_r1+m_r2+m_high*sin(alfa)); rr2 = cos(alfa)*sin(bita)+sin(alfa)*(1.0-cos(bita)); RCENOUT = RCENOUT/rr2; rr2 = RCENOUT-m_high; m_tthick = rr2-m_r1; // m_tthick is the greatest inner circle radius if( m_tthick <= m_thick ) return 1; roller[6].x = -RCENOUT*sin(bita); roller[6].y = RCENOUT*cos(bita); roller[3].x = 0.0; roller[3].y = rr2; roller[2].x = -m_r1*cos(alfa); roller[2].y = rr2-m_r1*sin(alfa); roller[1].x = -roller[2].x; roller[1].y = roller[2].y; roller[4].x = roller[6].x+m_r2*cos(alfa); roller[4].y = roller[6].y+m_r2*sin(alfa); roller[0].x = -roller[4].x; roller[0].y = roller[4].y; alfa = 2.0*bita; ttx = cos(alfa); tty = sin(alfa); roller[5].x = roller[0].x*ttx-roller[0].y*tty; roller[5].y = roller[0].x*tty+roller[0].y*ttx; ttx=0.5*(roller[0].x+roller[1].x); tty=0.5*(roller[0].y+roller[1].y); m_tthick=sqrt(ttx*ttx+tty*tty); // Prepair the calculate mass and inertial ttx = cos(bita); tty = sin(bita); xx1=roller[3].x*ttx+roller[3].y*tty; yy1=-roller[3].x*tty+roller[3].y*ttx; xx2=roller[3].x*ttx+(roller[3].y-m_r1)*tty; yy2=-roller[3].x*tty+(roller[3].y-m_r1)*ttx; xx3=roller[2].x*ttx+roller[2].y*tty; yy3=-roller[2].x*tty+roller[2].y*ttx; xx4=roller[4].x*ttx+roller[4].y*tty; yy4=-roller[4].x*tty+roller[4].y*ttx; alfag=CalcAngle(roller[2].x,roller[2].y,roller[1].x,roller[1].y,roller[3].x,roller[3].y); alfad=CalcAngle(roller[4].x,roller[4].y,roller[5].x,roller[5].y,roller[6].x,roller[6].y); // Calculate the mass of roller AREA=0.5*xx2*yy2; AREA=AREA+xx1*(yy3-yy2)+0.5*(xx1-xx3)*(yy1-yy3)- 0.25*m_r1*m_r1*alfag-0.5*(xx1-xx2)*(yy1-yy2); AREA=AREA+0.5*(xx3+xx4)*(yy4-yy3); AREA=AREA+0.25*alfad*m_r2*m_r2-0.5*(yy4-RCENOUT)*xx4;; AREA=2.0*AREA*m_teethnum; AREA=AREA-M_PI*m_thick*m_thick; // Calculate the inertial of roller MEMONT=xx2*yy2*(3*yy2*yy2+xx2*xx2)/12.0; rr2=alfag*0.5; MEMONT=MEMONT+xx1*(yy3-yy2)*(xx1*xx1/3+yy1*yy1+m_r1*m_r1)-2.0*yy1* ((xx3-xx1)*(xx3-xx1)*(xx3-xx1)-(xx2-xx1)*(xx2-xx1)*(xx2-xx1))/3.0+ 0.5*(xx1*xx1+yy1*yy1+m_r1*m_r1)*(rr2*m_r1*m_r1+(yy3-yy1)*(xx3-xx1)-(yy2-yy1)*(xx2-xx1))+ xx1*yy1*((yy3-yy1)*(yy3-yy1)+(yy2-yy1)*(yy2-yy1)); MEMONT=MEMONT+(yy4-yy3)*(xx4+xx3)*(xx4*xx4+xx3*xx3)/12.0+ (xx3*yy4-xx4*yy3)*(yy4*yy4+yy3*yy4+yy3*yy3)/3.0+ (xx4-xx3)*(yy3+yy4)*(yy3*yy3+yy4*yy4)/4.0; alfa=alfad*0.5; MEMONT=MEMONT+0.25*(m_r2*m_r2+2.0*RCENOUT*RCENOUT)*(m_r2*m_r2*alfa- xx4*(yy4-RCENOUT))+(yy4-RCENOUT)*xx4*xx4*xx4/6.0+ 2.0*RCENOUT*xx4*xx4*xx4/3.0; MEMONT=2.0*MEMONT*m_teethnum; MEMONT=MEMONT-0.5*M_PI*m_thick*m_thick*m_thick*m_thick; rr2=m_Weight*m_length; MASS=rr2*AREA; INERT=rr2*MEMONT; return 0; } ///////////////////////////////////////////////////////////////////// double CBbroll::CalcAngle(double xa,double ya, double xb,double yb, double xc,double yc) { double t1=atan2((ya-yc),(xa-xc)); if(t1<0.0) t1=M_PI2+t1; double t2=atan2((yb-yc),(xb-xc)); if(t2<0.0) t2=M_PI2+t2; return t2-t1; } void CBbroll::DeleteDBL(CFPointDBL *head) { while(head->before) head=head->before; CFPointDBL *move=head; while(move) { move=head->after; delete head; head=move; } } CFPointDBL* CBbroll::BeforeInsert(CFPointDBL *crossnode,CFPoint p) { CFPointDBL *q; q=new CFPointDBL; if(q==NULL) return NULL; q->p.x=p.x; q->p.y=p.y; q->before=crossnode->before; q->after=crossnode; if(crossnode->before) crossnode->before->after=q; crossnode->before=q; return q; } CFPointDBL* CBbroll::AfterInsert(CFPointDBL *crossnode,CFPoint p) { CFPointDBL *q; q=new CFPointDBL; if(q==NULL) return NULL; q->p.x=p.x; q->p.y=p.y; q->before=crossnode; q->after=crossnode->after; if(crossnode->after) crossnode->after->before=q; crossnode->after=q; return q; } CFPoint *CBbroll::CutTranTeeth(int& ctn) { double t; double wide=0.01; CFPoint p[17]; double s=M_PI2/m_teethnum; double coss=cos(s); double sins=sin(s); p[0].x=roller[0].x*coss+roller[0].y*sins; p[0].y=-roller[0].x*sins+roller[0].y*coss; p[1].x=roller[1].x*coss+roller[1].y*sins; p[1].y=-roller[1].x*sins+roller[1].y*coss; p[0].x=0.5*(p[0].x+p[1].x); p[0].y=0.5*(p[0].y+p[1].y); p[2].x=roller[2].x*coss+roller[2].y*sins; p[2].y=-roller[2].x*sins+roller[2].y*coss; p[3].x=roller[3].x*coss+roller[3].y*sins; p[3].y=-roller[3].x*sins+roller[3].y*coss; p[4].x=roller[4].x*coss+roller[4].y*sins; p[4].y=-roller[4].x*sins+roller[4].y*coss; p[5].x=roller[5].x*coss+roller[5].y*sins; p[5].y=-roller[5].x*sins+roller[5].y*coss; p[6].x=roller[6].x*coss+roller[6].y*sins; p[6].y=-roller[6].x*sins+roller[6].y*coss; for(ctn=1;ctn m_r1*targ1/m_ARCSEG || wide>m_r2*tard2/m_ARCSEG || wide>tcong/m_LINSEG) { wide*=0.5; ctn=1; } } while(ctn); CFPointDBL *head = new CFPointDBL; head->before=head->after=NULL; CFPointDBL *bhead=head; CFPointDBL *end=head; if(m_ActPoint==0) { t=wide/m_r1; temp=atan2(p[2].y-p[3].y,p[2].x-p[3].x); n1[0]=cos(temp+t); n1[1]=sin(temp+t); head->p.x=p[3].x+m_r1*n1[0]; head->p.y=p[3].y+m_r1*n1[1]; n1[0]=-n1[0]; n1[1]=-n1[1]; end=AfterInsert(end,p[2]); n2[0]=-cos(temp); n2[1]=-sin(temp); n3[0]=p[4].x-p[2].x; n3[1]=p[4].y-p[2].y; n3[0]/=tcong; n3[1]/=tcong; coss=p[2].x+wide*n3[0]; sins=p[2].y+wide*n3[1]; end=AfterInsert(end,CFPoint(coss,sins)); n3[0]=n2[0]; n3[1]=n2[1]; p[2].x=head->p.x; p[2].y=head->p.y; t=CalcAngle(p[2].x,p[2].y,p[1].x,p[1].y,p[3].x,p[3].y); t/=m_ARCSEG; temp=atan2(p[2].y-p[3].y,p[2].x-p[3].x); for(ctn=1;ctn p.x; p[2].y=end->p.y; coss=(p[4].x-p[2].x)/m_LINSEG; sins=(p[4].y-p[2].y)/m_LINSEG; for(ctn=1;ctn<=m_LINSEG;ctn++) end=AfterInsert(end,CFPoint(p[2].x+ctn*coss,p[2].y+ctn*sins)); t=tard2/m_ARCSEG; temp=atan2(p[4].y-p[6].y,p[4].x-p[6].x); for(ctn=1;ctn<=m_ARCSEG;ctn++) { coss=p[6].x+m_r2*cos(temp+t*ctn); sins=p[6].y+m_r2*sin(temp+t*ctn); end=AfterInsert(end,CFPoint(coss,sins)); } coss=(p[7].x-p[5].x)/m_LINSEG; sins=(p[7].y-p[5].y)/m_LINSEG; for(ctn=1;ctn<=m_LINSEG;ctn++) end=AfterInsert(end,CFPoint(p[5].x+ctn*coss,p[5].y+ctn*sins)); t=targ1/m_ARCSEG; temp=atan2(p[7].y-p[9].y,p[7].x-p[9].x); for(ctn=1;ctn<=m_ARCSEG;ctn++) { coss=p[9].x+m_r1*cos(temp-t*ctn); sins=p[9].y+m_r1*sin(temp-t*ctn); end=AfterInsert(end,CFPoint(coss,sins)); } coss=(p[10].x-p[8].x)/m_LINSEG; sins=(p[10].y-p[8].y)/m_LINSEG; for(ctn=1;ctn<=m_LINSEG;ctn++) end=AfterInsert(end,CFPoint(p[8].x+ctn*coss,p[8].y+ctn*sins)); t=tard2/m_ARCSEG; temp=atan2(p[10].y-p[12].y,p[10].x-p[12].x); for(ctn=1;ctn<=m_ARCSEG;ctn++) { coss=p[12].x+m_r2*cos(temp+t*ctn); sins=p[12].y+m_r2*sin(temp+t*ctn); end=AfterInsert(end,CFPoint(coss,sins)); } coss=(p[13].x-p[11].x)/m_LINSEG; sins=(p[13].y-p[11].y)/m_LINSEG; for(ctn=1;ctn<=m_LINSEG;ctn++) end=AfterInsert(end,CFPoint(p[11].x+ctn*coss,p[11].y+ctn*sins)); t=targ1/m_ARCSEG; temp=atan2(p[13].y-p[15].y,p[13].x-p[15].x); for(ctn=1;ctn<=m_ARCSEG;ctn++) { coss=p[15].x+m_r1*cos(temp-t*ctn); sins=p[15].y+m_r1*sin(temp-t*ctn); end=AfterInsert(end,CFPoint(coss,sins)); } end=AfterInsert(end,p[16]); } else if(m_ActPoint p.x=coss-wide*n1[0]; head->p.y=sins-wide*n1[1]; end=AfterInsert(end,CFPoint(coss,sins)); coss=coss+wide*n1[0]; sins=sins+wide*n1[1]; end=AfterInsert(end,CFPoint(coss,sins)); t=n1[0]; n1[0]=n1[1]; n1[1]=-t; n2[0]=n3[0]=n1[0]; n2[1]=n3[1]=n1[1]; bhead=BeforeInsert(bhead,p[2]); t=targ1/m_ARCSEG; temp=atan2(p[2].y-p[3].y,p[2].x-p[3].x); for(ctn=1;ctn p.x=p[4].x-wide*n1[0]; head->p.y=p[4].y-wide*n1[1]; end=AfterInsert(end,p[4]); t=wide/m_r2; temp=atan2(p[4].y-p[6].y,p[4].x-p[6].x); n2[0]=n1[0]=cos(temp); n2[1]=n1[1]=sin(temp); n3[0]=cos(temp+t); n3[1]=sin(temp+t); coss=p[6].x+m_r2*n3[0]; sins=p[6].y+m_r2*n3[1]; end=AfterInsert(end,CFPoint(coss,sins)); bhead=BeforeInsert(bhead,p[2]); t=targ1/m_ARCSEG; temp=atan2(p[2].y-p[3].y,p[2].x-p[3].x); for(ctn=1;ctn p.x; p[4].y=end->p.y; t=CalcAngle(p[4].x,p[4].y,p[5].x,p[5].y,p[6].x,p[6].y); t/=m_ARCSEG; temp=atan2(p[4].y-p[6].y,p[4].x-p[6].x); for(ctn=1;ctn<=m_ARCSEG;ctn++) { coss=p[6].x+m_r2*cos(temp+ctn*t); sins=p[6].y+m_r2*sin(temp+ctn*t); end=AfterInsert(end,CFPoint(coss,sins)); } coss=(p[7].x-p[5].x)/m_LINSEG; sins=(p[7].y-p[5].y)/m_LINSEG; for(ctn=1;ctn<=m_LINSEG;ctn++) end=AfterInsert(end,CFPoint(p[5].x+ctn*coss,p[5].y+ctn*sins)); t=targ1/m_ARCSEG; temp=atan2(p[7].y-p[9].y,p[7].x-p[9].x); for(ctn=1;ctn<=m_ARCSEG;ctn++) { coss=p[9].x+m_r1*cos(temp-t*ctn); sins=p[9].y+m_r1*sin(temp-t*ctn); end=AfterInsert(end,CFPoint(coss,sins)); } coss=(p[10].x-p[8].x)/m_LINSEG; sins=(p[10].y-p[8].y)/m_LINSEG; for(ctn=1;ctn<=m_LINSEG;ctn++) end=AfterInsert(end,CFPoint(p[8].x+ctn*coss,p[8].y+ctn*sins)); t=tard2/m_ARCSEG; temp=atan2(p[10].y-p[12].y,p[10].x-p[12].x); for(ctn=1;ctn<=m_ARCSEG;ctn++) { coss=p[12].x+m_r2*cos(temp+t*ctn); sins=p[12].y+m_r2*sin(temp+t*ctn); end=AfterInsert(end,CFPoint(coss,sins)); } coss=(p[13].x-p[11].x)/m_LINSEG; sins=(p[13].y-p[11].y)/m_LINSEG; for(ctn=1;ctn<=m_LINSEG;ctn++) end=AfterInsert(end,CFPoint(p[11].x+ctn*coss,p[11].y+ctn*sins)); t=targ1/m_ARCSEG; temp=atan2(p[13].y-p[15].y,p[13].x-p[15].x); for(ctn=1;ctn<=m_ARCSEG;ctn++) { coss=p[15].x+m_r1*cos(temp-t*ctn); sins=p[15].y+m_r1*sin(temp-t*ctn); end=AfterInsert(end,CFPoint(coss,sins)); } end=AfterInsert(end,p[16]); } else if(m_ActPoint p.x=coss; head->p.y=sins; n2[0]=cos(temp+t); n2[1]=sin(temp+t); coss=p[6].x+m_r2*n2[0]; sins=p[6].y+m_r2*n2[1]; end=AfterInsert(end,CFPoint(coss,sins)); n3[0]=cos(temp+t+s); n3[1]=sin(temp+t+s); coss=p[6].x+m_r2*n3[0]; sins=p[6].y+m_r2*n3[1]; end=AfterInsert(end,CFPoint(coss,sins)); bhead=BeforeInsert(bhead,p[4]); bhead=BeforeInsert(bhead,p[2]); t=targ1/m_ARCSEG; temp=atan2(p[2].y-p[3].y,p[2].x-p[3].x); for(ctn=1;ctn p.x=coss; head->p.y=sins; end=AfterInsert(end,p[5]); n3[0]=n2[0]=cos(temp); n3[1]=n2[1]=sin(temp); coss=p[7].x-p[5].x; sins=p[7].y-p[5].y; t=1.0/sqrt(coss*coss+sins*sins); coss=p[5].x+wide*coss*t; sins=p[5].y+wide*sins*t; end=AfterInsert(end,CFPoint(coss,sins)); p[5].x=head->p.x; p[5].y=head->p.y; t=CalcAngle(p[4].x,p[4].y,p[5].x,p[5].y,p[6].x,p[6].y); t/=m_ARCSEG; temp=atan2(p[5].y-p[6].y,p[5].x-p[6].x); bhead=BeforeInsert(bhead,p[5]); for(ctn=1;ctn p.x; p[5].y=end->p.y; coss=(p[7].x-p[5].x)/m_LINSEG; sins=(p[7].y-p[5].y)/m_LINSEG; for(ctn=1;ctn<=m_LINSEG;ctn++) end=AfterInsert(end,CFPoint(p[5].x+ctn*coss,p[5].y+ctn*sins)); t=targ1/m_ARCSEG; temp=atan2(p[7].y-p[9].y,p[7].x-p[9].x); for(ctn=1;ctn<=m_ARCSEG;ctn++) { coss=p[9].x+m_r1*cos(temp-t*ctn); sins=p[9].y+m_r1*sin(temp-t*ctn); end=AfterInsert(end,CFPoint(coss,sins)); } coss=(p[10].x-p[8].x)/m_LINSEG; sins=(p[10].y-p[8].y)/m_LINSEG; for(ctn=1;ctn<=m_LINSEG;ctn++) end=AfterInsert(end,CFPoint(p[8].x+ctn*coss,p[8].y+ctn*sins)); t=tard2/m_ARCSEG; temp=atan2(p[10].y-p[12].y,p[10].x-p[12].x); for(ctn=1;ctn<=m_ARCSEG;ctn++) { coss=p[12].x+m_r2*cos(temp+t*ctn); sins=p[12].y+m_r2*sin(temp+t*ctn); end=AfterInsert(end,CFPoint(coss,sins)); } coss=(p[13].x-p[11].x)/m_LINSEG; sins=(p[13].y-p[11].y)/m_LINSEG; for(ctn=1;ctn<=m_LINSEG;ctn++) end=AfterInsert(end,CFPoint(p[11].x+ctn*coss,p[11].y+ctn*sins)); t=targ1/m_ARCSEG; temp=atan2(p[13].y-p[15].y,p[13].x-p[15].x); for(ctn=1;ctn<=m_ARCSEG;ctn++) { coss=p[15].x+m_r1*cos(temp-t*ctn); sins=p[15].y+m_r1*sin(temp-t*ctn); end=AfterInsert(end,CFPoint(coss,sins)); } end=AfterInsert(end,p[16]); } else if(m_ActPoint<2*m_LINSEG+m_ARCSEG) { n1[0]=p[7].x-p[5].x; n1[1]=p[7].y-p[5].y; n2[0]=n1[0]/tcong; n2[1]=n1[1]/tcong; coss=p[5].x+(m_ActPoint-m_LINSEG-m_ARCSEG)*n1[0]/m_LINSEG; sins=p[5].y+(m_ActPoint-m_LINSEG-m_ARCSEG)*n1[1]/m_LINSEG; head->p.x=coss-wide*n2[0]; head->p.y=sins-wide*n2[1]; end=AfterInsert(end,CFPoint(coss,sins)); coss=coss+wide*n2[0]; sins=sins+wide*n2[1]; end=AfterInsert(end,CFPoint(coss,sins)); t=n2[0]; n2[0]=n2[1]; n2[1]=-t; n1[0]=n3[0]=n2[0]; n1[1]=n3[1]=n2[1]; t=tard2/m_ARCSEG; temp=atan2(p[5].y-p[6].y,p[5].x-p[6].x); bhead=BeforeInsert(bhead,p[5]); for(ctn=1;ctn p.x=p[7].x-wide*n2[0]; head->p.y=p[7].y-wide*n2[1]; end=AfterInsert(end,p[7]); t=wide/m_r1; temp=atan2(p[7].y-p[9].y,p[7].x-p[9].x); n3[0]=cos(temp-t); n3[1]=sin(temp-t); coss=p[9].x+m_r1*n3[0]; sins=p[9].y+m_r1*n3[1]; end=AfterInsert(end,CFPoint(coss,sins)); n3[0]=-n3[0]; n3[1]=-n3[1]; n1[0]=n2[0]=-cos(temp); n1[1]=n2[1]=-sin(temp); bhead=BeforeInsert(bhead,p[5]); t=tard2/m_ARCSEG; temp=atan2(p[5].y-p[6].y,p[5].x-p[6].x); bhead=BeforeInsert(bhead,p[5]); for(ctn=1;ctn p.x; p[7].y=end->p.y; t=targ1/m_ARCSEG; temp=atan2(p[7].y-p[9].y,p[7].x-p[9].x); for(ctn=1;ctn<=m_ARCSEG;ctn++) { coss=p[9].x+m_r1*cos(temp-t*ctn); sins=p[9].y+m_r1*sin(temp-t*ctn); end=AfterInsert(end,CFPoint(coss,sins)); } coss=(p[10].x-p[8].x)/m_LINSEG; sins=(p[10].y-p[8].y)/m_LINSEG; for(ctn=1;ctn<=m_LINSEG;ctn++) end=AfterInsert(end,CFPoint(p[8].x+ctn*coss,p[8].y+ctn*sins)); t=tard2/m_ARCSEG; temp=atan2(p[10].y-p[12].y,p[10].x-p[12].x); for(ctn=1;ctn<=m_ARCSEG;ctn++) { coss=p[12].x+m_r2*cos(temp+t*ctn); sins=p[12].y+m_r2*sin(temp+t*ctn); end=AfterInsert(end,CFPoint(coss,sins)); } coss=(p[13].x-p[11].x)/m_LINSEG; sins=(p[13].y-p[11].y)/m_LINSEG; for(ctn=1;ctn<=m_LINSEG;ctn++) end=AfterInsert(end,CFPoint(p[11].x+ctn*coss,p[11].y+ctn*sins)); t=targ1/m_ARCSEG; temp=atan2(p[13].y-p[15].y,p[13].x-p[15].x); for(ctn=1;ctn<=m_ARCSEG;ctn++) { coss=p[15].x+m_r1*cos(temp-t*ctn); sins=p[15].y+m_r1*sin(temp-t*ctn); end=AfterInsert(end,CFPoint(coss,sins)); } end=AfterInsert(end,p[16]); } else { s=wide/m_r1; t=(m_ActPoint-2*m_LINSEG-m_ARCSEG)*targ1/m_ARCSEG; temp=atan2(p[7].y-p[9].y,p[7].x-p[9].x); n1[0]=cos(temp-t+s); n1[1]=sin(temp-t+s); coss=p[6].x+m_r2*n1[0]; sins=p[6].y+m_r2*n1[1]; head->p.x=coss; head->p.y=sins; n1[0]=-n1[0]; n1[1]=-n1[1]; n2[0]=cos(temp-t); n2[1]=sin(temp-t); coss=p[6].x+m_r2*n2[0]; sins=p[6].y+m_r2*n2[1]; end=AfterInsert(end,CFPoint(coss,sins)); n2[0]=-n2[0]; n2[1]=-n2[1]; n3[0]=cos(temp-t-s); n3[1]=sin(temp-t-s); coss=p[6].x+m_r2*n3[0]; sins=p[6].y+m_r2*n3[1]; end=AfterInsert(end,CFPoint(coss,sins)); n3[0]=-n3[0]; n3[1]=-n3[1]; bhead=BeforeInsert(bhead,p[7]); t=tard2/m_ARCSEG; temp=atan2(p[5].y-p[6].y,p[5].x-p[6].x); bhead=BeforeInsert(bhead,p[5]); for(ctn=1;ctn after) { ctn++; end=end->after; } t=atan2(p[16].y,p[16].x); s=atan2(p[0].y,p[0].x); s=M_PI2-t+s; int ci=m_LARCSEG; if((ctn+m_LARCSEG-1)%2!=0) ci++; s = s/ci; temp=sqrt(p[16].y*p[16].y+p[16].x*p[16].x); for(ctn=1;ctn after=bhead; bhead->before=end; end=head->before; CFPoint *cross; ctn=1; bhead=head->after; while(bhead!=head) { ctn++; bhead=bhead->after; } cross = new CFPoint[ctn]; ci=0; bhead=head; while(ci p.x; cross[ci].y=bhead->p.y; ci++; bhead=bhead->after; } end->after=NULL; head->before=NULL; DeleteDBL(head); return cross; } void CBbroll::CutToothBoundary(CWnd *wnd) { int i,j,kl,nodenum; double s,rm,coss,sins; CFPoint *crosso,*crossm,*crossi; crosso=CutTranTeeth(nodenum); crossm=new CFPoint[nodenum/2]; crossi=new CFPoint[nodenum]; for(i=0;i