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

📄 cc.c

📁 计算机图形学
💻 C
字号:
#include"stdio.h";
#include"graphics.h"
#include"math.h"
#include"dos.h"
#include"time.h"


typedef struct Rect
{
  int xmin;
  int ymin;
  int xmax;
  int ymax;
}Rect;


void CopmOutCode(int x,int y,Rect * r,int *L,int *T,int *R,int *B)
{
     /*初始化*/
   *L =0;
   *T =0;
   *R =0;
   *B =0;

   if(y>r->ymax)
        *T = 1;

   if(y<r->ymin)
        *B = 1;

   if(x>r->xmax)
       *R = 1;

   if(x<r->xmin)
       *L = 1;

}

void test1(int x,int y,Rect * r,int *flag)/*测试一点是否在其内部*/
{
     int L,T,R,B;
     CopmOutCode(x,y,r,&L,&T,&R,&B);

     if(L==0&&T==0&&R==0&&B==0)
        *flag = 1;/*在内部*/
      else
        *flag = 0;/*在外部*/
}

void test2(int x0,int y0,int x1,int y1,Rect * r,int *flag)/*测试两点是否在矩形同侧*/
{
    int L0,T0,R0,B0;
    int L1,T1,R1,B1;

    CopmOutCode(x0,y0,r,&L0,&T0,&R0,&B0);
    CopmOutCode(x1,y1,r,&L1,&T1,&R1,&B1);

    if(L0==L1==1||T0==T1==1||R0==R1==1||B0==B1==1)
     *flag = 1;/* 在同侧*/
    else
     *flag = 0;/* 在异侧*/
}




void CSLine(int x0,int y0,int x1,int y1,Rect * r)
{
     int f0,f1,f,x,y;
     int k; /*斜率*/
     int L0,L1,T0,T1,R0,R1,B0,B1;

     k = (y1 - y0)/(x1 - x0);

     CopmOutCode(x0,y0,r,&L0,&T0,&R0,&B0);
     CopmOutCode(x1,y1,r,&L1,&T1,&R1,&B1);

     test1(x0,y0,r,&f0);
     test1(x1,y1,r,&f1);

     if((f0==1)&&(f1==1))/*是否都在内部*/
        line(x0,y0,x1,y1);
       else
       {

        test2(x0,y0,x1,y1,r,&f);
         if(f==1);/*是否在同侧*/
           else
            {
              if(f0 == 1&&f1 == 0)/*(x0,y0)在内部,(x1,y1)在外部*/
              {
                if(L1==1) /*左边求交*/
                   {
                     y = y1 - (1/k)*(x1 - r->xmin);
                     x = r->xmin;
                   }
                else
                  {
                    if(T1==1)      /*上边求交*/
                       {
                          x = x1 - (1/k)*(y1 - r->ymin);
                          y = r->ymin;
                       }
                     else
                       {
                           if(R1==1)     /*右边求交*/
                           {
                              y = y1 - (1/k)*(x1 - r->xmax);
                              x = r->xmax;

                           }

                           else
                           {

                             if(B1==1)/*下边求交*/
                              {
                               x = x1 - (1/k)*(y1 - r->ymax);
                               y = r->ymax;
                              }
                           }

                       }

                  }

                 CSLine(x0,y0,x,y,r);


               }

             if(f0 == 0&&f1 == 1)   /*(x1,y1)在内部,(x0,y0)在外部*/
              {

                  if(L0==1)   /*左边求交*/
                  {
                     y = y0 - k*(x0 - r->xmin);
                     x = r->xmin;
                  }
                  else
                  {
                      if(T0==1)      /*上边求交*/
                       {
                             x = x0 - k*(y0 - r->ymin);
                             y = r->ymin;
                       }

                       else
                       {
                          if(R0==1)     /*右边求交*/
                           {
                              y = y0 - k*(x0 - r->xmax);
                              x = r->xmax;

                           }

                           else
                           {
                              if(B0==1)/*下边求交*/
                              {
                               x = x0 - k*(y0 - r->ymax);
                               y = r->ymax;
                              }
                           }

                       }

                  }


                CSLine(x,y,x1,y1,r);
              }

            }
          }

      ;

}


main()
{
  Rect r;

  int f;
  int i,j,k,l;

  int graphdriver = DETECT,graphmode;
  initgraph(&graphdriver,&graphmode,"");
  r.xmin = 200; r.ymin = 200;
  r.xmax = 400; r.ymax = 400;

  CSLine(100,100,600,600,&r);


  getch();

  closegraph();
}

⌨️ 快捷键说明

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