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

📄 unit1.cpp

📁 三点定圆圆弧插补的源程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
          Fm2z = (0-Fm2);
        else
          Fm2z = Fm2;
        if (Fm1z >= Fm2z)
        {
          Fm = Fm2;
          Xm = Xm + 1;
          //Jx=Jx-1;
          if ((Ym + Xm) == 0)
            SR = 3;
          Ym = Ym + 1;
          //Jy=Jy+1;
          if ((Ym + Xm) == 0)
            SR = 3;
        }
        else
        {
          Fm = Fm1;
          Ym = Ym + 1;
          //Jy=Jy+1;
          if ((Ym + Xm) == 0)
            SR = 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 (Xm == 0)
            SR = 2;
          Ym = Ym + 1;
          //Jy=Jy+1;
          //if(Xm==0)
          //	SR=7;
        }
        else
        {
          Fm = Fm1;
          Xm = Xm + 1;
          //Jx=Jx-1;
          if (Xm == 0)
            SR = 2;
        }
        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 - Ym) == 0)
            SR = 1;
          Ym = Ym - 1;
          //Jy=Jy-1;
          if ((Xm - Ym) == 0)
            SR = 1;
        }
        else
        {
          Fm = Fm1;
          Xm = Xm + 1;
          //Jx=Jx-1;
          if ((Xm - Ym) == 0)
            SR = 1;
        }
        break;
      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 (Ym == 0)
            SR = 8;
          Ym = Ym - 1;
          //Jy=Jy-1;
          //if(Ym==0)
          //	SR=8;
        }
        else
        {
          Fm = Fm1;
          Ym = Ym - 1;
          //Jy=Jy-1;
          if (Ym == 0)
            SR = 8;
        }
        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);
}

CPoint returncore(CPoint first, CPoint second, CPoint third) //返回园心
{
   //int   x1,x2,y1,y2,x3,y3;
  //double   x   =   0;
  // double   y   =   0;

  CPoint p;

  int x1, y1, x3, y3;
  double a, b, c, d, e, f;
  double r, k1, k2, x, y, x2, y2;

  x1 = first.x;
  y1 = first.y;
  x2 = second.x;
  y2 = second.y;
  x3 = third.x;
  y3 = third.y;
  //cout<<"请输入x1,y1,x2,y2,x3,y3"<<endl;
  //cin>>x1>>y1>>x2>>y2>>x3>>y3;
  if ((y1 == y2) && (y2 == y3))
  {
    Application->MessageBox("三点不构成圆!", "Look", MB_OK);

    Application->MessageBox("三点不构成圆!", "Look", MB_OK);
    return first;
  }
  if ((y1 != y2) && (y2 != y3))
  {
    k1 = (x2 - x1) / (y2 - y1);
    k2 = (x3 - x2) / (y3 - y2);
  }
  if (k1 == k2)
  {
    Application->MessageBox("三点不构成圆!", "Look", MB_OK);
    return first;
  }
  a = 2 *(x2 - x1);
  b = 2 *(y2 - y1);
  c = x2 * x2 + y2 * y2 - x1 * x1 - y1 * y1;
  d = 2 *(x3 - x2);
  e = 2 *(y3 - y2);
  f = x3 * x3 + y3 * y3 - x2 * x2 - y2 * y2;
  x = (b *f - e * c) / (b *d - e * a);
  y = (d *c - a * f) / (b *d - e * a);
  // cout<<"圆心为("<<x<<","<<y<<")"<<endl;
 // r = sqrt((x - x1)*(x - x1) + (y - y1)*(y - y1));
  // cout<<"半径为"<<r<<endl;

  p.x = x;
  p.y = y;

  return p;

   




  /*
   x1=first.x;
   y1=first.y;
   x2=second.x;
   y2=second.y;
   x3=third.x;
   y3=third.y;


  CPoint core;
  core.x=((-x2*x2*y1)+y1*y1*y2+x1*x1*y2-y1*y2*y2)/(2*x1*y2-2*x2*y1)+first.x;
  core.x  =((y3- y1)* (y2* y2-y1*y1+x2*x2-x1*x1)+(y2-y1)*(y1*y1-y3*y3+x1*x1-x3*x3))/(2*(x2-x1)*(y3-y1)-2*(x3-x1)*(y2-y1));
  core.y  =((y3- y1)* (y2* y2-y1*y1+x2*x2-x1*x1)+(y2-y1)*(y1*y1-y3*y3+x1*x1-x3*x3))/(2*(x2-x1)*(y3-y1)-2*(x3-x1)*(y2-y1));
  x=((y2-y1)*(y3*y3-y1*y1+x3*x3-x1*x1)-(y3-y1)*(y2*y2-y1*y1+x2*x2-x1*x1))/(2*(x3-x1)*(y2-y1)-2*((x2-x1)*(y3-y1)));
  y=((x2-x1)*(x3*x3-x1*x1+y3*y3-y1*y1)-(x3-x1)*(x2*x2-x1*x1+y2*y2-y1*y1))/(2*(y3-y1)*(x2-x1)-2*((y2-y1)*(x3-x1)));
  core.y=(x1*x2*x2+x1*y2*y2-x1*x1*x2-x2*y1*y1)/(2*x1*y2-2*x2*y1)+first.y;
  return core;

   */
   /*
  int   x1,x2,y1,y2;
  x1=second.x-first.x;
  y1=second.y-first.y;
  x2=third.x-first.x;
  y2=third.y-first.y;
  CPoint   core;
  core.x=((-x2*x2*y1)+y1*y1*y2+x1*x1*y2-y1*y2*y2)/(2*x1*y2-2*x2*y1)+first.x;
  core.y=(x1*x2*x2+x1*y2*y2-x1*x1*x2-x2*y1*y1)/(2*x1*y2-2*x2*y1)+first.y;
  return   core;
     */
}

