您现在的位置:

逐点比较法插补c语言程序源代码

   #include "conio.h"

   #include "graphics.h"

   #include "process.h"

   #define  Ni_circle 0

   #define  Shun_circle 1

   void init_graph();

   void draw_Base_circle();

   void draw_cabu_circle();

   void close_graph();

   void acrroods();

   static float x0,y0;

   void line_cabu(), draw_line(),draw_line_cabu();

   void line_cabu()        /*此函数控制直线插步两次*/

     {

          int i;

         init_graph();

         sleep(1);

      for(i=0;i<2;i++)

      {

         line(0,120,300,120); outtextxy(310,120,"Z");

         line(100,10,100,300); outtextxy(110,300,"X");

         outtextxy(90,130,"O");

         draw_line();

         if(i==0)

               draw_line_cabu(6);

         else  draw_line_cabu(2);

         gotoxy(50,5);

         getch();

         cleardevice();

         setcolor(WHITE);

      }

   }

   void draw_line()/*画直线*/

   {

     line(100,120,600,450);

      textcolor(YELLOW);

      directvideo=0;

     gotoxy(45,5);  cprintf("Line from:X0   Y0 Z0 ");

     gotoxy(45,6);  cprintf("Line to  :X500 Y0 Z330");

     gotoxy(45,7);  cprintf("Units    :Pixel");

     gotoxy(45,8);  cprintf("Line  now:");

   }

   void draw_line_cabu(int step)/*关键的直线插补函数*/

    {

      int Xe=600,Ye=450;

      float Fm,Xm=100,Ym=120;

      setcolor(RED);

      moveto(Xm,Ym);

      while(Xm<=Xe&&Ym<=Ye)

           {

               Fm=(Ym-120)*(Xe-100)-(Xm-100)*(Ye-120);

               if(Fm>=0)

                        Xm=Xm+step;

               else

                        Ym=Ym+step;

                lineto(Xm,Ym);

                gotoxy(55,8);  printf("X%3.0f   Y0  Z%3.0f",Xm-100,Ym-120);

                delay(1100);

            }

     }

     /* 圆插补部分的函数区*/

    void init_graph()            /*图形系统初始化*/

   {

      int gdrive=DETECT,gmode;

      initgraph(&gdrive,&gmode,"");

      cleardevice();

   }

   void acrroods()               /*屏幕中心坐标*/

    {

       x0=getmaxx()/2;

       y0=getmaxy()/2;

    }

   void draw_Base_circle()         /*画圆及写参数*/

   {

          line(x0-200,y0,x0+200,y0); outtextxy(x0+220,y0,"Z");

          line(x0,y0-180,x0,y0+180); outtextxy(x0+10,y0+180,"X");

          outtextxy(x0-10,y0+10,"O");

          circle(x0,y0,150);

          textcolor(YELLOW);

          directvideo=0;

          gotoxy(46,2);cprintf("Circle start:X0 Y0 Z150");

          gotoxy(46,3);cprintf("Circle end  :X0 Y0 Z150");

          gotoxy(46,4);cprintf("Units       :Pixel");

          gotoxy(46,5);cprintf("Circle now:");

   }

    void close_graph()             /*关图形系统*/

   {

     closegraph();

   }

   void draw_cabu_circle(int sstep,int Directory)/*关键的圆插补函数*/

   {

     int flag=0;

     float Fm,Xm,Ym;

     Xm=x0+150; Ym=y0;

     moveto(Xm,Ym);

     setcolor(RED);

     while(1)   /*分象限,顺圆和逆圆讨论*/

     {

         Fm=(Xm-x0)*(Xm-x0)+(Ym-y0)*(Ym-y0)-150*150;/*圆判断公式*/

           if(Fm>=0){

              if(!Directory){  /*逆圆判断*/

                   if(Xm>=x0&&Ym<=y0)

                       {

                          if(flag)    break;   /*if语句判断象限,以下一样*/

                            else       Xm=Xm-sstep;

                        }

                    if(Xm<=x0&&Ym<=y0)

                        {

                          flag=1;      Ym=Ym+sstep;

                        }

                     if(Xm<=x0&&Ym>=y0)

                                          Xm=Xm+sstep;

                     if(Xm>=x0&&Ym>=y0)

                                          Ym=Ym-sstep;

                                  }

             else  {                    /*it is Directory's else*/

                      if(Xm>x0&&Ym<y0)

                                        Ym=Ym+sstep;

                     if(Xm<=x0&&Ym<=y0)

                                         Xm=Xm+sstep;

                     if(Xm<x0&&Ym>y0) {

                            flag=1;     Ym=Ym-sstep;}

                     if(Xm>=x0&&Ym>=y0) {

                             if(flag)  break;

                                          Xm=Xm-sstep;}

                      }

               }

           else{        /*it is Fm's else*/

                if(!Directory) {

                     if(Xm>x0&&Ym<y0)

                       {

                          if(flag)    break;

                            else       Ym=Ym-sstep;

                        }

                    if(Xm<=x0&&Ym<=y0)

                        {

                          flag=1;      Xm=Xm-sstep;

                        }

                     if(Xm<=x0&&Ym>=y0)

                                          Ym=Ym+sstep;

                     if(Xm>=x0&&Ym>=y0)

                                          Xm=Xm+sstep;

                                      }

                else{

                      if(Xm>x0&&Ym<y0)

                                        Xm=Xm+sstep;

                    if(Xm<=x0&&Ym<=y0)

                                         Ym=Ym-sstep;

                     if(Xm<=x0&&Ym>=y0){

                            flag=1;           Xm=Xm-sstep;}

                     if(Xm>=x0&&Ym>=y0) {

                             if(flag)  break;

                                else      Ym=Ym+sstep;}

                   }

             }

           lineto(Xm,Ym);

           gotoxy(58,5); printf("X%3.0f Y0 Z%3.0f     ",Ym-y0,Xm-x0);

           delay(800);

         }

     }

     void circle_demo(int Directory)    /*控制圆插补两次*/

   {

     int i=0,sstep;

     init_graph();

     sleep(2);

     acrroods(&x0,&y0);

     for(i=0;i<2;i++)

     {

      draw_Base_circle(150);

       if(i==0){

            sstep=6;

            draw_cabu_circle(sstep,Directory);}

       else{

               sstep=1;

            draw_cabu_circle(sstep,Directory);}

       getch();

       cleardevice();

       setcolor(WHITE);

     }

   }

 /* 圆插补部分的函数区结束*/

 main()/*主函数负责写封面和函数调用*/

   {

     int choice=0;

     init_graph();

  while(choice!=4)

    {

           setfillstyle(1,RED);

           bar(200,30,400,80);

           setcolor(GREEN);

           settextstyle(3,0,10);

           outtextxy(220,50,"DEMO PROGRAM BY P.Y.F");

           setcolor(WHITE);

           settextstyle(0,0,1);

           outtextxy(200,120,"1. Line demo.");

           outtextxy(200,140,"2. Shun_Circle  demo.");

           outtextxy(200,160,"3. Ni_Circle  demo.");

           outtextxy(200,180,"4. Quit the program.");

           outtextxy(160,200,"Please enter your choice:");   gotoxy(46,13);

           scanf("%d",&choice);

    switch(choice)

          {

            case 1:  line_cabu();break;

            case 2:  circle_demo(Ni_circle);break;

            case 3:  circle_demo(Shun_circle);break;

            case 4:  break;

            default: printf("\nChoice wrong,try again!");

          }

    }

    close_graph();

   }