📄 gnode.h
字号:
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 + -