unsigned int returnr(CPoint core, CPoint first) //返回半径
{
  float r;
  unsigned int i;

  r = sqrt(pow(first.x - first.x, 2) + pow(first.y - first.y, 2));
  i = (unsigned int)r;

  if ((r - i) >= 0.5)
    return r++;
  else
    return r;
}

void __fastcall TForm1::Button6Click(TObject *Sender)
{
  draw_circleSR(StrToInt(Edit1->Text), StrToInt(Edit2->Text), StrToInt(Edit3
    ->Text), StrToInt(Edit4->Text), 0, 0); /*关键的圆插补函数*/
}

//---------------------------------------------------------------------------






void __fastcall TForm1::mouseup(TObject *Sender, TMouseButton Button,
  TShiftState Shift, int X, int Y)
{
  switch (num)
  {
    case 0:
      Edit5->Text = X;
      Edit6->Text = Y;
      Form1->Canvas->Pixels[StrToInt(Edit5->Text) ][StrToInt(Edit6->Text)] = clRed;
      num++;
      break;
    case 1:
      Edit7->Text = X;
      Edit8->Text = Y;
      Form1->Canvas->Pixels[StrToInt(Edit7->Text) ][StrToInt(Edit8->Text)] = clRed;
      num++;
      break;
    case 2:
      Edit9->Text = X;
      Edit10->Text = Y;
      Form1->Canvas->Pixels[StrToInt(Edit9->Text) ][StrToInt(Edit10->Text)] = clRed;
      num++;
      break;
  }
}

//---------------------------------------------------------------------------




void __fastcall TForm1::Button1Click(TObject *Sender)
{
  draw_circleNR(StrToInt(Edit1->Text), StrToInt(Edit2->Text), StrToInt(Edit3
    ->Text), StrToInt(Edit4->Text),0,0); /*关键的圆插补函数*/
}

