📄 unit1.cpp
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <math.h>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//-------------------------------------------------
char num = 0; //捕捉鼠标坐标的次数
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent *Owner): TForm(Owner){}
typedef struct
{
int x;
int y;
} CPoint;
//---------------------------------------------------------------------------
void Delay(unsigned long a)
{
while (--a != 0)
;
} // 延时函数
//void Delay (unsigned long a) { while (--a!=0); } // 延时函数
void draw_circleNR(int X0, int Y0, int X1 ,int Y1,int x,int y)
/*关键的圆插补函数*/
{
//int X=X0,Y=Y0;
int Xj = 1, Yj = 1;
int Xjold = 1, Yjold = 1;
char num = 0, n = 10, nold = 10;
char finish = 0;
char NR0 = 0; //开始时使用那个象限
//char NR1=0;//结束时使用那个象限
char NR = 0; //当前使用的象限
int Fm = 0, Fm1 = 0, Fm2 = 0, Xm = X0, Ym = Y0;
int Fm1z, Fm2z;
// Form1->Canvas->Pixels[X0+20][Y0+20]= clRed;
// Form1->Canvas->Pixels[X1+20][Y1+20]= clRed;
if ((X0 >= 0) && (Y0 >= 0) && (X0 > Y0))
//计算起使象限 //注意包含Y=0的情况
NR0 = 1;
else if ((X0 > 0) && (Y0 >= 0) && (X0 <= Y0))
//不注意包含X=0的情况
NR0 = 2;
else if ((X0 <= 0) && (Y0 >= 0) && (( - X0) < Y0))
//注意包含X=0的情况
NR0 = 3;
else if ((X0 <= 0) && (Y0 > 0) && (( - X0) >= Y0))
//不注意包含Y=0的情况
NR0 = 4;
else if ((X0 <= 0) && (Y0 <= 0) && (( - X0) > ( - Y0)))
//注意包含Y=0的情况
NR0 = 5;
else if ((X0 < 0) && (Y0 < 0) && (( - X0) <= ( - Y0)))
//注意不包含X=0的情况
NR0 = 6;
else if ((X0 >= 0) && (Y0 < 0) && (X0 < ( - Y0)))
//注意包含X=0的情况
NR0 = 7;
else if ((X0 >= 0) && (Y0 < 0) && (X0 >= ( - Y0)))
//不注意包含Y=0的情况
NR0 = 8;
/* if((X1>=0)&&(Y1>=0)) //计算结束象限
NR1=1;
else if((X1<0)&&(Y1>=0))
NR1=2;
else if((X1<0)&&(Y1<0))
NR1=3;
else if((X1>=0)&&(Y1<0))
NR1=4;
*/
//Jx=(X1-X0);
//Jy=(Y1-Y0);
NR = NR0;
do
{
switch (NR)
{
case 1:
Fm1 = Fm + 2 * Ym + 1;
Fm2 = Fm1 - 2 * Xm + 1;
if (Fm1 < 0)
Fm1z = (0-Fm1);
else
Fm1z = Fm1;
if (Fm2 < 0)
Fm2z = (0-Fm2);
else
Fm2z = Fm2;
if (Fm1z >= Fm2z)
{
Fm = Fm2;
Xm = Xm - 1;
//Jx=Jx+1;
if (Xm == Ym)
NR = 2;
Ym = Ym + 1;
//Jy=Jy-1;
if (Xm == Ym)
NR = 2;
}
else
{
Fm = Fm1;
Ym = Ym + 1;
if (Xm == Ym)
NR = 2;
//Jy=Jy-1;
}
break;
case 2:
Fm1 = Fm - 2 * Xm + 1;
Fm2 = Fm1 + 2 * Ym + 1;
if (Fm1 < 0)
Fm1z = (0-Fm1);
else
Fm1z = Fm1;
if (Fm2 < 0)
Fm2z = (0-Fm2);
else
Fm2z = Fm2;
if (Fm1z >= Fm2z)
{
Fm = Fm2;
Xm = Xm - 1;
//Jx=Jx+1;
if (Xm == 0)
NR = 3;
Ym = Ym + 1;
//Jy=Jy-1;
if (Xm == 0)
NR = 3;
}
else
{
Fm = Fm1;
Xm = Xm - 1;
//Jx=Jx+1;
if (Xm == 0)
NR = 3;
}
break;
case 3:
Fm1 = Fm + 2 *( - Xm) + 1;
Fm2 = Fm1 - 2 * Ym + 1;
if (Fm1 < 0)
//取绝对值
Fm1z = (0-Fm1);
else
Fm1z = Fm1;
if (Fm2 < 0)
Fm2z = (0-Fm2);
else
Fm2z = Fm2;
if (Fm1z >= Fm2z)
{
Fm = Fm2;
Xm = Xm - 1;
//Jx=Jx+1;
if ((Ym + Xm) == 0)
NR = 4;
Ym = Ym - 1;
//Jy=Jy+1;
if ((Ym + Xm) == 0)
NR = 4;
}
else
{
Fm = Fm1;
Xm = Xm - 1;
//Jx=Jx+1;
if ((Ym + Xm) == 0)
NR = 4;
}
break;
case 4:
Fm1 = Fm - 2 * Ym + 1;
Fm2 = Fm1 + 2 *( - Xm) + 1;
if (Fm1 < 0)
//取绝对值
Fm1z = (0-Fm1);
else
Fm1z = Fm1;
if (Fm2 < 0)
Fm2z = (0-Fm2);
else
Fm2z = Fm2;
if (Fm1z >= Fm2z)
{
Fm = Fm2;
Xm = Xm - 1;
//Jx=Jx+1;
if (Ym == 0)
NR = 5;
Ym = Ym - 1;
//Jy=Jy+1;
if (Ym == 0)
NR = 5;
}
else
{
Fm = Fm1;
Ym = Ym - 1;
//Jy=Jy+1;
if (Ym == 0)
NR = 5;
}
break;
case 5:
Fm1 = Fm + 2 *( - Ym) + 1;
Fm2 = Fm1 - 2 *( - Xm) + 1;
if (Fm1 < 0)
//取绝对值
Fm1z = (0-Fm1);
else
Fm1z = Fm1;
if (Fm2 < 0)
Fm2z = (0-Fm2);
else
Fm2z = Fm2;
if (Fm1z >= Fm2z)
{
Fm = Fm2;
Xm = Xm + 1;
//Jx=Jx-1;
if ((Ym - Xm) == 0)
NR = 6;
Ym = Ym - 1;
//Jy=Jy+1;
if ((Ym - Xm) == 0)
NR = 6;
}
else
{
Fm = Fm1;
Ym = Ym - 1;
//Jy=Jy+1;
if ((Ym - Xm) == 0)
NR = 6;
}
break;
case 6:
Fm1 = Fm - 2 *( - Xm) + 1;
Fm2 = Fm1 + 2 *( - Ym) + 1;
if (Fm1 < 0)
//取绝对值
Fm1z = (0-Fm1);
else
Fm1z = Fm1;
if (Fm2 < 0)
Fm2z = (0-Fm2);
else
Fm2z = Fm2;
if (Fm1z >= Fm2z)
{
Fm = Fm2;
Xm = Xm + 1;
//Jx=Jx-1;
if (Xm == 0)
NR = 7;
Ym = Ym - 1;
//Jy=Jy+1;
if (Xm == 0)
NR = 7;
}
else
{
Fm = Fm1;
Xm = Xm + 1;
//Jx=Jx-1;
if (Xm == 0)
NR = 7;
}
break;
case 7:
Fm1 = Fm + 2 * Xm + 1;
Fm2 = Fm1 - 2 *( - Ym) + 1;
if (Fm1 < 0)
//取绝对值
Fm1z = (0-Fm1);
else
Fm1z = Fm1;
if (Fm2 < 0)
Fm2z = (0-Fm2);
else
Fm2z = Fm2;
if (Fm1z >= Fm2z)
{
Fm = Fm2;
Xm = Xm + 1;
//Jx=Jx-1;
if ((Xm + Ym) == 0)
NR = 8;
Ym = Ym + 1;
//Jy=Jy-1;
if ((Xm + Ym) == 0)
NR = 8;
}
else
{
Fm = Fm1;
Xm = Xm + 1;
//Jx=Jx-1;
if ((Xm + Ym) == 0)
NR = 8;
}
break;
case 8:
Fm1 = Fm - 2 *( - Ym) + 1;
Fm2 = Fm1 + 2 * Xm + 1;
if (Fm1 < 0)
//取绝对值
Fm1z = (0-Fm1);
else
Fm1z = Fm1;
if (Fm2 < 0)
Fm2z = (0-Fm2);
else
Fm2z = Fm2;
if (Fm1z >= Fm2z)
{
Fm = Fm2;
Xm = Xm + 1;
//Jx=Jx-1;
if (Ym == 0)
NR = 1;
Ym = Ym + 1;
//Jy=Jy-1;
if (Ym == 0)
NR = 1;
}
else
{
Fm = Fm1;
Ym = Ym + 1;
//Jy=Jy-1;
if (Ym == 0)
NR = 1;
}
break;
}
if (num < 10)
//前10次不计算
num++;
else
{
if (((Xm - X1) >= 0))
//取绝对值
Xj = Xm - X1;
if (((X1 - Xm) >= 0))
Xj = X1 - Xm;
if (((Ym - Y1) >= 0))
//取绝对值
Yj = Ym - Y1;
if (((Y1 - Ym) >= 0))
Yj = Y1 - Ym;
if ((Yj <= 5) && (Xj <= 5))
{
if ((Yj == 0) && (Xj == 0))
finish = 1;
else
{
nold = n;
n = Xj + Yj;
if (nold < n)
finish = 2;
}
}
}
if (finish < 2)
{
Delay(544000);
Form1->Canvas->Pixels[Xm + 200+x][Ym + 200+y] = clRed;
}
} //while((Jx!=0)||(Jy!=0)) ;
while (finish == 0);
}
void draw_circleSR(int X0, int Y0, int X1 ,int Y1,int x,int y)
/*关键的圆插补函数*/
{
//int X=X0,Y=Y0;
int Xj = 1, Yj = 1;
int Xjold = 1, Yjold = 1;
char num = 0, n = 10, nold = 10;
char finish = 0;
char SR0 = 0; //开始时使用那个象限
//char NR1=0;//结束时使用那个象限
char SR = 0; //当前使用的象限
int Fm = 0, Fm1 = 0, Fm2 = 0, Xm = X0, Ym = Y0;
int Fm1z, Fm2z;
// Form1->Canvas->Pixels[X0+20][Y0+20]= clRed;
// Form1->Canvas->Pixels[X1+20][Y1+20]= clRed;
if ((X0 >= 0) && (Y0 > 0) && (X0 >= Y0))
//计算起使象限 //注意不包含Y=0的情况
SR0 = 1;
else if ((X0 >= 0) && (Y0 >= 0) && (X0 < Y0))
//注意包含X=0的情况
SR0 = 2;
else if ((X0 < 0) && (Y0 >= 0) && (( - X0) <= Y0))
//注意不包含X=0的情况
SR0 = 3;
else if ((X0 <= 0) && (Y0 >= 0) && (( - X0) > Y0))
//注意包含Y=0的情况
SR0 = 4;
else if ((X0 <= 0) && (Y0 < 0) && (( - X0) >= ( - Y0)))
//注意不包含Y=0的情况
SR0 = 5;
else if ((X0 <= 0) && (Y0 < 0) && (( - X0) < ( - Y0)))
//注意包含X=0的情况
SR0 = 6;
else if ((X0 > 0) && (Y0 < 0) && (X0 <= ( - Y0)))
//注意不包含X=0的情况
SR0 = 7;
else if ((X0 >= 0) && (Y0 <= 0) && (X0 > ( - Y0)))
//注意包含Y=0的情况
SR0 = 8;
/* if((X1>=0)&&(Y1>=0)) //计算结束象限
NR1=1;
else if((X1<0)&&(Y1>=0))
NR1=2;
else if((X1<0)&&(Y1<0))
NR1=3;
else if((X1>=0)&&(Y1<0))
NR1=4;
*/
SR = SR0;
do
{
switch (SR)
{
case 8:
Fm1 = Fm + 2 *( - Ym) + 1;
Fm2 = Fm1 - 2 * Xm + 1;
if (Fm1 < 0)
Fm1z = (0-Fm1);
else
Fm1z = Fm1;
if (Fm2 < 0)
Fm2z = (0-Fm2);
else
Fm2z = Fm2;
if (Fm1z >= Fm2z)
{
Fm = Fm2;
Xm = Xm - 1;
//Jx=Jx+1;
if (Xm == ( - Ym))
SR = 7;
Ym = Ym - 1;
//Jy=Jy-1;
if (Xm == ( - Ym))
SR = 7;
}
else
{
Fm = Fm1;
Ym = Ym - 1;
if (Xm == ( - Ym))
SR = 7;
//Jy=Jy-1;
}
break;
case 7:
Fm1 = Fm - 2 * Xm + 1;
Fm2 = Fm1 + 2 *( - Ym) + 1;
if (Fm1 < 0)
Fm1z = (0-Fm1);
else
Fm1z = Fm1;
if (Fm2 < 0)
Fm2z = (0-Fm2);
else
Fm2z = Fm2;
if (Fm1z >= Fm2z)
{
Fm = Fm2;
Xm = Xm - 1;
//Jx=Jx+1;
if (Xm == 0)
SR = 6;
Ym = Ym - 1;
//Jy=Jy-1;
//if(Xm==0)
// SR=6;
}
else
{
Fm = Fm1;
Xm = Xm - 1;
//Jx=Jx+1;
if (Xm == 0)
SR = 6;
}
break;
case 6:
Fm1 = Fm + 2 *( - Xm) + 1;
Fm2 = Fm1 - 2 *( - Ym) + 1;
if (Fm1 < 0)
//取绝对值
Fm1z = (0-Fm1);
else
Fm1z = Fm1;
if (Fm2 < 0)
Fm2z = (0-Fm2);
else
Fm2z = Fm2;
if (Fm1z >= Fm2z)
{
Fm = Fm2;
Xm = Xm - 1;
//Jx=Jx+1;
if ((Ym - Xm) == 0)
SR = 5;
Ym = Ym + 1;
//Jy=Jy+1;
if ((Ym - Xm) == 0)
SR = 5;
}
else
{
Fm = Fm1;
Xm = Xm - 1;
//Jx=Jx+1;
if ((Ym - Xm) == 0)
SR = 5;
}
break;
case 5:
Fm1 = Fm - 2 *( - Ym) + 1;
Fm2 = Fm1 + 2 *( - Xm) + 1;
if (Fm1 < 0)
//取绝对值
Fm1z = (0-Fm1);
else
Fm1z = Fm1;
if (Fm2 < 0)
Fm2z = (0-Fm2);
else
Fm2z = Fm2;
if (Fm1z >= Fm2z)
{
Fm = Fm2;
Xm = Xm - 1;
//Jx=Jx+1;
if (Ym == 0)
SR = 4;
Ym = Ym + 1;
//Jy=Jy+1;
//if(Ym==0)
// SR=5;
}
else
{
Fm = Fm1;
Ym = Ym + 1;
//Jy=Jy+1;
if (Ym == 0)
SR = 4;
}
break;
case 4:
Fm1 = Fm + 2 * Ym + 1;
Fm2 = Fm1 - 2 *( - Xm) + 1;
if (Fm1 < 0)
//取绝对值
Fm1z = (0-Fm1);
else
Fm1z = Fm1;
if (Fm2 < 0)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -