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

📄 gnode.h

📁 是一个G代码转换的源程序
💻 H
📖 第 1 页 / 共 4 页
字号:
			yj=y2;
		}
		Value.Typ=1;
		Value.xq=xq;
		Value.yq=yq;
		Value.xz=xj;
		Value.yz=yj;
		result.push_back(Value);
		Value.Typ=Typ2;
		Value.xq=xj;
		Value.yq=yj;
		Value.xc=Ox2;
		Value.yc=Oy2;
		Value.r=r2+rc;
		Value.xz=lrxz;
		Value.yz=lryz;
		result.push_back(Value);
	}
	else if ((sina<0 && cosa>-Epsilon) && RadialComp==1)
		// G41伸长型
	{
		LineComp(Xq1,Yq1,Xz1,Yz1,rc,RadialComp,lrxq,lryq,lrxz,lryz);
		LC1Radius(Angle1,Angle2,rc,RadialComp,AC1x,AC1y,AC2x,AC2y);
		Value.Typ=1;
		Value.xq=lrxq;
		Value.yq=lryq;
		Value.xz=Xz1+AC1x;
		Value.yz=Yz1+AC1y;
		result.push_back(Value);
		Value.Typ=1;
		Value.xq=Xz1+AC1x;
		Value.yq=Yz1+AC1y;
		Value.xz=Xz1+AC2x;
		Value.yz=Yz1+AC2y;
		result.push_back(Value);
		ARCRadius(Xq2,Yq2,Xz2,Yz2,Ox2,Oy2,r2,RadialComp,Typ2,rc,lrxq,lryq,lrxz,lryz);
		Value.Typ=Typ2;
		Value.xq=Xz1+AC2x;
		Value.yq=Yz1+AC2y;
		Value.xc=Ox2;
		Value.yc=Oy2;
		Value.r=r2+rc;
		Value.xz=lrxz;
		Value.yz=lryz;
		result.push_back(Value);
	}
	else if ((sina<0 && cosa<0) && RadialComp==1)
		// G41插入型
	{
		LineComp(Xq1,Yq1,Xz1,Yz1,rc,RadialComp,lrxq,lryq,lrxz,lryz);
		LC2Radius(Angle1,Angle2,rc,RadialComp,AC1x,AC1y,AC2x,AC2y,ADx,ADy);
		Value.Typ=1;
		Value.xq=lrxq;
		Value.yq=lryq;
		Value.xz=Xz1+AC1x;
		Value.yz=Yz1+AC1y;
		result.push_back(Value);
		Value.Typ=1;
		Value.xq=Xz1+AC1x;
		Value.yq=Yz1+AC1y;
		Value.xz=Xz1+AC2x;
		Value.yz=Yz1+AC2y;
		result.push_back(Value);
		Value.Typ=1;
		Value.xq=Xz1+AC2x;
		Value.yq=Yz1+AC2y;
		Value.xz=Xz1+ADx;
		Value.yz=Yz1+ADy;
		result.push_back(Value);
		ARCRadius(Xq2,Yq2,Xz2,Yz2,Ox2,Oy2,r2,RadialComp,Typ2,rc,lrxq,lryq,lrxz,lryz);
		Value.Typ=Typ2;
		Value.xq=Xz1+ADx;
		Value.yq=Yz1+ADy;
		Value.xc=Ox2;
		Value.yc=Oy2;
		Value.r=r2+rc;
		Value.xz=lrxz;
		Value.yz=lryz;
		result.push_back(Value);
	}
	else if (sina<0 && RadialComp==2)
		// G42缩短型
	{
		LineComp(Xq1,Yq1,Xz1,Yz1,rc,RadialComp,lrxq,lryq,lrxz,lryz);
		xq=lrxq;
		yq=lryq;
		xz=lrxz;
		yz=lryz;
		ARCRadius(Xq2,Yq2,Xz2,Yz2,Ox2,Oy2,r2,RadialComp,Typ2,rc,lrxq,lryq,lrxz,lryz);
		LineJC(xq,yq,xz,yz,Ox2,Oy2,r2+rc,x1,y1,x2,y2);
		Length1=sqrt((x1-Xz1)*(x1-Xz1)+(y1-Yz1)*(y1-Yz1));
		Length2=sqrt((x2-Xz1)*(x2-Xz1)+(y2-Yz1)*(y2-Yz1));
		if (Length1<Length2)
		{
			xj=x1;
			yj=y1;
		}
		else
		{
			xj=x2;
			yj=y2;
		}
		Value.Typ=1;
		Value.xq=xq;
		Value.yq=yq;
		Value.xz=xj;
		Value.yz=yj;
		result.push_back(Value);
		Value.Typ=Typ2;
		Value.xq=xj;
		Value.yq=yj;
		Value.xc=Ox2;
		Value.yc=Oy2;
		Value.r=r2+rc;
		Value.xz=lrxz;
		Value.yz=lryz;
		result.push_back(Value);
	}
	else if ((sina>-Epsilon && cosa>-Epsilon) && RadialComp==2)
		// G42伸长型
	{
		LineComp(Xq1,Yq1,Xz1,Yz1,rc,RadialComp,lrxq,lryq,lrxz,lryz);
		LC1Radius(Angle1,Angle2,rc,RadialComp,AC1x,AC1y,AC2x,AC2y);
		Value.Typ=1;
		Value.xq=lrxq;
		Value.yq=lryq;
		Value.xz=Xz1+AC1x;
		Value.yz=Yz1+AC1y;
		result.push_back(Value);
		Value.Typ=1;
		Value.xq=Xz1+AC1x;
		Value.yq=Yz1+AC1y;
		Value.xz=Xz1+AC2x;
		Value.yz=Yz1+AC2y;
		result.push_back(Value);
		ARCRadius(Xq2,Yq2,Xz2,Yz2,Ox2,Oy2,r2,RadialComp,Typ2,rc,lrxq,lryq,lrxz,lryz);
		Value.Typ=Typ2;
		Value.xq=Xz1+AC2x;
		Value.yq=Yz1+AC2y;
		Value.xc=Ox2;
		Value.yc=Oy2;
		Value.r=r2+rc;
		Value.xz=lrxz;
		Value.yz=lryz;
		result.push_back(Value);
	}
	else if ((sina>-Epsilon && cosa<0) && RadialComp==2)
		// G42插入型
	{
		LineComp(Xq1,Yq1,Xz1,Yz1,rc,RadialComp,lrxq,lryq,lrxz,lryz);
		LC2Radius(Angle1,Angle2,rc,RadialComp,AC1x,AC1y,AC2x,AC2y,ADx,ADy);
		Value.Typ=1;
		Value.xq=lrxq;
		Value.yq=lryq;
		Value.xz=Xz1+AC1x;
		Value.yz=Yz1+AC1y;
		result.push_back(Value);
		Value.Typ=1;
		Value.xq=Xz1+AC1x;
		Value.yq=Yz1+AC1y;
		Value.xz=Xz1+AC2x;
		Value.yz=Yz1+AC2y;
		result.push_back(Value);
		Value.Typ=1;
		Value.xq=Xz1+AC2x;
		Value.yq=Yz1+AC2y;
		Value.xz=Xz1+ADx;
		Value.yz=Yz1+ADy;
		result.push_back(Value);
		ARCRadius(Xq2,Yq2,Xz2,Yz2,Ox2,Oy2,r2,RadialComp,Typ2,rc,lrxq,lryq,lrxz,lryz);
		Value.Typ=Typ2;
		Value.xq=Xz1+ADx;
		Value.yq=Yz1+ADy;
		Value.xc=Ox2;
		Value.yc=Oy2;
		Value.r=r2+rc;
		Value.xz=lrxz;
		Value.yz=lryz;
		result.push_back(Value);
	}
}

void GNode::LC1Radius(double Angle1,double Angle2,float rc,const int &RadialComp,
			          float &AC1x,float &AC1y,float &AC2x,float &AC2y)
{
	rc=fabs(rc);
	if (RadialComp==1)
		rc=-1*rc;
	Angle1=Angle1*pi/180;
	Angle2=Angle2*pi/180;
	AC1x=float(rc*(sin(Angle1)+sin(Angle2))/(1+cos(Angle2-Angle1)));
	AC1y=float(rc*(-cos(Angle1)-cos(Angle2))/(1+cos(Angle2-Angle1)));
	AC2x=float(rc*sin(Angle2));
	AC2y=float(-rc*cos(Angle2));
}

void GNode::LC2Radius(double Angle1,double Angle2,float rc,const int &RadialComp,
			          float &AC1x,float &AC1y,float &AC2x,float &AC2y,float &ADx,float &ADy)
{
	rc=fabs(rc);
	Angle1=Angle1*pi/180;
	Angle2=Angle2*pi/180;	
	if (RadialComp==1)
	{
		AC1x=float(rc*(cos(Angle1)-sin(Angle1)));
		AC1y=float(rc*(cos(Angle1)+sin(Angle1)));
		AC2x=float(rc*(-sin(Angle2)-cos(Angle2)));
		AC2y=float(rc*(-sin(Angle2)+cos(Angle2)));
		ADx=float(-rc*sin(Angle2));
		ADy=float(rc*cos(Angle2));
	}
	else if (RadialComp==2)
	{
		AC1x=float(rc*(sin(Angle1)+cos(Angle1)));
		AC1y=float(rc*(sin(Angle1)-cos(Angle1)));
		AC2x=float(rc*(sin(Angle2)-cos(Angle2)));
		AC2y=float(rc*(-sin(Angle2)-cos(Angle2)));
		ADx=float(rc*sin(Angle2));
		ADy=float(-rc*cos(Angle2));
	}
}