//---------------------------------------------------------------------------
unsigned char SRNR(int X0, int Y0, int X1, int Y1,int X2, int Y2 )
{
  //int X=X0,Y=Y0;
  char R0 = 0; //开始时使用那个象限
  char R1 = 0;
  char R2 = 0;  //结束时使用那个象限
  char SN=0;  //默认是个
  int X0Z,X1Z,X2Z;

  if (X0 < 0)
    X0Z = (0-X0);
  else
    X0Z = X0;
  if (X1 < 0)
    X1Z = (0-X1);
  else
    X1Z = X1;
  if (X2 < 0)
    X2Z = (0-X2);
  else
    X2Z = X2;

  if ((X0 >= 0) && (Y0 >= 0) )  //计算起使象限
    R0 = 1;
  else if ((X0 < 0) && (Y0 >= 0))
    R0 = 2;
  else if ((X0 < 0) && (Y0 <  0))
    R0 = 3;
  else if ((X0 >= 0) && (Y0 < 0))
    R0 = 4;

  if ((X1 >= 0) && (Y1 >= 0) )  //计算起使象限
    R1 = 1;
  else if ((X1 < 0) && (Y1 >= 0))
    R1 = 2;
  else if ((X1 < 0) && (Y1 <  0))
    R1 = 3;
  else if ((X1 >= 0) && (Y1 < 0))
    R1 = 4;

  if ((X2 >= 0) && (Y2 >= 0) )  //计算起使象限
    R2 = 1;
  else if ((X2 < 0) && (Y2 >= 0))
    R2 = 2;
  else if ((X2 < 0) && (Y2 <  0))
    R2 = 3;
  else if ((X2 >= 0) && (Y2 < 0))
    R2 = 4;
  if((R2==R1)&&(R1==R0))
  {
    if((R0==1)||(R0==3))
    {
      if(X2Z>=X0Z)
      {
        if(X1Z>=X2Z)
          SN=1;
        else
          SN=2;
      }
      else
      {
        if(X1Z>=X2Z)
          SN=1;
        else
          SN=2;
      }
        //SN=1;
    }
    else
    {


      if(X2Z>=X0Z)
      {
        if(X1Z>=X2Z)
          SN=2;
        else
          SN=1;
      }
      else
      {
        if(X1Z>=X2Z)
          SN=2;
        else
          SN=1;
      }
    }

  }
  else  if((R0==R1))
  {
    if((R0==1)||(R0==3))
    {
      if(X1Z>=X0Z)
        SN=2;
      else
        SN=1;
    }
    else
    {
      if(X1Z>=X0Z)             
        SN=1;
      else
        SN=2;
    }
  }
  else if((R1==R2))
  {
    if((R1==1)||(R1==3))
    {
      if(X2Z>=X1Z)
        SN=2;
      else
        SN=1;
    }
    else
    {
      if(X2Z>=X1Z)
        SN=1;
      else
        SN=2;
    }
  }
  else if((R0==R2))
  {
    if((R0==1)||(R0==3))
    {
      if(X2Z>=X0Z)
        SN=1;
      else
        SN=2;
    }
    else
    {
      if(X2Z>=X0Z)
        SN=2;
      else
        SN=1;
    }
  }
  //else if((R2>R1)&&(R1>R0))
    //SN=1;
  //else if((R0<R1)&&(R1<R2))
  //  SN=2;
  else if((R0==1))
  {
    if((R1<R2))
      SN=1;
    else
      SN=2;
  }
  else if((R0==2))
  {
    if((R2==1))
      SN=1;
    else if((R1==3)&&(R2==4))
      SN=1;
    else
      SN=2;
  }
  else if((R0==3))
  {
    if((R1==4))
      SN=1;
    else if((R1==1)&&(R2==2))
      SN=1;
    else
      SN=2;
  }
  else if((R0==4))
  {
    if((R2>R1))
      SN=1;
    else
      SN=2;

  }
 
   return SN;
}
void __fastcall TForm1::Button2Click(TObject *Sender)
{
  CPoint a, b, c, d;
  unsigned int n;
  unsigned char s;
  if (num == 3)
  {
    a.x = StrToInt(Edit5->Text) - 200;
    a.y = StrToInt(Edit6->Text) - 200;
    //Form1->Canvas->Pixels[a.x ][a.y] = clRed;
    b.x = StrToInt(Edit7->Text) - 200;
    b.y = StrToInt(Edit8->Text) - 200;
    //Form1->Canvas->Pixels[b.x ][b.y] = clRed;
    c.x = StrToInt(Edit9->Text - 200);
    c.y = StrToInt(Edit10->Text) - 200;
    //Form1->Canvas->Pixels[c.x ][c.y] = clRed;
    d = returncore(a, b, c);
    Edit11->Text = d.x;
    Edit12->Text = d.y;




      switch (SRNR(a.x-d.x, a.y-d.y,b.x-d.x, b.y-d.y,c.x-d.x, c.y-d.y ))
  {
    case 1:
      draw_circleNR(a.x-d.x, a.y-d.y, c.x-d.x, c.y-d.y,d.x,d.y);
    break;
    case 2:
      draw_circleSR(a.x-d.x, a.y-d.y, c.x-d.x, c.y-d.y,d.x,d.y);
    break;

  }
    //n = returnr(d, a);
    //Edit13->Text = n;
  }
  num = 0;
  //draw_circleNR(a.x,a.y,c.x,c.x,d.x,d.y);
}

//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
  CPoint a, b, c, d;
  unsigned int n;
  unsigned char s;



      Form1->Canvas->Pixels[StrToInt(Edit5->Text) ][StrToInt(Edit6->Text)] = clRed;

      Form1->Canvas->Pixels[StrToInt(Edit7->Text) ][StrToInt(Edit8->Text)] = clRed;

      Form1->Canvas->Pixels[StrToInt(Edit9->Text) ][StrToInt(Edit10->Text)] = clRed;

  //if (num == 3)
  {
    a.x = StrToInt(Edit5->Text) - 200;
    a.y = StrToInt(Edit6->Text) - 200;
    //Form1->Canvas->Pixels[a.x ][a.y] = clRed;
    b.x = StrToInt(Edit7->Text) - 200;
    b.y = StrToInt(Edit8->Text) - 200;
    //Form1->Canvas->Pixels[b.x ][b.y] = clRed;
    c.x = StrToInt(Edit9->Text - 200);
    c.y = StrToInt(Edit10->Text) - 200;
    //Form1->Canvas->Pixels[c.x ][c.y] = clRed;
    d = returncore(a, b, c);
    Edit11->Text = d.x;
    Edit12->Text = d.y;




      switch (SRNR(a.x-d.x, a.y-d.y,b.x-d.x, b.y-d.y,c.x-d.x, c.y-d.y ))
  {
    case 1:
      draw_circleNR(a.x-d.x, a.y-d.y, c.x-d.x, c.y-d.y,d.x,d.y);
    break;
    case 2:
      draw_circleSR(a.x-d.x, a.y-d.y, c.x-d.x, c.y-d.y,d.x,d.y);
    break;

  }
    //n = returnr(d, a);
    //Edit13->Text = n;
  }
 // num = 0;
  //draw_circleNR(a.x,a.y,c.x,c.x,d.x,d.y);
}
//---------------------------------------------------------------------------

⌨️ 快捷键说明

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