设为首页收藏本站

中国膜结构网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

膜结构车棚
膜结构车棚膜结构资质国产膜材 膜结构网中国膜结构协会
查看: 178|回复: 3

凸多边形碰撞的NFP算法实现

[复制链接]
  • TA的每日心情
    开心
    2021-6-19 14:40
  • 签到天数: 1539 天

    [LV.Master]伴坛终老

    发表于 2021-1-30 20:26 | 显示全部楼层 |阅读模式
    凸多边形碰撞的NFP算法实现

    #include <windows.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <conio.h>
    #include <dos.h>
    #define H 600
    #define W 800


    typedef struct node {   /*  定义的顶点结构 */
       int x;
       int y;
       double value;
    }NODE;

    typedef struct edage{   /*  定义的边结构 */
       int headX;
       int headY;
       int tailX;
       int tailY;
    }EDGE;   

    typedef struct polygon{  /* 定义的多边形结构 */
       NODE *Node;
       EDGE *Edge;
       int cx;
       int cy;
       int nNode;
    }PolyGon;


    PolyGon PolyGonA;       /*  声明多边形 A 变量 */
    PolyGon PolyGonB;       /*  声明多边形 B 变量 */

    NODE * trace;

    int PolyALowX=0,PolyALowY=0;
    int PolyBHighX=0,PolyBHighY=0;
    int mycolor=1;

    void init()
    {
    FILE *fp;
    int i;

    PolyGonA.nNode=0;
    PolyGonB.nNode=0;

    if( ( fp=fopen("d:/polygon.txt","r") ) ==NULL )
      {
        printf("Open file failed  ");
        exit(0);
      }

      fscanf( fp , "%d" , &PolyGonA.nNode);
      PolyGonA.Node = ( NODE *) malloc( sizeof(NODE)*PolyGonA.nNode );
      PolyGonA.Edge = ( EDGE *) malloc( sizeof(EDGE)*PolyGonA.nNode );

      for(i=0;i<PolyGonA.nNode;i++)
       fscanf( fp , "%d%d", &PolyGonA.Node[i].x , &PolyGonA.Node[i].y );  /*   读数据文件内容到多边形变量中 */



      fscanf( fp , "%d" , &PolyGonB.nNode);
      PolyGonB.Node = ( NODE *) malloc( sizeof(NODE)*PolyGonB.nNode );
      PolyGonB.Edge = ( EDGE *) malloc( sizeof(EDGE)*PolyGonB.nNode );

      for(i=0;i<PolyGonB.nNode;i++)
       fscanf( fp , "%d%d", &PolyGonB.Node[i].x , &PolyGonB.Node[i].y );  /*   读数据文件内容到多边形变量中 */

      fclose(fp);

      trace=(NODE *)malloc(sizeof(NODE)*(PolyGonA.nNode+PolyGonB.nNode+1)); /* 创建一个轨迹顶点列表 */

    }

    void Sort(NODE *Node , int n)                      /* 使用简单选择排序进行排序 */
    {
      NODE tNode;
      int i,j,Min=0;

      for(i=0;i<n;i++)
      {
        Min=i;
        for(j=i;j<n;j++)
          if( Node[j].value<Node[Min].value )
              Min=j;
        if(Min!=i)
         {
           tNode=Node[i];
           Node[i]=Node[Min];
           Node[Min]=tNode;
         }
       }  
    }


    int ConnectNodeList(NODE * Node1, int nNode1, NODE *Node2 , int nNode2 , NODE * Node , int CONNECTSTYLE)
    {
      int i,j;

      if(CONNECTSTYLE==0)
       {
        for(i=0 ; i<nNode1 ; i++)
          Node[i]=Node1[i];
        for(j=0;j<nNode2;j++)
          Node[i++]=Node2[j];
       }
      else if(CONNECTSTYLE==1)
       {
        for(i=0;i<nNode2;i++)
          Node[i]=Node2[i];

        for(j=0;j<nNode1;j++)
          Node[i++]=Node1[j];
       }
      return (nNode1+nNode2);
    }

    void CreatEdgeList()
    {
      int i,j,k,npNode1=0,npNode2=0;
      int count=0;

      int CenterOfPolygonAX=0,CenterOfPolygonAY=0;
      int CenterOfPolygonBX=0,CenterOfPolygonBY=0;
      NODE *pNode1,*pNode2;


      for (i=0;i<PolyGonA.nNode;i++)
      {
        CenterOfPolygonAX+=PolyGonA.Node[i].x;
        CenterOfPolygonAY+=PolyGonA.Node[i].y;
      }
       CenterOfPolygonAX=CenterOfPolygonAX/PolyGonA.nNode;
       CenterOfPolygonAY=CenterOfPolygonAY/PolyGonA.nNode;        /* 得到多边形 A 的形心  */
       
      PolyGonA.cx=CenterOfPolygonAX;
      PolyGonA.cy=CenterOfPolygonAY;

      for (i=0;i<PolyGonB.nNode;i++)
      {
        CenterOfPolygonBX+=PolyGonB.Node[i].x;
        CenterOfPolygonBY+=PolyGonB.Node[i].y;
      }
       CenterOfPolygonBX=CenterOfPolygonBX/PolyGonB.nNode;
       CenterOfPolygonBY=CenterOfPolygonBY/PolyGonB.nNode;        /* 得到多边形 B 的形心  */

      PolyGonB.cx=CenterOfPolygonBX;
      PolyGonB.cy=CenterOfPolygonBY;

    /*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/

      i=0;
      j=0;

      pNode1=(NODE *)malloc(sizeof(NODE)*PolyGonA.nNode);
      pNode2=(NODE *)malloc(sizeof(NODE)*PolyGonA.nNode);  /*  临时顶点数组初始化 */

      for(k=0;k<PolyGonA.nNode;k++)
    回复


    http://www.mjgw.org/ 专业从事膜结构设计、制作加工、施工安装的膜结构工程服务,能够为客户提供专业的膜结构整体解决方案。做中国最好的膜结构综合服务平台。欢迎大家联系电话:198-7840-1958,QQ:463017170.
    相关关键词:膜结构车棚,膜结构车棚覆盖,膜结构车棚公司,膜结构车棚多少钱,膜结构车棚厂家,膜结构车棚价格,社区膜结构车棚,膜结构车棚膜布厂家 ,膜结构车棚哪家好,膜结构车棚多少钱一米,膜结构车棚报价,膜结构车棚哪里有,膜结构车棚定制,膜结构车棚安装,膜结构车棚设计,膜结构车棚电话,膜结构车棚加工,膜结构车棚膜布价格,膜结构车棚批发,膜结构车棚制造商,膜结构车棚生产厂家,膜结构车棚设计,膜结构车棚施工,膜结构车棚多少钱一平米,膜结构车棚订制,张拉膜车棚,张拉膜车棚覆盖,张拉膜车棚公司,张拉膜车棚多少钱,张拉膜车棚厂家,张拉膜车棚价格,社区张拉膜车棚,张拉膜车棚膜布厂家 ,张拉膜车棚哪家好,张拉膜车棚多少钱一米,张拉膜车棚报价,张拉膜车棚哪里有,张拉膜车棚定制,张拉膜车棚安装,张拉膜车棚设计,张拉膜车棚电话,张拉膜车棚加工,张拉膜车棚膜布价格,张拉膜车棚批发,张拉膜车棚制造商,张拉膜车棚生产厂家,张拉膜车棚设计,张拉膜车棚施工,张拉膜车棚多少钱一平米,张拉膜车棚订制,常用膜材品牌:德国杜肯、法国法拉利、德国海德斯、德国米乐、日本平岗、韩国秀博、比利时希运、美国赫虏伯、中国科宝、上海慧遥。

    使用道具 举报

  • TA的每日心情
    开心
    2021-6-19 14:40
  • 签到天数: 1539 天

    [LV.Master]伴坛终老

     楼主| 发表于 2021-1-30 20:29 | 显示全部楼层
    #include  < windows.h >
    #include  < stdlib.h >  
    #include  < stdio.h >  
    #include  < conio.h >  
    #include  < dos.h >
    #define  H 600
    #define  W 800


    typedef  struct  node  {   /*  定义的顶点结构 */
       int x;
       int y;
       double value;
    } NODE;

    typedef  struct  edage {   /*  定义的边结构 */
       int headX;
       int headY;
       int tailX;
       int tailY;
    } EDGE;   

    typedef  struct  polygon {  /* 定义的多边形结构 */
       NODE *Node;
       EDGE *Edge;
       int cx;
       int cy;
       int nNode;
    } PolyGon;


    PolyGon PolyGonA;        /*  声明多边形 A 变量 */
    PolyGon PolyGonB;        /*  声明多边形 B 变量 */

    NODE  *  trace;

    int  PolyALowX = 0 ,PolyALowY = 0 ;
    int  PolyBHighX = 0 ,PolyBHighY = 0 ;
    int  mycolor = 1 ;

    void  init()
    {
    FILE *fp;
    int i;

    PolyGonA.nNode=0;
    PolyGonB.nNode=0;

    if( ( fp=fopen("d:/polygon.txt","r") ) ==NULL )
      {
        printf("Open file failed  ");
        exit(0);
      }

      fscanf( fp , "%d" , &PolyGonA.nNode);
      PolyGonA.Node = ( NODE *) malloc( sizeof(NODE)*PolyGonA.nNode );
      PolyGonA.Edge = ( EDGE *) malloc( sizeof(EDGE)*PolyGonA.nNode );

      for(i=0;i<PolyGonA.nNode;i++)
       fscanf( fp , "%d%d", &PolyGonA.Node[i].x , &PolyGonA.Node[i].y );  /*   读数据文件内容到多边形变量中 */



      fscanf( fp , "%d" , &PolyGonB.nNode);
      PolyGonB.Node = ( NODE *) malloc( sizeof(NODE)*PolyGonB.nNode );
      PolyGonB.Edge = ( EDGE *) malloc( sizeof(EDGE)*PolyGonB.nNode );

      for(i=0;i<PolyGonB.nNode;i++)
       fscanf( fp , "%d%d", &PolyGonB.Node[i].x , &PolyGonB.Node[i].y );  /*   读数据文件内容到多边形变量中 */

      fclose(fp);

      trace=(NODE *)malloc(sizeof(NODE)*(PolyGonA.nNode+PolyGonB.nNode+1)); /* 创建一个轨迹顶点列表 */

    }

    void  Sort(NODE  * Node ,  int  n)                       /* 使用简单选择排序进行排序 */
    {
      NODE tNode;
      int i,j,Min=0;

      for(i=0;i<n;i++)
      {
        Min=i;
        for(j=i;j<n;j++)
          if( Node[j].value<Node[Min].value )
              Min=j;
        if(Min!=i)
         {
           tNode=Node[i];
           Node[i]=Node[Min];
           Node[Min]=tNode;
         }
       }  
    }


    int  ConnectNodeList(NODE  *  Node1,  int  nNode1, NODE  * Node2 ,  int  nNode2 , NODE  *  Node ,  int  CONNECTSTYLE)
    {
      int i,j;

      if(CONNECTSTYLE==0)
       {
        for(i=0 ; i<nNode1 ; i++)
          Node[i]=Node1[i];
        for(j=0;j<nNode2;j++)
          Node[i++]=Node2[j];
       }
      else if(CONNECTSTYLE==1)
       {
        for(i=0;i<nNode2;i++)
          Node[i]=Node2[i];

        for(j=0;j<nNode1;j++)
          Node[i++]=Node1[j];
       }
      return (nNode1+nNode2);
    }

    void  CreatEdgeList()
    {
      int i,j,k,npNode1=0,npNode2=0;
      int count=0;

      int CenterOfPolygonAX=0,CenterOfPolygonAY=0;
      int CenterOfPolygonBX=0,CenterOfPolygonBY=0;
      NODE *pNode1,*pNode2;


      for (i=0;i<PolyGonA.nNode;i++)
      {
        CenterOfPolygonAX+=PolyGonA.Node[i].x;
        CenterOfPolygonAY+=PolyGonA.Node[i].y;
      }
       CenterOfPolygonAX=CenterOfPolygonAX/PolyGonA.nNode;
       CenterOfPolygonAY=CenterOfPolygonAY/PolyGonA.nNode;        /* 得到多边形 A 的形心  */
       
      PolyGonA.cx=CenterOfPolygonAX;
      PolyGonA.cy=CenterOfPolygonAY;

      for (i=0;i<PolyGonB.nNode;i++)
      {
        CenterOfPolygonBX+=PolyGonB.Node[i].x;
        CenterOfPolygonBY+=PolyGonB.Node[i].y;
      }
       CenterOfPolygonBX=CenterOfPolygonBX/PolyGonB.nNode;
       CenterOfPolygonBY=CenterOfPolygonBY/PolyGonB.nNode;        /* 得到多边形 B 的形心  */

      PolyGonB.cx=CenterOfPolygonBX;
      PolyGonB.cy=CenterOfPolygonBY;

    /*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/

      i=0;
      j=0;

      pNode1=(NODE *)malloc(sizeof(NODE)*PolyGonA.nNode);
      pNode2=(NODE *)malloc(sizeof(NODE)*PolyGonA.nNode);  /*  临时顶点数组初始化 */

      for(k=0;k<PolyGonA.nNode;k++)
       {
         if(PolyGonA.Node[k].x>=CenterOfPolygonAX)
           {
              pNode1[i]=PolyGonA.Node[k];

              if(pNode1[i].x==CenterOfPolygonAX )
             {
                if(pNode1[i].y>CenterOfPolygonAY)
                  pNode1[i].value=1000;
                else
                  pNode1[i].value=-1000;
              }
             else   
              {
                pNode1[i].value= (double)( pNode1[i].y - CenterOfPolygonAY)/(pNode1[i].x - CenterOfPolygonAX);
              }

              i++;
           }
          else
           {
             pNode2[j]=PolyGonA.Node[k];
             pNode2[j].value= (double)( pNode2[j].y - CenterOfPolygonAY)/(pNode2[j].x - CenterOfPolygonAX);
             j++;
           }
       }
       npNode1=i;
       npNode2=j;

       Sort(pNode1,npNode1);
       Sort(pNode2,npNode2);
       
       count=ConnectNodeList(pNode1, npNode1, pNode2 , npNode2 , PolyGonA.Node , 0);


       free(pNode1);
       free(pNode2);


       for(i=0;i<count;i++)                         /* 对节点进行编号,初始化边列表 */
        {
          PolyGonA.Edge[i].headX=PolyGonA.Node[i].x;
          PolyGonA.Edge[i].headY=PolyGonA.Node[i].y;

          if(i<count-1)  /* 当 i<=count-2 时 */
            {
              PolyGonA.Edge[i].tailX=PolyGonA.Node[i+1].x;
              PolyGonA.Edge[i].tailY=PolyGonA.Node[i+1].y;
            }
          else           /* 当 i=count-1 时 */
            {
              PolyGonA.Edge[i].tailX=PolyGonA.Node[(i+1)%count].x;
              PolyGonA.Edge[i].tailY=PolyGonA.Node[(i+1)%count].y;
            }
        }

    /*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/

      i=0,j=0;

      pNode1=(NODE *)malloc(sizeof(NODE)*PolyGonB.nNode);
      pNode2=(NODE *)malloc(sizeof(NODE)*PolyGonB.nNode);

      for(k=0;k<PolyGonB.nNode;k++)
       {
         if(PolyGonB.Node[k].x>=CenterOfPolygonBX)
           {
             pNode1[i]=PolyGonB.Node[k];

             if(pNode1[i].x==CenterOfPolygonBX )
             {
               if(pNode1[i].y>CenterOfPolygonBY)
                 pNode1[i].value=1000;
               else
                 pNode1[i].value=-1000;
             }
             else
             {
               pNode1[i].value= (double)( pNode1[i].y - CenterOfPolygonBY)/(pNode1[i].x - CenterOfPolygonBX);
             }

              i++;
            }
            else
            {
              pNode2[j]=PolyGonB.Node[k];
              pNode2[j].value= (double)( pNode2[j].y - CenterOfPolygonBY)/(pNode2[j].x - CenterOfPolygonBX);
              j++;
            }
       }
       npNode1=i;
       npNode2=j;

       Sort(pNode1,npNode1);
       Sort(pNode2,npNode2);

       count=ConnectNodeList(pNode1, npNode1, pNode2 , npNode2 , PolyGonB.Node , 1);
       

       free(pNode1);
       free(pNode2);


       for(i=0;i<count;i++)                          /* 对节点进行编号,初始化边列表 */
        {
          PolyGonB.Edge[i].headX=PolyGonB.Node[i].x;
          PolyGonB.Edge[i].headY=PolyGonB.Node[i].y;

          if(i<count-1)  /* 当 i<=count-2 时 */
            {
              PolyGonB.Edge[i].tailX=PolyGonB.Node[i+1].x;
              PolyGonB.Edge[i].tailY=PolyGonB.Node[i+1].y;
            }
          else           /* 当 i=count-1 时 */
            {
              PolyGonB.Edge[i].tailX=PolyGonB.Node[(i+1)%count].x;
              PolyGonB.Edge[i].tailY=PolyGonB.Node[(i+1)%count].y;
            }
        }
    /*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
    }


    void  DrawPolyGon(HDC hDC,EDGE  * Edge, int  n)
    {
      int i,M,N,tmpX=0,tmpY=0;

      N=H;
      
      tmpX=Edge[0].headX;
      tmpY=N-Edge[0].headY;
      
      MoveToEx(hDC,tmpX,tmpY,NULL);

      for(i=0;i<n;i++)
       {
         tmpX=Edge[i].tailX;
         tmpY=N-Edge[i].tailY;
         LineTo(hDC,tmpX,tmpY);
       }
    }

    void  Adjust()
    {

    int i,j,Min=0,Max=0;
    int dx=0,dy=0;

    for(i=1;i<PolyGonA.nNode;i++)
      if(PolyGonA.Node[i].y<=PolyGonA.Node[Min].y)
        Min=i;
    PolyALowX=PolyGonA.Node[Min] .x;
    PolyALowY=PolyGonA.Node[Min] .y;     /* 得到A多边形的最底点坐标 */


    for(i=1;i<PolyGonB.nNode;i++)
      if(PolyGonB.Node[i].y>=PolyGonB.Node[Max].y)
        Max=i;
    PolyBHighX=PolyGonB.Node[Max] .x;
    PolyBHighY=PolyGonB.Node[Max] .y;    /* 得到B多边形的最高点坐标 */


    dx=PolyBHighX-PolyALowX;
    dy=PolyBHighY-PolyALowY;

    for(i=0;i<PolyGonA.nNode;i++)
       {
         PolyGonA.Node[i].x=PolyGonA.Node[i].x+dx;
         PolyGonA.Node[i].y=PolyGonA.Node[i].y+dy;
       
         PolyGonA.Edge[i].headX=PolyGonA.Edge[i].headX+dx;
         PolyGonA.Edge[i].headY=PolyGonA.Edge[i].headY+dy;
         
         PolyGonA.Edge[i].tailX=PolyGonA.Edge[i].tailX+dx;
         PolyGonA.Edge[i].tailY=PolyGonA.Edge[i].tailY+dy;
       }
         PolyGonA.cx=PolyGonA.cx+dx;
         PolyGonA.cy=PolyGonA.cy+dy;
    }

    int  JudgeAcross( int  LP1X, int  LP1Y,  int  LP2X, int  LP2Y, int  CPolyGonAX, int  CPolyGonAY, int  CPolyGonBX, int  CPolyGonBY)
    /* 判断两个点是否在 一条直线的两侧 */
    {
      double k=0;
      double f1=0,f2=0;

      if(LP1X==LP2X)
       {
        if( (CPolyGonAX>LP1X && CPolyGonBX<LP1X) || (CPolyGonAX<LP1X &&CPolyGonBX>LP1X) )
         {
           return 1;
         }
        else
         return 0;
       }
      else
      {
        k=(double)(LP1Y-LP2Y)/(LP1X-LP2X);
        f1=k*(CPolyGonAX-LP1X)-CPolyGonAY+LP1Y;
        f2=k*(CPolyGonBX-LP1X)-CPolyGonBY+LP1Y;
        if(f1*f2<0)
         return 1;
        else
         return 0;   
      }
    }

    int  ChooseEdge(EDGE Edge, int  x, int  y)
    {
      int i,j;
      int LP1X,LP1Y,LP2X,LP2Y;
      int NodeAX=0,NodeAY=0;
      int result=-1;
      
      LP1X=Edge.headX;
      LP1Y=Edge.headY;
      LP2X=Edge.tailX;
      LP2Y=Edge.tailY;
       
      for(j=0;j<PolyGonA.nNode;j++)
        {
           NodeAX=PolyGonA.Node[j].x;
           NodeAY=PolyGonA.Node[j].y;
           if(NodeAX==x&&NodeAY==y)
              continue;
           result=JudgeAcross(LP1X,LP1Y,LP2X,LP2Y,NodeAX,NodeAY,PolyGonB.cx,PolyGonB.cy);
           if(result==0)
              return 0;
        }
      return 1;
    }

    void  DrawPolyGonATo(HDC hDC, int  dx, int  dy)
    {
    int i,N;
    int tmpx=0,tmpy=0;

    N=H;

    tmpx=PolyGonA.cx;
    tmpy=PolyGonA.cy;

    for(i=0;i<PolyGonA.nNode;i++)
       {
         PolyGonA.Node[i].x=PolyGonA.Node[i].x+dx;
         PolyGonA.Node[i].y=PolyGonA.Node[i].y+dy;
       
         PolyGonA.Edge[i].headX=PolyGonA.Edge[i].headX+dx;
         PolyGonA.Edge[i].headY=PolyGonA.Edge[i].headY+dy;
         
         PolyGonA.Edge[i].tailX=PolyGonA.Edge[i].tailX+dx;
         PolyGonA.Edge[i].tailY=PolyGonA.Edge[i].tailY+dy;
       }
         PolyGonA.cx=PolyGonA.cx+dx;
         PolyGonA.cy=PolyGonA.cy+dy;

       DrawPolyGon(hDC,PolyGonA.Edge,PolyGonA.nNode);

    /*   moveto(tmpx,N-tmpy);
       setlinestyle(1,1,1);
       setcolor(10);   
       lineto(PolyGonA.cx,N-PolyGonA.cy);
    */

       MoveToEx(hDC,PolyGonA.cx,N-PolyGonA.cy,NULL);
       LineTo(hDC,PolyGonA.cx,N-PolyGonA.cy);
       
    /*   putpixel(PolyGonA.cx,N-PolyGonA.cy,4);  */
    }

    void  TurnPolyGon(HDC hDC)
    {

      int i,result=-1;
      int CountA=0,CountB=0;
      int indexA=0,indexB=0;
      int Min=0,Max=0;
      int dx=0,dy=0;
      int nTrace=0;  
      int tpx,tpy;
      HPEN hPen;


      for(i=1;i<PolyGonA.nNode;i++)
       if(PolyGonA.Node[i].y<=PolyGonA.Node[Min].y)
         Min=i;

      for(i=0;i<PolyGonA.nNode;i++)
        if(PolyGonA.Edge[i].headX==PolyGonA.Node[Min].x && PolyGonA.Edge[i].headY==PolyGonA.Node[Min].y )
          indexA=i;

      for(i=1;i<PolyGonB.nNode;i++)
       if(PolyGonB.Node[i].y>=PolyGonB.Node[Max].y)
         Max=i;

      for(i=0;i<PolyGonB.nNode;i++)
        if(PolyGonB.Edge[i].headX==PolyGonB.Node[Max].x && PolyGonB.Edge[i].headY==PolyGonB.Node[Max].y )
          indexB=i;

      
      trace[0].x=PolyGonA.cx;
      trace[0].y=PolyGonA.cy;
      nTrace++;                      /* 本段代码记录轨迹顶点的起点坐标 */

      
      Sleep(2000);
      
      
      while(1)
      {

        result=ChooseEdge( PolyGonB.Edge[indexB], PolyGonA.Edge[indexA].headX , PolyGonA.Edge[indexA].headY );
        if(result)
          {   
          
            dx=PolyGonB.Edge[indexB].tailX-PolyGonB.Edge[indexB].headX;
            dy=PolyGonB.Edge[indexB].tailY-PolyGonB.Edge[indexB].headY;

            if(nTrace<=PolyGonA.nNode+PolyGonB.nNode)
             {
                trace[nTrace].x=trace[nTrace-1].x+dx;
                trace[nTrace].y=trace[nTrace-1].y+dy;
                nTrace++;
             }

            hPen=CreatePen(PS_SOLID,1,RGB(192,192,192));
            SelectObject(hDC,hPen);
            DrawPolyGon(hDC,PolyGonA.Edge,PolyGonA.nNode);         
            
            tpx=PolyGonA.cx;
            tpy=PolyGonA.cy;

            hPen=CreatePen(PS_SOLID,1,RGB(255,255,0));
            SelectObject(hDC,hPen);
            DrawPolyGon(hDC,PolyGonB.Edge,PolyGonB.nNode);         
            
            hPen=CreatePen(PS_SOLID,1,RGB(255,0,0));
            SelectObject(hDC,hPen);        
            DrawPolyGonATo(hDC,dx,dy);
            
            MoveToEx(hDC,tpx,H-tpy,NULL);
            hPen=CreatePen(PS_DASHDOT,1,RGB(0,255,0));
            SelectObject(hDC,hPen);  
            LineTo(hDC,PolyGonA.cx,H-PolyGonA.cy);
          
            indexB=(indexB+1)%PolyGonB.nNode;
            CountB++;
            Sleep(1000);
          }
        else
          {
            dx=PolyGonA.Edge[indexA].headX-PolyGonA.Edge[indexA].tailX;
            dy=PolyGonA.Edge[indexA].headY-PolyGonA.Edge[indexA].tailY;

            if(nTrace<=PolyGonA.nNode+PolyGonB.nNode)
             {
                trace[nTrace].x=trace[nTrace-1].x+dx;
                trace[nTrace].y=trace[nTrace-1].y+dy;
                nTrace++;
             }

            hPen=CreatePen(PS_SOLID,1,RGB(192,192,192));
            SelectObject(hDC,hPen);
            DrawPolyGon(hDC,PolyGonA.Edge,PolyGonA.nNode);         

            tpx=PolyGonA.cx;
            tpy=PolyGonA.cy;

            hPen=CreatePen(PS_SOLID,1,RGB(255,255,0));
            SelectObject(hDC,hPen);
            DrawPolyGon(hDC,PolyGonB.Edge,PolyGonB.nNode);         

            hPen=CreatePen(PS_SOLID,1,RGB(255,0,0));
            SelectObject(hDC,hPen);
            DrawPolyGonATo(hDC,dx,dy);

            MoveToEx(hDC,tpx,H-tpy,NULL);
            hPen=CreatePen(PS_DASHDOT,1,RGB(0,255,0));
            SelectObject(hDC,hPen);  
            LineTo(hDC,PolyGonA.cx,H-PolyGonA.cy);

            indexA=(indexA+1)%PolyGonA.nNode;
            CountA++;
            Sleep(1000);
          }
        if(CountA>=PolyGonA.nNode && CountB>=PolyGonB.nNode)
              break;
      }
    }

    void  DrawTrace(HDC hDC)
    {
    int i;
    int tmpx,tmpy;
    int N;

    N=H;

    tmpx=trace[0].x;
    tmpy=N-trace[0].y;

    MoveToEx(hDC,tmpx,tmpy,NULL);
    LineTo(hDC,tmpx,tmpy);


    for(i=1;i<=PolyGonA.nNode+PolyGonB.nNode;i++)
       {
        sleep(1);
        tmpx=trace[i].x;
        tmpy=N-trace[i].y;
        LineTo(hDC,tmpx,tmpy);
        Sleep(500);
       }
    }
                

    LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
    char  szClassName[ ]  =   " NFP 算法 " ;
    int  flag = 0 ;



    int  WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance,
             LPSTR lpszArgument,  int  nFunsterStil)
    {
        HWND hwnd;               /* This is the handle for our window */
        MSG messages;            /* Here messages to the application are saved */
        WNDCLASSEX wincl;        /* Data structure for the windowclass */

        wincl.hInstance = hThisInstance;
        wincl.lpszClassName = szClassName;
        wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
        wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
        wincl.cbSize = sizeof (WNDCLASSEX);

        wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
        wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
        wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
        wincl.lpszMenuName = NULL;                 /* No menu */
        wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
        wincl.cbWndExtra = 0;                      /* structure or the window instance */
        wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

        if (!RegisterClassEx (&wincl))
            return 0;

        hwnd = CreateWindowEx (
               0,                   /* Extended possibilites for variation */
               szClassName,         /* Classname */
               "NFP 算法",       /* Title Text */
               WS_OVERLAPPEDWINDOW, /* default window */
               0,       /* Windows decides the position */
               0,       /* where the window ends up on the screen */
               W,                 /* The programs width */
               H,                 /* and height in pixels */
               HWND_DESKTOP,        /* The window is a child-window to desktop */
               NULL,                /* No menu */
               hThisInstance,       /* Program Instance handler */
               NULL                 /* No Window Creation data */
               );

        ShowWindow(hwnd,nFunsterStil);

        while (GetMessage(&messages, NULL, 0, 0))
        {
            TranslateMessage(&messages);
            DispatchMessage(&messages);
        }

        return messages.wParam;
    }

    LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        HDC hDC;
        PAINTSTRUCT PtStr;
        static HWND hwndButton = 0;
       
       
        switch (message)                  /* handle the messages */
        {
            case WM_CREATE:
                 hwndButton = CreateWindow (
                      "button",/* Builtin button class */
                      "Click Here",
                       WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
                       0, 0, 100, 50,
                       hwnd,/* Parent is this window. */
                       (HMENU) 1,/* Control ID: 1 */
                       ((LPCREATESTRUCT) lParam)->hInstance,
                       NULL  
                       );
                  break;
            case WM_PAINT:

    /*********************************************************/
                  break;

            case WM_COMMAND:
               if (flag==1)
                   break;
               else
                   flag=1;
               /* Check the control ID, notification code and
                 * control handle to see if this is a button click
                 * message from our child button. */
                if (LOWORD(wParam) == 1 &&
                    HIWORD(wParam) == BN_CLICKED &&
                   (HWND) lParam == hwndButton)
                   {
                     /* Our button was clicked. Close the window. */
                      hDC=BeginPaint(hwnd,&PtStr);
                
                      HPEN hPen=CreatePen(PS_SOLID,1,RGB(255,0,0));
                       SelectObject(hDC,hPen);
    /*********************************************************/
                
                      init();
                      CreatEdgeList();
                      DrawPolyGon(hDC,PolyGonA.Edge,PolyGonA.nNode);
                  
                      hPen=CreatePen(PS_SOLID,1,RGB(255,255,0));
                      SelectObject(hDC,hPen);
                
                      DrawPolyGon(hDC,PolyGonB.Edge,PolyGonB.nNode);
                
                      Sleep(5000);
                
                      Adjust();
                   
                      hPen=CreatePen(PS_SOLID,1,RGB(255,0,0));
                      SelectObject(hDC,hPen);
                
                      DrawPolyGon(hDC,PolyGonA.Edge,PolyGonA.nNode);
                
                      TurnPolyGon(hDC);

                      hPen=CreatePen(PS_SOLID,1,RGB(192,192,192));
                      SelectObject(hDC,hPen);
                      DrawPolyGon(hDC,PolyGonB.Edge,PolyGonB.nNode);
                
                      EndPaint(hwnd,&PtStr);
                     }
                      flag=0;
                      break;
                
            case WM_DESTROY:
                PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
                break;
            default:                      /* for messages that we don't deal with */
                return DefWindowProc (hwnd, message, wParam, lParam);
        }

        return 0;
    }
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2021-6-19 14:40
  • 签到天数: 1539 天

    [LV.Master]伴坛终老

     楼主| 发表于 2021-1-30 20:35 | 显示全部楼层
    通过C++实现判断点与多边形的关系和两点之间的距离

    努力减肥的小胖子5 2017-12-02 15:23:06  521  收藏
    分类专栏: 线性代数 文章标签: c++
    版权
    1.判断两点之间的距离

    #include<math.h>
    //计算两点之间的距离
    double calculateDistence(double* p0,double* p){
        double tempx = p[0] - p0[0];
        double tempy = p[1] - p0[1];
        double tempz = p[2] - p0[2];
        //pow(x,y)--x的y次方
        double radius2 = pow(tempx,2)+pow(tempy,2)+pow(tempz,2);
        return sqrt(radius2);
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    2.判断点是是否在多边形内

    #include<vector>
    #include<math.h>
    struct Point2D{
        double x;
        double y;

        Point2D(double _x,double _y){
            x = _x;
            y = _y;
        }
    };

    bool pointInPolygon11(double* _p,std::vector<double*>& _polygon){
        int numCrossPoint = 0;
        for(int i=0; i<_polygon.size(); i++){
            double* p1 = _polygon.at(i);
            //(i+1)/polygon.size()--处理最后一点与第一点相连接
            double* p2 = _polygon.at((i+1)%_polygon.size());
            //这是一条水平线
            if(p2[1] == p1[1]){
                if(p1[1] == _p[1]){
                    if(_p[0] <= fmax(p1[0],p2[0]) && _p[0] >= fmin(p1[0],p2[0])){
                        return 1;
                    }else{
                        continue;
                    }
                }else{
                    continue;
                }
            }
            if(_p[1] < fmin(p1[1],p2[1]) || _p[1] > fmax(p1[1],p2[1])){
                continue;
            }
            //求点的水平射线与边的交点,通过直线的两点式方程
            double x = (_p[1]-p1[1])*(p2[0]-p1[0])/(p2[1]-p1[1]) + p1[0];
            //只统计与右射线的交点
            if(x>=_p[0]){
                ++numCrossPoint;
            }
        }
        return (numCrossPoint%2 == 1);//0外
    }
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2021-6-19 14:40
  • 签到天数: 1539 天

    [LV.Master]伴坛终老

     楼主| 发表于 2021-2-1 09:58 | 显示全部楼层
    #include  < windows.h >
    #include  < stdlib.h >  
    #include  < stdio.h >  
    #include  < conio.h >  
    #include  < dos.h >
    #define  H 600
    #define  W 800


    typedef  struct  node  {   /*  定义的顶点结构 */
       int x;
       int y;
       double value;
    } NODE;

    typedef  struct  edage {   /*  定义的边结构 */
       int headX;
       int headY;
       int tailX;
       int tailY;
    } EDGE;   

    typedef  struct  polygon {  /* 定义的多边形结构 */
       NODE *Node;
       EDGE *Edge;
       int cx;
       int cy;
       int nNode;
    } PolyGon;


    PolyGon PolyGonA;        /*  声明多边形 A 变量 */
    PolyGon PolyGonB;        /*  声明多边形 B 变量 */

    NODE  *  trace;

    int  PolyALowX = 0 ,PolyALowY = 0 ;
    int  PolyBHighX = 0 ,PolyBHighY = 0 ;
    int  mycolor = 1 ;

    void  init()
    {
    FILE *fp;
    int i;

    PolyGonA.nNode=0;
    PolyGonB.nNode=0;

    if( ( fp=fopen("d:/polygon.txt","r") ) ==NULL )
      {
        printf("Open file failed  ");
        exit(0);
      }

      fscanf( fp , "%d" , &PolyGonA.nNode);
      PolyGonA.Node = ( NODE *) malloc( sizeof(NODE)*PolyGonA.nNode );
      PolyGonA.Edge = ( EDGE *) malloc( sizeof(EDGE)*PolyGonA.nNode );

      for(i=0;i<PolyGonA.nNode;i++)
       fscanf( fp , "%d%d", &PolyGonA.Node[i].x , &PolyGonA.Node[i].y );  /*   读数据文件内容到多边形变量中 */



      fscanf( fp , "%d" , &PolyGonB.nNode);
      PolyGonB.Node = ( NODE *) malloc( sizeof(NODE)*PolyGonB.nNode );
      PolyGonB.Edge = ( EDGE *) malloc( sizeof(EDGE)*PolyGonB.nNode );

      for(i=0;i<PolyGonB.nNode;i++)
       fscanf( fp , "%d%d", &PolyGonB.Node[i].x , &PolyGonB.Node[i].y );  /*   读数据文件内容到多边形变量中 */

      fclose(fp);

      trace=(NODE *)malloc(sizeof(NODE)*(PolyGonA.nNode+PolyGonB.nNode+1)); /* 创建一个轨迹顶点列表 */

    }

    void  Sort(NODE  * Node ,  int  n)                       /* 使用简单选择排序进行排序 */
    {
      NODE tNode;
      int i,j,Min=0;

      for(i=0;i<n;i++)
      {
        Min=i;
        for(j=i;j<n;j++)
          if( Node[j].value<Node[Min].value )
              Min=j;
        if(Min!=i)
         {
           tNode=Node[i];
           Node[i]=Node[Min];
           Node[Min]=tNode;
         }
       }  
    }


    int  ConnectNodeList(NODE  *  Node1,  int  nNode1, NODE  * Node2 ,  int  nNode2 , NODE  *  Node ,  int  CONNECTSTYLE)
    {
      int i,j;

      if(CONNECTSTYLE==0)
       {
        for(i=0 ; i<nNode1 ; i++)
          Node[i]=Node1[i];
        for(j=0;j<nNode2;j++)
          Node[i++]=Node2[j];
       }
      else if(CONNECTSTYLE==1)
       {
        for(i=0;i<nNode2;i++)
          Node[i]=Node2[i];

        for(j=0;j<nNode1;j++)
          Node[i++]=Node1[j];
       }
      return (nNode1+nNode2);
    }

    void  CreatEdgeList()
    {
      int i,j,k,npNode1=0,npNode2=0;
      int count=0;

      int CenterOfPolygonAX=0,CenterOfPolygonAY=0;
      int CenterOfPolygonBX=0,CenterOfPolygonBY=0;
      NODE *pNode1,*pNode2;


      for (i=0;i<PolyGonA.nNode;i++)
      {
        CenterOfPolygonAX+=PolyGonA.Node[i].x;
        CenterOfPolygonAY+=PolyGonA.Node[i].y;
      }
       CenterOfPolygonAX=CenterOfPolygonAX/PolyGonA.nNode;
       CenterOfPolygonAY=CenterOfPolygonAY/PolyGonA.nNode;        /* 得到多边形 A 的形心  */
       
      PolyGonA.cx=CenterOfPolygonAX;
      PolyGonA.cy=CenterOfPolygonAY;

      for (i=0;i<PolyGonB.nNode;i++)
      {
        CenterOfPolygonBX+=PolyGonB.Node[i].x;
        CenterOfPolygonBY+=PolyGonB.Node[i].y;
      }
       CenterOfPolygonBX=CenterOfPolygonBX/PolyGonB.nNode;
       CenterOfPolygonBY=CenterOfPolygonBY/PolyGonB.nNode;        /* 得到多边形 B 的形心  */

      PolyGonB.cx=CenterOfPolygonBX;
      PolyGonB.cy=CenterOfPolygonBY;

    /*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/

      i=0;
      j=0;

      pNode1=(NODE *)malloc(sizeof(NODE)*PolyGonA.nNode);
      pNode2=(NODE *)malloc(sizeof(NODE)*PolyGonA.nNode);  /*  临时顶点数组初始化 */

      for(k=0;k<PolyGonA.nNode;k++)
       {
         if(PolyGonA.Node[k].x>=CenterOfPolygonAX)
           {
              pNode1[i]=PolyGonA.Node[k];

              if(pNode1[i].x==CenterOfPolygonAX )
             {
                if(pNode1[i].y>CenterOfPolygonAY)
                  pNode1[i].value=1000;
                else
                  pNode1[i].value=-1000;
              }
             else   
              {
                pNode1[i].value= (double)( pNode1[i].y - CenterOfPolygonAY)/(pNode1[i].x - CenterOfPolygonAX);
              }

              i++;
           }
          else
           {
             pNode2[j]=PolyGonA.Node[k];
             pNode2[j].value= (double)( pNode2[j].y - CenterOfPolygonAY)/(pNode2[j].x - CenterOfPolygonAX);
             j++;
           }
       }
       npNode1=i;
       npNode2=j;

       Sort(pNode1,npNode1);
       Sort(pNode2,npNode2);
       
       count=ConnectNodeList(pNode1, npNode1, pNode2 , npNode2 , PolyGonA.Node , 0);


       free(pNode1);
       free(pNode2);


       for(i=0;i<count;i++)                         /* 对节点进行编号,初始化边列表 */
        {
          PolyGonA.Edge[i].headX=PolyGonA.Node[i].x;
          PolyGonA.Edge[i].headY=PolyGonA.Node[i].y;

          if(i<count-1)  /* 当 i<=count-2 时 */
            {
              PolyGonA.Edge[i].tailX=PolyGonA.Node[i+1].x;
              PolyGonA.Edge[i].tailY=PolyGonA.Node[i+1].y;
            }
          else           /* 当 i=count-1 时 */
            {
              PolyGonA.Edge[i].tailX=PolyGonA.Node[(i+1)%count].x;
              PolyGonA.Edge[i].tailY=PolyGonA.Node[(i+1)%count].y;
            }
        }

    /*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/

      i=0,j=0;

      pNode1=(NODE *)malloc(sizeof(NODE)*PolyGonB.nNode);
      pNode2=(NODE *)malloc(sizeof(NODE)*PolyGonB.nNode);

      for(k=0;k<PolyGonB.nNode;k++)
       {
         if(PolyGonB.Node[k].x>=CenterOfPolygonBX)
           {
             pNode1[i]=PolyGonB.Node[k];

             if(pNode1[i].x==CenterOfPolygonBX )
             {
               if(pNode1[i].y>CenterOfPolygonBY)
                 pNode1[i].value=1000;
               else
                 pNode1[i].value=-1000;
             }
             else
             {
               pNode1[i].value= (double)( pNode1[i].y - CenterOfPolygonBY)/(pNode1[i].x - CenterOfPolygonBX);
             }

              i++;
            }
            else
            {
              pNode2[j]=PolyGonB.Node[k];
              pNode2[j].value= (double)( pNode2[j].y - CenterOfPolygonBY)/(pNode2[j].x - CenterOfPolygonBX);
              j++;
            }
       }
       npNode1=i;
       npNode2=j;

       Sort(pNode1,npNode1);
       Sort(pNode2,npNode2);

       count=ConnectNodeList(pNode1, npNode1, pNode2 , npNode2 , PolyGonB.Node , 1);
       

       free(pNode1);
       free(pNode2);


       for(i=0;i<count;i++)                          /* 对节点进行编号,初始化边列表 */
        {
          PolyGonB.Edge[i].headX=PolyGonB.Node[i].x;
          PolyGonB.Edge[i].headY=PolyGonB.Node[i].y;

          if(i<count-1)  /* 当 i<=count-2 时 */
            {
              PolyGonB.Edge[i].tailX=PolyGonB.Node[i+1].x;
              PolyGonB.Edge[i].tailY=PolyGonB.Node[i+1].y;
            }
          else           /* 当 i=count-1 时 */
            {
              PolyGonB.Edge[i].tailX=PolyGonB.Node[(i+1)%count].x;
              PolyGonB.Edge[i].tailY=PolyGonB.Node[(i+1)%count].y;
            }
        }
    /*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
    }


    void  DrawPolyGon(HDC hDC,EDGE  * Edge, int  n)
    {
      int i,M,N,tmpX=0,tmpY=0;

      N=H;
      
      tmpX=Edge[0].headX;
      tmpY=N-Edge[0].headY;
      
      MoveToEx(hDC,tmpX,tmpY,NULL);

      for(i=0;i<n;i++)
       {
         tmpX=Edge[i].tailX;
         tmpY=N-Edge[i].tailY;
         LineTo(hDC,tmpX,tmpY);
       }
    }

    void  Adjust()
    {

    int i,j,Min=0,Max=0;
    int dx=0,dy=0;

    for(i=1;i<PolyGonA.nNode;i++)
      if(PolyGonA.Node[i].y<=PolyGonA.Node[Min].y)
        Min=i;
    PolyALowX=PolyGonA.Node[Min] .x;
    PolyALowY=PolyGonA.Node[Min] .y;     /* 得到A多边形的最底点坐标 */


    for(i=1;i<PolyGonB.nNode;i++)
      if(PolyGonB.Node[i].y>=PolyGonB.Node[Max].y)
        Max=i;
    PolyBHighX=PolyGonB.Node[Max] .x;
    PolyBHighY=PolyGonB.Node[Max] .y;    /* 得到B多边形的最高点坐标 */


    dx=PolyBHighX-PolyALowX;
    dy=PolyBHighY-PolyALowY;

    for(i=0;i<PolyGonA.nNode;i++)
       {
         PolyGonA.Node[i].x=PolyGonA.Node[i].x+dx;
         PolyGonA.Node[i].y=PolyGonA.Node[i].y+dy;
       
         PolyGonA.Edge[i].headX=PolyGonA.Edge[i].headX+dx;
         PolyGonA.Edge[i].headY=PolyGonA.Edge[i].headY+dy;
         
         PolyGonA.Edge[i].tailX=PolyGonA.Edge[i].tailX+dx;
         PolyGonA.Edge[i].tailY=PolyGonA.Edge[i].tailY+dy;
       }
         PolyGonA.cx=PolyGonA.cx+dx;
         PolyGonA.cy=PolyGonA.cy+dy;
    }

    int  JudgeAcross( int  LP1X, int  LP1Y,  int  LP2X, int  LP2Y, int  CPolyGonAX, int  CPolyGonAY, int  CPolyGonBX, int  CPolyGonBY)
    /* 判断两个点是否在 一条直线的两侧 */
    {
      double k=0;
      double f1=0,f2=0;

      if(LP1X==LP2X)
       {
        if( (CPolyGonAX>LP1X && CPolyGonBX<LP1X) || (CPolyGonAX<LP1X &&CPolyGonBX>LP1X) )
         {
           return 1;
         }
        else
         return 0;
       }
      else
      {
        k=(double)(LP1Y-LP2Y)/(LP1X-LP2X);
        f1=k*(CPolyGonAX-LP1X)-CPolyGonAY+LP1Y;
        f2=k*(CPolyGonBX-LP1X)-CPolyGonBY+LP1Y;
        if(f1*f2<0)
         return 1;
        else
         return 0;   
      }
    }

    int  ChooseEdge(EDGE Edge, int  x, int  y)
    {
      int i,j;
      int LP1X,LP1Y,LP2X,LP2Y;
      int NodeAX=0,NodeAY=0;
      int result=-1;
      
      LP1X=Edge.headX;
      LP1Y=Edge.headY;
      LP2X=Edge.tailX;
      LP2Y=Edge.tailY;
       
      for(j=0;j<PolyGonA.nNode;j++)
        {
           NodeAX=PolyGonA.Node[j].x;
           NodeAY=PolyGonA.Node[j].y;
           if(NodeAX==x&&NodeAY==y)
              continue;
           result=JudgeAcross(LP1X,LP1Y,LP2X,LP2Y,NodeAX,NodeAY,PolyGonB.cx,PolyGonB.cy);
           if(result==0)
              return 0;
        }
      return 1;
    }

    void  DrawPolyGonATo(HDC hDC, int  dx, int  dy)
    {
    int i,N;
    int tmpx=0,tmpy=0;

    N=H;

    tmpx=PolyGonA.cx;
    tmpy=PolyGonA.cy;

    for(i=0;i<PolyGonA.nNode;i++)
       {
         PolyGonA.Node[i].x=PolyGonA.Node[i].x+dx;
         PolyGonA.Node[i].y=PolyGonA.Node[i].y+dy;
       
         PolyGonA.Edge[i].headX=PolyGonA.Edge[i].headX+dx;
         PolyGonA.Edge[i].headY=PolyGonA.Edge[i].headY+dy;
         
         PolyGonA.Edge[i].tailX=PolyGonA.Edge[i].tailX+dx;
         PolyGonA.Edge[i].tailY=PolyGonA.Edge[i].tailY+dy;
       }
         PolyGonA.cx=PolyGonA.cx+dx;
         PolyGonA.cy=PolyGonA.cy+dy;

       DrawPolyGon(hDC,PolyGonA.Edge,PolyGonA.nNode);

    /*   moveto(tmpx,N-tmpy);
       setlinestyle(1,1,1);
       setcolor(10);   
       lineto(PolyGonA.cx,N-PolyGonA.cy);
    */

       MoveToEx(hDC,PolyGonA.cx,N-PolyGonA.cy,NULL);
       LineTo(hDC,PolyGonA.cx,N-PolyGonA.cy);
       
    /*   putpixel(PolyGonA.cx,N-PolyGonA.cy,4);  */
    }

    void  TurnPolyGon(HDC hDC)
    {

      int i,result=-1;
      int CountA=0,CountB=0;
      int indexA=0,indexB=0;
      int Min=0,Max=0;
      int dx=0,dy=0;
      int nTrace=0;  
      int tpx,tpy;
      HPEN hPen;


      for(i=1;i<PolyGonA.nNode;i++)
       if(PolyGonA.Node[i].y<=PolyGonA.Node[Min].y)
         Min=i;

      for(i=0;i<PolyGonA.nNode;i++)
        if(PolyGonA.Edge[i].headX==PolyGonA.Node[Min].x && PolyGonA.Edge[i].headY==PolyGonA.Node[Min].y )
          indexA=i;

      for(i=1;i<PolyGonB.nNode;i++)
       if(PolyGonB.Node[i].y>=PolyGonB.Node[Max].y)
         Max=i;

      for(i=0;i<PolyGonB.nNode;i++)
        if(PolyGonB.Edge[i].headX==PolyGonB.Node[Max].x && PolyGonB.Edge[i].headY==PolyGonB.Node[Max].y )
          indexB=i;

      
      trace[0].x=PolyGonA.cx;
      trace[0].y=PolyGonA.cy;
      nTrace++;                      /* 本段代码记录轨迹顶点的起点坐标 */

      
      Sleep(2000);
      
      
      while(1)
      {

        result=ChooseEdge( PolyGonB.Edge[indexB], PolyGonA.Edge[indexA].headX , PolyGonA.Edge[indexA].headY );
        if(result)
          {   
          
            dx=PolyGonB.Edge[indexB].tailX-PolyGonB.Edge[indexB].headX;
            dy=PolyGonB.Edge[indexB].tailY-PolyGonB.Edge[indexB].headY;

            if(nTrace<=PolyGonA.nNode+PolyGonB.nNode)
             {
                trace[nTrace].x=trace[nTrace-1].x+dx;
                trace[nTrace].y=trace[nTrace-1].y+dy;
                nTrace++;
             }

            hPen=CreatePen(PS_SOLID,1,RGB(192,192,192));
            SelectObject(hDC,hPen);
            DrawPolyGon(hDC,PolyGonA.Edge,PolyGonA.nNode);         
            
            tpx=PolyGonA.cx;
            tpy=PolyGonA.cy;

            hPen=CreatePen(PS_SOLID,1,RGB(255,255,0));
            SelectObject(hDC,hPen);
            DrawPolyGon(hDC,PolyGonB.Edge,PolyGonB.nNode);         
            
            hPen=CreatePen(PS_SOLID,1,RGB(255,0,0));
            SelectObject(hDC,hPen);        
            DrawPolyGonATo(hDC,dx,dy);
            
            MoveToEx(hDC,tpx,H-tpy,NULL);
            hPen=CreatePen(PS_DASHDOT,1,RGB(0,255,0));
            SelectObject(hDC,hPen);  
            LineTo(hDC,PolyGonA.cx,H-PolyGonA.cy);
          
            indexB=(indexB+1)%PolyGonB.nNode;
            CountB++;
            Sleep(1000);
          }
        else
          {
            dx=PolyGonA.Edge[indexA].headX-PolyGonA.Edge[indexA].tailX;
            dy=PolyGonA.Edge[indexA].headY-PolyGonA.Edge[indexA].tailY;

            if(nTrace<=PolyGonA.nNode+PolyGonB.nNode)
             {
                trace[nTrace].x=trace[nTrace-1].x+dx;
                trace[nTrace].y=trace[nTrace-1].y+dy;
                nTrace++;
             }

            hPen=CreatePen(PS_SOLID,1,RGB(192,192,192));
            SelectObject(hDC,hPen);
            DrawPolyGon(hDC,PolyGonA.Edge,PolyGonA.nNode);         

            tpx=PolyGonA.cx;
            tpy=PolyGonA.cy;

            hPen=CreatePen(PS_SOLID,1,RGB(255,255,0));
            SelectObject(hDC,hPen);
            DrawPolyGon(hDC,PolyGonB.Edge,PolyGonB.nNode);         

            hPen=CreatePen(PS_SOLID,1,RGB(255,0,0));
            SelectObject(hDC,hPen);
            DrawPolyGonATo(hDC,dx,dy);

            MoveToEx(hDC,tpx,H-tpy,NULL);
            hPen=CreatePen(PS_DASHDOT,1,RGB(0,255,0));
            SelectObject(hDC,hPen);  
            LineTo(hDC,PolyGonA.cx,H-PolyGonA.cy);

            indexA=(indexA+1)%PolyGonA.nNode;
            CountA++;
            Sleep(1000);
          }
        if(CountA>=PolyGonA.nNode && CountB>=PolyGonB.nNode)
              break;
      }
    }

    void  DrawTrace(HDC hDC)
    {
    int i;
    int tmpx,tmpy;
    int N;

    N=H;

    tmpx=trace[0].x;
    tmpy=N-trace[0].y;

    MoveToEx(hDC,tmpx,tmpy,NULL);
    LineTo(hDC,tmpx,tmpy);


    for(i=1;i<=PolyGonA.nNode+PolyGonB.nNode;i++)
       {
        sleep(1);
        tmpx=trace[i].x;
        tmpy=N-trace[i].y;
        LineTo(hDC,tmpx,tmpy);
        Sleep(500);
       }
    }
                

    LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
    char  szClassName[ ]  =   " NFP 算法 " ;
    int  flag = 0 ;



    int  WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance,
             LPSTR lpszArgument,  int  nFunsterStil)
    {
        HWND hwnd;               /* This is the handle for our window */
        MSG messages;            /* Here messages to the application are saved */
        WNDCLASSEX wincl;        /* Data structure for the windowclass */

        wincl.hInstance = hThisInstance;
        wincl.lpszClassName = szClassName;
        wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
        wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
        wincl.cbSize = sizeof (WNDCLASSEX);

        wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
        wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
        wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
        wincl.lpszMenuName = NULL;                 /* No menu */
        wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
        wincl.cbWndExtra = 0;                      /* structure or the window instance */
        wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

        if (!RegisterClassEx (&wincl))
            return 0;

        hwnd = CreateWindowEx (
               0,                   /* Extended possibilites for variation */
               szClassName,         /* Classname */
               "NFP 算法",       /* Title Text */
               WS_OVERLAPPEDWINDOW, /* default window */
               0,       /* Windows decides the position */
               0,       /* where the window ends up on the screen */
               W,                 /* The programs width */
               H,                 /* and height in pixels */
               HWND_DESKTOP,        /* The window is a child-window to desktop */
               NULL,                /* No menu */
               hThisInstance,       /* Program Instance handler */
               NULL                 /* No Window Creation data */
               );

        ShowWindow(hwnd,nFunsterStil);

        while (GetMessage(&messages, NULL, 0, 0))
        {
            TranslateMessage(&messages);
            DispatchMessage(&messages);
        }

        return messages.wParam;
    }

    LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        HDC hDC;
        PAINTSTRUCT PtStr;
        static HWND hwndButton = 0;
       
       
        switch (message)                  /* handle the messages */
        {
            case WM_CREATE:
                 hwndButton = CreateWindow (
                      "button",/* Builtin button class */
                      "Click Here",
                       WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
                       0, 0, 100, 50,
                       hwnd,/* Parent is this window. */
                       (HMENU) 1,/* Control ID: 1 */
                       ((LPCREATESTRUCT) lParam)->hInstance,
                       NULL  
                       );
                  break;
            case WM_PAINT:

    /*********************************************************/
                  break;

            case WM_COMMAND:
               if (flag==1)
                   break;
               else
                   flag=1;
               /* Check the control ID, notification code and
                 * control handle to see if this is a button click
                 * message from our child button. */
                if (LOWORD(wParam) == 1 &&
                    HIWORD(wParam) == BN_CLICKED &&
                   (HWND) lParam == hwndButton)
                   {
                     /* Our button was clicked. Close the window. */
                      hDC=BeginPaint(hwnd,&PtStr);
                
                      HPEN hPen=CreatePen(PS_SOLID,1,RGB(255,0,0));
                       SelectObject(hDC,hPen);
    /*********************************************************/
                
                      init();
                      CreatEdgeList();
                      DrawPolyGon(hDC,PolyGonA.Edge,PolyGonA.nNode);
                  
                      hPen=CreatePen(PS_SOLID,1,RGB(255,255,0));
                      SelectObject(hDC,hPen);
                
                      DrawPolyGon(hDC,PolyGonB.Edge,PolyGonB.nNode);
                
                      Sleep(5000);
                
                      Adjust();
                   
                      hPen=CreatePen(PS_SOLID,1,RGB(255,0,0));
                      SelectObject(hDC,hPen);
                
                      DrawPolyGon(hDC,PolyGonA.Edge,PolyGonA.nNode);
                
                      TurnPolyGon(hDC);

                      hPen=CreatePen(PS_SOLID,1,RGB(192,192,192));
                      SelectObject(hDC,hPen);
                      DrawPolyGon(hDC,PolyGonB.Edge,PolyGonB.nNode);
                
                      EndPaint(hwnd,&PtStr);
                     }
                      flag=0;
                      break;
                
            case WM_DESTROY:
                PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
                break;
            default:                      /* for messages that we don't deal with */
                return DefWindowProc (hwnd, message, wParam, lParam);
        }

        return 0;
    }
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    关闭

    推荐膜材品牌上一条 /6 下一条

    进口膜材 国产膜材 pvdf膜材ptfe膜材ETFE膜材
    最好的膜结构公司 一级膜结构资质 膜结构一级资质
    膜结构设计-膜结构十大品牌-etfe设计-充气膜结构
    诺科膜结构
    遨都膜结构设计
    中国膜结构网
    中国空间膜结构

    QQ|申请友链|手机版|中国膜结构论坛