📄 dxf_curvehandle.cpp
字号:
#include "StdAfx.h"
#include "math.h"
float x,y,r,angle1,angle2,angle;
float factor;
unsigned int sign;
double pi=3.1415926/180;
double *spX;
double *spY;
int sptNum;
CString spstrFlag="start";
double spdbFlag=0;
int spintFlag=0;
int spintFlag_1;
int VG_Init(unsigned int* Data,int spCtrl=0,double *splineX=NULL,double *splineY=NULL)
{
if(Data[0]==0x00060002)
{
sign=Data[1];
x=*((float *)(&Data[2]));
y=*((float *)(&Data[3]));
angle1=*((float *)(&Data[4]));
angle2=*((float *)(&Data[5]));
r=*((float *)(&Data[6]));
angle=angle1;
return 0;
}
if(Data[0]==0x00090001)
{
sign=Data[1];
sptNum=spCtrl;
spintFlag_1=spCtrl-1;
spX=new double [sptNum];
spY=new double [sptNum];
for(int i=0;i<=sptNum-1;i++)
{
spX[i]=splineX[i];
spY[i]=splineY[i];
}
return 0;
}
else return 1;
}
int VG_SetPrecision(int SectionNum)
{
factor=(float)(fabs(angle1-angle2)/SectionNum);
return 0;
}
int VG_CurveHandle(float * Datas)
{
float x0,y0;
if(sign==0x00000003)//逆
{
if(angle1<angle2)
{
if(angle<=angle2)
{
x0=(float)(x+r*cos(angle*pi));
y0=(float)(y+r*sin(angle*pi));
Datas[0]=x0;
Datas[1]=y0;
angle+=factor;
if(angle<angle2)
return 1;
else return 0;
}
else return 0;
}
if(angle1>angle2)
{
if(-(360-angle)<=angle2)
{
x0=(float)(x+r*cos(-(360-angle)*pi));
y0=(float)(y+r*sin(-(360-angle)*pi));
Datas[0]=x0;
Datas[1]=y0;
angle+=factor;
if(-(360-angle)<angle2)
return 1;
else return 0;
}
else return 0;
}
else return -1;
}
if(sign==0x00000001)//顺
{
if(angle1<angle2)
{
if(angle>=-(360-angle2))
{
x0=(float)(x+r*cos(angle*pi));
y0=(float)(y+r*sin(angle*pi));
Datas[0]=x0;
Datas[1]=y0;
angle-=factor;
if(angle>-(360-angle2))
return 1;
else return 0;
}
else return 0;
}
if(angle1>angle2)
{
if(angle>=angle2)
{
x0=(float)(x+r*cos(angle*pi));
y0=(float)(y+r*sin(angle*pi));
Datas[0]=x0;
Datas[1]=y0;
angle-=factor;
if(angle>angle2)
return 1;
else return 0;
}
else return 0;
}
else return -1;
}
else return -1;
}
double GetSPline(double K,double point1,double point2,double point3,double point4)
{
double items;
double x0,x1,x2,x3;
x0=(-K*K*K+3*K*K-3*K+1)*point1/6;
x1=(3*K*K*K-6*K*K+4)*point2/6;
x2=(-3*K*K*K+3*K*K+3*K+1)*point3/6;
x3=K*K*K*point4/6;
items=x0+x1+x2+x3;
return items;
}
int VG_SpLineHandle(float * Datas)
{
if(sign==0x00000000)
{
if(spstrFlag=="start")
{
Datas[0]=(float)spX[0];
Datas[1]=(float)spY[0];
spstrFlag="doing";
return 1;
}
if(spstrFlag=="doing")
{
Datas[0]=(float)GetSPline(spdbFlag,spX[0],spX[0],spX[0],spX[1]);
Datas[1]=(float)GetSPline(spdbFlag,spY[0],spY[0],spY[0],spY[1]);
spdbFlag+=0.001;
if(spdbFlag>1)
{
spstrFlag="doing_2";
spdbFlag=0;
}
return 1;
}
if(spstrFlag=="doing_2")
{
if(sptNum>2)
{
Datas[0]=(float)GetSPline(spdbFlag,spX[0],spX[0],spX[1],spX[2]);
Datas[1]=(float)GetSPline(spdbFlag,spY[0],spY[0],spY[1],spY[2]);
spdbFlag+=0.001;
if(spdbFlag>1)
{
spstrFlag="doing_3";
spdbFlag=0;
}
return 1;
}
else
{
spstrFlag="end_1";
spdbFlag=0;
return 1;
}
}
if(spstrFlag=="doing_3")
{
if(sptNum>3)
{
Datas[0]=(float)GetSPline(spdbFlag,spX[spintFlag],spX[spintFlag+1],spX[spintFlag+2],spX[spintFlag+3]);
Datas[1]=(float)GetSPline(spdbFlag,spY[spintFlag],spY[spintFlag+1],spY[spintFlag+2],spY[spintFlag+3]);
spdbFlag+=0.001;
if(spdbFlag>1)
{
spintFlag++;
spdbFlag=0;
}
if(spintFlag+3>sptNum-1)
{
spstrFlag="end";
spdbFlag=0;
spintFlag=0;
}
return 1;
}
}
if(spstrFlag=="end")
{
if(sptNum>2)
{
Datas[0]=(float)GetSPline(spdbFlag,spX[sptNum-3],spX[sptNum-2],spX[sptNum-1],spX[sptNum-1]);
Datas[1]=(float)GetSPline(spdbFlag,spY[sptNum-3],spY[sptNum-2],spY[sptNum-1],spY[sptNum-1]);
spdbFlag+=0.001;
if(spdbFlag>1)
{
spstrFlag="end_1";
spdbFlag=0;
}
return 1;
}
else
{
spstrFlag="end_1";
spdbFlag=0;
return 1;
}
}
if(spstrFlag=="end_1")
{
Datas[0]=(float)GetSPline(spdbFlag,spX[sptNum-2],spX[sptNum-1],spX[sptNum-1],spX[sptNum-1]);
Datas[1]=(float)GetSPline(spdbFlag,spY[sptNum-2],spY[sptNum-1],spY[sptNum-1],spY[sptNum-1]);
spdbFlag+=0.001;
if(spdbFlag>1)
{
spstrFlag="stop";
spdbFlag=0;
}
return 1;
}
if(spstrFlag=="stop")
{
Datas[0]=(float)spX[sptNum-1];
Datas[1]=(float)spY[sptNum-1];
spstrFlag="start";
return 0;
}
else return 0;
}
/////////////////////////////////////////////////////////////////////////////
if(sign==0x00000001)
{
if(spstrFlag=="start")
{
Datas[0]=(float)spX[sptNum-1];
Datas[1]=(float)spY[sptNum-1];
spstrFlag="doing";
return 1;
}
if(spstrFlag=="doing")
{
Datas[0]=(float)GetSPline(spdbFlag,spX[sptNum-1],spX[sptNum-1],spX[sptNum-1],spX[sptNum-2]);
Datas[1]=(float)GetSPline(spdbFlag,spY[sptNum-1],spY[sptNum-1],spY[sptNum-1],spY[sptNum-2]);
spdbFlag+=0.001;
if(spdbFlag>1)
{
spstrFlag="doing_2";
spdbFlag=0;
}
return 1;
}
if(spstrFlag=="doing_2")
{
if(sptNum>2)
{
Datas[0]=(float)GetSPline(spdbFlag,spX[sptNum-1],spX[sptNum-1],spX[sptNum-2],spX[sptNum-3]);
Datas[1]=(float)GetSPline(spdbFlag,spY[sptNum-1],spY[sptNum-1],spY[sptNum-2],spY[sptNum-3]);
spdbFlag+=0.001;
if(spdbFlag>1)
{
spstrFlag="doing_3";
spdbFlag=0;
}
return 1;
}
else
{
spstrFlag="end_1";
spdbFlag=0;
return 1;
}
}
if(spstrFlag=="doing_3")
{
if(sptNum>3)
{
Datas[0]=(float)GetSPline(spdbFlag,spX[spintFlag_1],spX[spintFlag_1-1],spX[spintFlag_1-2],spX[spintFlag_1-3]);
Datas[1]=(float)GetSPline(spdbFlag,spY[spintFlag_1],spY[spintFlag_1-1],spY[spintFlag_1-2],spY[spintFlag_1-3]);
spdbFlag+=0.001;
if(spdbFlag>1)
{
spintFlag_1--;
spdbFlag=0;
}
if(spintFlag_1-3<0)
{
spstrFlag="end";
spdbFlag=0;
spintFlag_1=sptNum-1;
}
return 1;
}
}
if(spstrFlag=="end")
{
if(sptNum>2)
{
Datas[0]=(float)GetSPline(spdbFlag,spX[2],spX[1],spX[0],spX[0]);
Datas[1]=(float)GetSPline(spdbFlag,spY[2],spY[1],spY[0],spY[0]);
spdbFlag+=0.001;
if(spdbFlag>1)
{
spstrFlag="end_1";
spdbFlag=0;
}
return 1;
}
else
{
spstrFlag="end_1";
spdbFlag=0;
return 1;
}
}
if(spstrFlag=="end_1")
{
Datas[0]=(float)GetSPline(spdbFlag,spX[1],spX[0],spX[0],spX[0]);
Datas[1]=(float)GetSPline(spdbFlag,spY[1],spY[0],spY[0],spY[0]);
spdbFlag+=0.001;
if(spdbFlag>1)
{
spstrFlag="stop";
spdbFlag=0;
}
return 1;
}
if(spstrFlag=="stop")
{
Datas[0]=(float)spX[0];
Datas[1]=(float)spY[0];
spstrFlag="start";
return 0;
}
else return 0;
}
/////////////////////////////////////////////////////////////////////////////
else return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -