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;ctnm_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;ctnp.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_ActPointp.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;ctnp.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;ctnp.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_ActPointp.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;ctnp.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;ctnp.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;ctnp.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;ctnp.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;ctnafter) { 
		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;ctnafter=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(cip.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