chabu.c

来自「一个关于指向插补和曲线插补的程序」· C语言 代码 · 共 495 行

C
495
字号
#include "conio.h"

   #include "graphics.h"

   #include "process.h"

   #include "time.h"

   #include "stdio.h"

   #include "stdlib.h"



#include <alloc.h>
#include <math.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();
   void flash();

   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,200,500,200); outtextxy(510,200,"Z");

         line(200,10,200,450); outtextxy(210,450,"X");

         outtextxy(190,220,"O");

         draw_line();

         if(i==0)


               draw_line_cabu(16);  /*步长为16*/

         else  draw_line_cabu(8);   /*步长为8*/


         gotoxy(50,5);

         getch();

         cleardevice();

         setcolor(WHITE);

      }

   }

   void draw_line()/*画原始直线*/

   {

     line(200,200,500,350);

      textcolor(GREEN);

      directvideo=0;

     gotoxy(44,2);  cprintf("Line from:X0   Y0 Z0 ");

     gotoxy(44,3);  cprintf("Line to  :X300 Y0 Z150");

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

     gotoxy(44,5);  cprintf("Line  now:");

     gotoxy(44,6);  cprintf("Time Used:") ;

     gotoxy(60,6);  cprintf("ms") ;
   }

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

    {

      int Xe=500,Ye=350;

       int start,stop;
       int   time;

      float Fm,Xm=200,Ym=200;

      setcolor(RED);

      setlinestyle(0,0,2);

      moveto(Xm,Ym);

      start = clock( );


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

           {

               Fm=(Ym-200)*(Xe-200)-(Xm-200)*(Ye-200);

               if(Fm>=0)

                        Xm=Xm+step;

               else

                        Ym=Ym+step;

                lineto(Xm,Ym);

                gotoxy(54,5);  printf("X:%3.0f Y0 Z:%3.0f",Xm-200,Ym-200);

                delay(50000000);



            }   start = clock( );
            time = ((double) (stop - start));
                  gotoxy(54,6);printf("%d",time) ;

     }





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



    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(GREEN);

          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(50000000);

         }

     }

     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=16;

            draw_cabu_circle(sstep,Directory);}

       else{

               sstep=8;

            draw_cabu_circle(sstep,Directory);}

       getch();

       cleardevice();

       setcolor(WHITE);

     }

   }

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



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

   {
     void * ptr;
int gd=DETECT,gm,choice=0;
float i;




     init_graph();

  while(choice!=4)

    {

           setfillstyle(1,GREEN);

           bar(200,30,440,200);

           setcolor(RED);

           settextstyle(3,0,10);

           outtextxy(220,50,"DEMO PROGRAM BY TangPeng");

           outtextxy(240,100," CLASS: Auto0606");

           outtextxy(240,120," NO.  : 0901060612");

           outtextxy(240,140," NAME : TANGPENG");

           outtextxy(240,160," TIME : 2009.4.10");
           setcolor(WHITE);

           settextstyle(0,0,1);

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

           outtextxy(200,240,"2. Clockwise  demo.");

           outtextxy(200,260,"3. Unclockwise  demo.");

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

           outtextxy(160,300,"Please enter your choice:");   gotoxy(47,20);

           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!");


          }

    } initgraph(&gd,&gm,"d:\\tc");
setactivepage(1);
setcolor(RED);
setfillstyle(1,14);
fillellipse(10,10,10,10);
ptr=malloc(imagesize(0,0,20,20));
getimage(0,0,20,20,ptr);
randomize();
setactivepage(0);
for(i=0;i<3000;i++)
putpixel(random(640),random(480),random(15));
for(i=0;i<6.28*4;i=i+0.005)
{putimage(300+8*(cos(i)+i*sin(i)),240+6*(sin(i)-i*cos(i)),ptr,COPY_PUT);
putimage(300+8*(cos(i)+(i)*sin(i)),240+6*(sin(i)-(i)*cos(i)),ptr,COPY_PUT);
if(kbhit()) break;
delay(10);
}

    close_graph();

   }

⌨️ 快捷键说明

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