void GNode::CLComp(const float &Xq1,const float &Yq1,const float &Xz1,const float &Yz1,
				   const float &Ox1,const float &Oy1,float r1,const int &Typ1,
				   const float &Xq2,const float &Yq2,const float &Xz2,const float &Yz2,
				   float rc,const int &RadialComp,vector<CompCoord> &result)
{
	double Angle1,Angle2,Angle3;
	float xq,yq,xz,yz,lrxq,lryq,lrxz,lryz;
	float AC1x,AC1y,AC2x,AC2y,ABx,ABy;
	double cosa,sina;
	float x1,y1,x2,y2;
	float xj,yj;
	double Length1,Length2;
	CompCoord Value;
	result.clear();
	r1=fabs(r1);
	Angle1=dqcy(Xz1,Yz1,Ox1,Oy1,Typ1);
	Angle2=Angle(Xq2,Yq2,Xz2,Yz2);
	Angle3=Angle2-Angle1;
	Angle3=Angle3*pi/180;
	sina=sin(Angle3);
	cosa=cos(Angle3);
	if (sina>-Epsilon && RadialComp==1)
		// G41缩短型
	{	
		ARCRadius(Xq1,Yq1,Xz1,Yz1,Ox1,Oy1,r1,RadialComp,Typ1,rc,lrxq,lryq,lrxz,lryz);
		Value.Typ=Typ1;
		Value.xq=lrxq;
		Value.yq=lryq;
		Value.xc=Ox1;
		Value.yc=Oy1;
		Value.r=r1+rc;
		LineComp(Xq2,Yq2,Xz2,Yz2,rc,RadialComp,lrxq,lryq,lrxz,lryz);
		xq=lrxq;
		yq=lryq;
		xz=lrxz;
		yz=lryz;
		LineJC(xq,yq,xz,yz,Ox1,Oy1,r1+rc,x1,y1,x2,y2);
		Length1=sqrt((x1-Xz1)*(x1-Xz1)+(y1-Yz1)*(y1-Yz1));
		Length2=sqrt((x2-Xz1)*(x2-Xz1)+(y2-Yz1)*(y2-Yz1));
		if (Length1<Length2)
		{
			xj=x1;
			yj=y1;
		}
		else
		{
			xj=x2;
			yj=y2;
		}		
		Value.xz=xj;
		Value.yz=yj;		
		result.push_back(Value);
		Value.Typ=1;
		Value.xq=xj;
		Value.yq=yj;
		Value.xz=lrxz;
		Value.yz=lryz;
		result.push_back(Value);
	}
	else if ((sina<0 && cosa>-Epsilon) && RadialComp==1)
		// G41伸长型
	{
		ARCRadius(Xq1,Yq1,Xz1,Yz1,Ox1,Oy1,r1,RadialComp,Typ1,rc,lrxq,lryq,lrxz,lryz);
		CL1Radius(Angle1,Angle2,rc,RadialComp,ABx,ABy,AC1x,AC1y);
		Value.Typ=Typ1;
		Value.xq=lrxq;
		Value.yq=lryq;
		Value.xc=Ox1;
		Value.yc=Oy1;
		Value.r=r1+rc;
		Value.xz=Xz1+ABx;
		Value.yz=Yz1+ABy;
		result.push_back(Value);
		Value.Typ=1;
		Value.xq=Xz1+ABx;
		Value.yq=Yz1+ABy;
		Value.xz=Xz1+AC1x;
		Value.yz=Yz1+AC1y;
		result.push_back(Value);
		LineComp(Xq2,Yq2,Xz2,Yz2,rc,RadialComp,lrxq,lryq,lrxz,lryz);
		Value.xq=Xz1+AC1x;
		Value.yq=Yz1+AC1y;
		Value.xz=lrxz;
		Value.yz=lryz;
		result.push_back(Value);
	}
	else if ((sina<0 && cosa<0) && RadialComp==1)
		// G41插入型
	{
		ARCRadius(Xq1,Yq1,Xz1,Yz1,Ox1,Oy1,r1,RadialComp,Typ1,rc,lrxq,lryq,lrxz,lryz);
		CL2Radius(Angle1,Angle2,rc,RadialComp,ABx,ABy,AC1x,AC1y,AC2x,AC2y);
		Value.Typ=Typ1;
		Value.xq=lrxq;
		Value.yq=lryq;
		Value.xc=Ox1;
		Value.yc=Oy1;
		Value.r=r1+rc;
		Value.xz=Xz1+ABx;
		Value.yz=Yz1+ABy;
		result.push_back(Value);
		Value.Typ=1;
		Value.xq=Xz1+ABx;
		Value.yq=Yz1+ABy;
		Value.xz=Xz1+AC1x;
		Value.yz=Yz1+AC1y;
		result.push_back(Value);
		Value.Typ=1;
		Value.xq=Xz1+AC1x;
		Value.yq=Yz1+AC1y;
		Value.xz=Xz1+AC2x;
		Value.yz=Yz1+AC2y;
		result.push_back(Value);
		LineComp(Xq2,Yq2,Xz2,Yz2,rc,RadialComp,lrxq,lryq,lrxz,lryz);
		Value.xq=Xz1+AC2x;
		Value.yq=Yz1+AC2y;
		Value.xz=lrxz;
		Value.yz=lryz;
		result.push_back(Value);
	}
	else if (sina<0 && RadialComp==2)
		// G42缩短型
	{
		ARCRadius(Xq1,Yq1,Xz1,Yz1,Ox1,Oy1,r1,RadialComp,Typ1,rc,lrxq,lryq,lrxz,lryz);
		Value.Typ=Typ1;
		Value.xq=lrxq;
		Value.yq=lryq;
		Value.xc=Ox1;
		Value.yc=Oy1;
		Value.r=r1+rc;
		LineComp(Xq2,Yq2,Xz2,Yz2,rc,RadialComp,lrxq,lryq,lrxz,lryz);
		xq=lrxq;
		yq=lryq;
		xz=lrxz;
		yz=lryz;
		LineJC(xq,yq,xz,yz,Ox1,Oy1,r1+rc,x1,y1,x2,y2);
		Length1=sqrt((x1-Xz1)*(x1-Xz1)+(y1-Yz1)*(y1-Yz1));
		Length2=sqrt((x2-Xz1)*(x2-Xz1)+(y2-Yz1)*(y2-Yz1));
		if (Length1<Length2)
		{
			xj=x1;
			yj=y1;
		}
		else
		{
			xj=x2;
			yj=y2;
		}		
		Value.xz=xj;
		Value.yz=yj;		
		result.push_back(Value);
		Value.Typ=1;
		Value.xq=xj;
		Value.yq=yj;
		Value.xz=lrxz;
		Value.yz=lryz;
		result.push_back(Value);
	}
	else if ((sina>-Epsilon && cosa>-Epsilon) && RadialComp==2) 
		// G42伸长型
	{
		ARCRadius(Xq1,Yq1,Xz1,Yz1,Ox1,Oy1,r1,RadialComp,Typ1,rc,lrxq,lryq,lrxz,lryz);
		CL1Radius(Angle1,Angle2,rc,RadialComp,ABx,ABy,AC1x,AC1y);
		Value.Typ=Typ1;
		Value.xq=lrxq;
		Value.yq=lryq;
		Value.xc=Ox1;
		Value.yc=Oy1;
		Value.r=r1+rc;
		Value.xz=Xz1+ABx;
		Value.yz=Yz1+ABy;
		result.push_back(Value);
		Value.Typ=1;
		Value.xq=Xz1+ABx;
		Value.yq=Yz1+ABy;
		Value.xz=Xz1+AC1x;
		Value.yz=Yz1+AC1y;
		result.push_back(Value);
		LineComp(Xq2,Yq2,Xz2,Yz2,rc,RadialComp,lrxq,lryq,lrxz,lryz);
		Value.xq=Xz1+AC1x;
		Value.yq=Yz1+AC1y;
		Value.xz=lrxz;
		Value.yz=lryz;
		result.push_back(Value);
	}
	else if ((sina>-Epsilon && cosa<0) && RadialComp==2)
		// G42插入型
	{
		ARCRadius(Xq1,Yq1,Xz1,Yz1,Ox1,Oy1,r1,RadialComp,Typ1,rc,lrxq,lryq,lrxz,lryz);
		CL2Radius(Angle1,Angle2,rc,RadialComp,ABx,ABy,AC1x,AC1y,AC2x,AC2y);
		Value.Typ=Typ1;
		Value.xq=lrxq;
		Value.yq=lryq;
		Value.xc=Ox1;
		Value.yc=Oy1;
		Value.r=r1+rc;
		Value.xz=Xz1+ABx;
		Value.yz=Yz1+ABy;
		result.push_back(Value);
		Value.Typ=1;
		Value.xq=Xz1+ABx;
		Value.yq=Yz1+ABy;
		Value.xz=Xz1+AC1x;
		Value.yz=Yz1+AC1y;
		result.push_back(Value);
		Value.Typ=1;
		Value.xq=Xz1+AC1x;
		Value.yq=Yz1+AC1y;
		Value.xz=Xz1+AC2x;
		Value.yz=Yz1+AC2y;
		result.push_back(Value);
		LineComp(Xq2,Yq2,Xz2,Yz2,rc,RadialComp,lrxq,lryq,lrxz,lryz);
		Value.xq=Xz1+AC2x;
		Value.yq=Yz1+AC2y;
		Value.xz=lrxz;
		Value.yz=lryz;
		result.push_back(Value);
	}
}
void GNode::CL1Radius(double Angle1,double Angle2,float rc,const int &RadialComp,
			          float &ABx,float &ABy,float &AC1x,float &AC1y)
{
	rc=fabs(rc);
	Angle1=Angle1*pi/180;
	Angle2=Angle2*pi/180;
	if (RadialComp==1)
		rc=rc*(-1);
	ABx=float(rc*sin(Angle1));
	ABy=float(-rc*cos(Angle1));
	AC1x=float(rc*(sin(Angle1)+sin(Angle2))/(1+cos(Angle2-Angle1)));
	AC1y=float(rc*(-cos(Angle1)-cos(Angle2))/(1+cos(Angle2-Angle1)));
}
void GNode::CL2Radius(double Angle1,double Angle2,float rc,const int &RadialComp,
			          float &ABx,float &ABy,float &AC1x,float &AC1y,float &AC2x,float &AC2y)
{
	rc=fabs(rc);
	Angle1=Angle1*pi/180;
	Angle2=Angle2*pi/180;
	if (RadialComp==1)
	{
		ABx=float(-rc*sin(Angle1));
		ABy=float(rc*cos(Angle1));
		AC1x=float(rc*(cos(Angle1)-sin(Angle1)));
		AC1y=float(rc*(cos(Angle1)+sin(Angle1)));
		AC2x=float(rc*(-sin(Angle2)-cos(Angle2)));
		AC2y=float(rc*(-sin(Angle2)+cos(Angle2)));
	}
	else if (RadialComp==2) 
	{
		ABx=float(rc*sin(Angle1));
		ABy=float(-rc*cos(Angle1));
		AC1x=float(rc*(sin(Angle1)+cos(Angle1)));
		AC1y=float(rc*(sin(Angle1)-cos(Angle1)));
		AC2x=float(rc*(sin(Angle2)-cos(Angle2)));
		AC2y=float(rc*(-sin(Angle2)-cos(Angle2)));
	}
}
void GNode::JC1JC2(const float &xc1,const float &yc1,float r1,
				   const float &xc2,const float &yc2,float r2,
				   float &x1,float &y1,float &x2,float &y2)
{
	double D,a,b,c,xc,yc;
	float y11,y12,y21,y22;
	x1=0;y1=0;x2=0;y2=0;
	xc=xc2-xc1;
	yc=yc2-yc1;
	if (!(fabs(xc)<Epsilon && fabs(yc)<Epsilon))
	{
		D=r1*r1-r2*r2+xc*xc+yc*yc;
		a=4*(xc*xc+yc*yc);
		b=-4*D*xc;
		c=D*D-4*r1*r1*yc*yc;
		if ((b*b-4*a*c)>=0 && fabs(b*b-4*a*c)<Epsilon)
		{
			double E=fabs(b*b-4*a*c);
			x1=float((-b+sqrt(E))/(2*a));
			x2=float((-b-sqrt(E))/(2*a));
		}
		double E=fabs(r1*r1-x1*x1);
		y11=float(sqrt(E));
		y12=-float(sqrt(E));
		if (fabs((x1-xc)*(x1-xc)+(y11-yc)*(y11-yc)-r2*r2)<0.01)
			y1=y11;
		else
			y1=y12;
		E=fabs(r1*r1-x2*x2);
		y21=float(sqrt(E));
		y22=float(-sqrt(E));
		if (fabs((x2-xc)*(x2-xc)+(y21-yc)*(y21-yc)-r2*r2)<0.01)
			y2=y21;
		else
			y2=y22;
		x1=x1+xc1;
		y1=y1+yc1;
		x2=x2+xc1;
		y2=y2+yc1;
	}
}

void GNode::LineJC(const float &xq,const float &yq,const float &xz,const float &yz,
			       const float &Ox,const float &Oy,float r,
				   float &x1,float &y1,float &x2,float &y2)
{
	double a,b,c;
	double D,E,F;
	if (fabs(xz-xq)>0.01)
	{

⌨️ 快捷键说明

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