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

📄 unit1.cpp

📁 三点定圆圆弧插补的源程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//---------------------------------------------------------------------------

#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 + -