天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 97|回复: 0

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

[复制链接]
  • TA的每日心情
    开心
    2024-8-31 15:58
  • 签到天数: 89 天

    [LV.6]常住居民II

    488

    主题

    207

    回帖

    3366

    积分

    管理员

    积分
    3366
    发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
    1. 最近我写了一个关于凸多边形碰撞的NFP算法的小程序,这里把代码传上来大家看一看。程序是用devc++实现的windowsAPI程序。
    2. 代码如下:
    3. #include  < windows.h >
    4. #include  < stdlib.h >  
    5. #include  < stdio.h >  
    6. #include  < conio.h >  
    7. #include  < dos.h >
    8. #define  H 600
    9. #define  W 800
    10. typedef  struct  node  {   /*  定义的顶点结构 */
    11.    int x;
    12.    int y;
    13.    double value;
    14. } NODE;
    15. typedef  struct  edage {   /*  定义的边结构 */
    16.    int headX;
    17.    int headY;
    18.    int tailX;
    19.    int tailY;
    20. } EDGE;   
    21. typedef  struct  polygon {  /* 定义的多边形结构 */
    22.    NODE *Node;
    23.    EDGE *Edge;
    24.    int cx;
    25.    int cy;
    26.    int nNode;
    27. } PolyGon;
    28. PolyGon PolyGonA;        /*  声明多边形 A 变量 */
    29. PolyGon PolyGonB;        /*  声明多边形 B 变量 */
    30. NODE  *  trace;
    31. int  PolyALowX = 0 ,PolyALowY = 0 ;
    32. int  PolyBHighX = 0 ,PolyBHighY = 0 ;
    33. int  mycolor = 1 ;
    34. void  init()
    35. {
    36. FILE *fp;
    37. int i;
    38. PolyGonA.nNode=0;
    39. PolyGonB.nNode=0;
    40. if( ( fp=fopen("d:/polygon.txt","r") ) ==NULL )
    41.   {
    42.     printf("Open file failed  ");
    43.     exit(0);
    44.   }
    45.   fscanf( fp , "%d" , &PolyGonA.nNode);
    46.   PolyGonA.Node = ( NODE *) malloc( sizeof(NODE)*PolyGonA.nNode );
    47.   PolyGonA.Edge = ( EDGE *) malloc( sizeof(EDGE)*PolyGonA.nNode );
    48.   for(i=0;i<PolyGonA.nNode;i++)
    49.    fscanf( fp , "%d%d", &PolyGonA.Node[i].x , &PolyGonA.Node[i].y );  /*   读数据文件内容到多边形变量中 */
    50.   fscanf( fp , "%d" , &PolyGonB.nNode);
    51.   PolyGonB.Node = ( NODE *) malloc( sizeof(NODE)*PolyGonB.nNode );
    52.   PolyGonB.Edge = ( EDGE *) malloc( sizeof(EDGE)*PolyGonB.nNode );
    53.   for(i=0;i<PolyGonB.nNode;i++)
    54.    fscanf( fp , "%d%d", &PolyGonB.Node[i].x , &PolyGonB.Node[i].y );  /*   读数据文件内容到多边形变量中 */
    55.   fclose(fp);
    56.   trace=(NODE *)malloc(sizeof(NODE)*(PolyGonA.nNode+PolyGonB.nNode+1)); /* 创建一个轨迹顶点列表 */
    57. }
    58. void  Sort(NODE  * Node ,  int  n)                       /* 使用简单选择排序进行排序 */
    59. {
    60.   NODE tNode;
    61.   int i,j,Min=0;
    62.   for(i=0;i<n;i++)
    63.   {
    64.     Min=i;
    65.     for(j=i;j<n;j++)
    66.       if( Node[j].value<Node[Min].value )
    67.           Min=j;
    68.     if(Min!=i)
    69.      {
    70.        tNode=Node[i];
    71.        Node[i]=Node[Min];
    72.        Node[Min]=tNode;
    73.      }
    74.    }  
    75. }
    76. int  ConnectNodeList(NODE  *  Node1,  int  nNode1, NODE  * Node2 ,  int  nNode2 , NODE  *  Node ,  int  CONNECTSTYLE)
    77. {
    78.   int i,j;
    79.   if(CONNECTSTYLE==0)
    80.    {
    81.     for(i=0 ; i<nNode1 ; i++)
    82.       Node[i]=Node1[i];
    83.     for(j=0;j<nNode2;j++)
    84.       Node[i++]=Node2[j];
    85.    }
    86.   else if(CONNECTSTYLE==1)
    87.    {
    88.     for(i=0;i<nNode2;i++)
    89.       Node[i]=Node2[i];
    90.     for(j=0;j<nNode1;j++)
    91.       Node[i++]=Node1[j];
    92.    }
    93.   return (nNode1+nNode2);
    94. }
    95. void  CreatEdgeList()
    96. {
    97.   int i,j,k,npNode1=0,npNode2=0;
    98.   int count=0;
    99.   int CenterOfPolygonAX=0,CenterOfPolygonAY=0;
    100.   int CenterOfPolygonBX=0,CenterOfPolygonBY=0;
    101.   NODE *pNode1,*pNode2;
    102.   for (i=0;i<PolyGonA.nNode;i++)
    103.   {
    104.     CenterOfPolygonAX+=PolyGonA.Node[i].x;
    105.     CenterOfPolygonAY+=PolyGonA.Node[i].y;
    106.   }
    107.    CenterOfPolygonAX=CenterOfPolygonAX/PolyGonA.nNode;
    108.    CenterOfPolygonAY=CenterOfPolygonAY/PolyGonA.nNode;        /* 得到多边形 A 的形心  */
    109.    
    110.   PolyGonA.cx=CenterOfPolygonAX;
    111.   PolyGonA.cy=CenterOfPolygonAY;
    112.   for (i=0;i<PolyGonB.nNode;i++)
    113.   {
    114.     CenterOfPolygonBX+=PolyGonB.Node[i].x;
    115.     CenterOfPolygonBY+=PolyGonB.Node[i].y;
    116.   }
    117.    CenterOfPolygonBX=CenterOfPolygonBX/PolyGonB.nNode;
    118.    CenterOfPolygonBY=CenterOfPolygonBY/PolyGonB.nNode;        /* 得到多边形 B 的形心  */
    119.   PolyGonB.cx=CenterOfPolygonBX;
    120.   PolyGonB.cy=CenterOfPolygonBY;
    121. /*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
    122.   i=0;
    123.   j=0;
    124.   pNode1=(NODE *)malloc(sizeof(NODE)*PolyGonA.nNode);
    125.   pNode2=(NODE *)malloc(sizeof(NODE)*PolyGonA.nNode);  /*  临时顶点数组初始化 */
    126.   for(k=0;k<PolyGonA.nNode;k++)
    127.    {
    128.      if(PolyGonA.Node[k].x>=CenterOfPolygonAX)
    129.        {
    130.           pNode1[i]=PolyGonA.Node[k];
    131.           if(pNode1[i].x==CenterOfPolygonAX )
    132.          {
    133.             if(pNode1[i].y>CenterOfPolygonAY)
    134.               pNode1[i].value=1000;
    135.             else
    136.               pNode1[i].value=-1000;
    137.           }
    138.          else   
    139.           {
    140.             pNode1[i].value= (double)( pNode1[i].y - CenterOfPolygonAY)/(pNode1[i].x - CenterOfPolygonAX);
    141.           }
    142.           i++;
    143.        }
    144.       else
    145.        {
    146.          pNode2[j]=PolyGonA.Node[k];
    147.          pNode2[j].value= (double)( pNode2[j].y - CenterOfPolygonAY)/(pNode2[j].x - CenterOfPolygonAX);
    148.          j++;
    149.        }
    150.    }
    151.    npNode1=i;
    152.    npNode2=j;
    153.    Sort(pNode1,npNode1);
    154.    Sort(pNode2,npNode2);
    155.    
    156.    count=ConnectNodeList(pNode1, npNode1, pNode2 , npNode2 , PolyGonA.Node , 0);
    157.    free(pNode1);
    158.    free(pNode2);
    159.    for(i=0;i<count;i++)                         /* 对节点进行编号,初始化边列表 */
    160.     {
    161.       PolyGonA.Edge[i].headX=PolyGonA.Node[i].x;
    162.       PolyGonA.Edge[i].headY=PolyGonA.Node[i].y;
    163.       if(i<count-1)  /* 当 i<=count-2 时 */
    164.         {
    165.           PolyGonA.Edge[i].tailX=PolyGonA.Node[i+1].x;
    166.           PolyGonA.Edge[i].tailY=PolyGonA.Node[i+1].y;
    167.         }
    168.       else           /* 当 i=count-1 时 */
    169.         {
    170.           PolyGonA.Edge[i].tailX=PolyGonA.Node[(i+1)%count].x;
    171.           PolyGonA.Edge[i].tailY=PolyGonA.Node[(i+1)%count].y;
    172.         }
    173.     }
    174. /*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
    175.   i=0,j=0;
    176.   pNode1=(NODE *)malloc(sizeof(NODE)*PolyGonB.nNode);
    177.   pNode2=(NODE *)malloc(sizeof(NODE)*PolyGonB.nNode);
    178.   for(k=0;k<PolyGonB.nNode;k++)
    179.    {
    180.      if(PolyGonB.Node[k].x>=CenterOfPolygonBX)
    181.        {
    182.          pNode1[i]=PolyGonB.Node[k];
    183.          if(pNode1[i].x==CenterOfPolygonBX )
    184.          {
    185.            if(pNode1[i].y>CenterOfPolygonBY)
    186.              pNode1[i].value=1000;
    187.            else
    188.              pNode1[i].value=-1000;
    189.          }
    190.          else
    191.          {
    192.            pNode1[i].value= (double)( pNode1[i].y - CenterOfPolygonBY)/(pNode1[i].x - CenterOfPolygonBX);
    193.          }
    194.           i++;
    195.         }
    196.         else
    197.         {
    198.           pNode2[j]=PolyGonB.Node[k];
    199.           pNode2[j].value= (double)( pNode2[j].y - CenterOfPolygonBY)/(pNode2[j].x - CenterOfPolygonBX);
    200.           j++;
    201.         }
    202.    }
    203.    npNode1=i;
    204.    npNode2=j;
    205.    Sort(pNode1,npNode1);
    206.    Sort(pNode2,npNode2);
    207.    count=ConnectNodeList(pNode1, npNode1, pNode2 , npNode2 , PolyGonB.Node , 1);
    208.    
    209.    free(pNode1);
    210.    free(pNode2);
    211.    for(i=0;i<count;i++)                          /* 对节点进行编号,初始化边列表 */
    212.     {
    213.       PolyGonB.Edge[i].headX=PolyGonB.Node[i].x;
    214.       PolyGonB.Edge[i].headY=PolyGonB.Node[i].y;
    215.       if(i<count-1)  /* 当 i<=count-2 时 */
    216.         {
    217.           PolyGonB.Edge[i].tailX=PolyGonB.Node[i+1].x;
    218.           PolyGonB.Edge[i].tailY=PolyGonB.Node[i+1].y;
    219.         }
    220.       else           /* 当 i=count-1 时 */
    221.         {
    222.           PolyGonB.Edge[i].tailX=PolyGonB.Node[(i+1)%count].x;
    223.           PolyGonB.Edge[i].tailY=PolyGonB.Node[(i+1)%count].y;
    224.         }
    225.     }
    226. /*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
    227. }
    228. void  DrawPolyGon(HDC hDC,EDGE  * Edge, int  n)
    229. {
    230.   int i,M,N,tmpX=0,tmpY=0;
    231.   N=H;
    232.   
    233.   tmpX=Edge[0].headX;
    234.   tmpY=N-Edge[0].headY;
    235.   
    236.   MoveToEx(hDC,tmpX,tmpY,NULL);
    237.   for(i=0;i<n;i++)
    238.    {
    239.      tmpX=Edge[i].tailX;
    240.      tmpY=N-Edge[i].tailY;
    241.      LineTo(hDC,tmpX,tmpY);
    242.    }
    243. }
    244. void  Adjust()
    245. {
    246. int i,j,Min=0,Max=0;
    247. int dx=0,dy=0;
    248. for(i=1;i<PolyGonA.nNode;i++)
    249.   if(PolyGonA.Node[i].y<=PolyGonA.Node[Min].y)
    250.     Min=i;
    251. PolyALowX=PolyGonA.Node[Min] .x;
    252. PolyALowY=PolyGonA.Node[Min] .y;     /* 得到A多边形的最底点坐标 */
    253. for(i=1;i<PolyGonB.nNode;i++)
    254.   if(PolyGonB.Node[i].y>=PolyGonB.Node[Max].y)
    255.     Max=i;
    256. PolyBHighX=PolyGonB.Node[Max] .x;
    257. PolyBHighY=PolyGonB.Node[Max] .y;    /* 得到B多边形的最高点坐标 */
    258. dx=PolyBHighX-PolyALowX;
    259. dy=PolyBHighY-PolyALowY;
    260. for(i=0;i<PolyGonA.nNode;i++)
    261.    {
    262.      PolyGonA.Node[i].x=PolyGonA.Node[i].x+dx;
    263.      PolyGonA.Node[i].y=PolyGonA.Node[i].y+dy;
    264.    
    265.      PolyGonA.Edge[i].headX=PolyGonA.Edge[i].headX+dx;
    266.      PolyGonA.Edge[i].headY=PolyGonA.Edge[i].headY+dy;
    267.      
    268.      PolyGonA.Edge[i].tailX=PolyGonA.Edge[i].tailX+dx;
    269.      PolyGonA.Edge[i].tailY=PolyGonA.Edge[i].tailY+dy;
    270.    }
    271.      PolyGonA.cx=PolyGonA.cx+dx;
    272.      PolyGonA.cy=PolyGonA.cy+dy;
    273. }
    274. int  JudgeAcross( int  LP1X, int  LP1Y,  int  LP2X, int  LP2Y, int  CPolyGonAX, int  CPolyGonAY, int  CPolyGonBX, int  CPolyGonBY)
    275. /* 判断两个点是否在 一条直线的两侧 */
    276. {
    277.   double k=0;
    278.   double f1=0,f2=0;
    279.   if(LP1X==LP2X)
    280.    {
    281.     if( (CPolyGonAX>LP1X && CPolyGonBX<LP1X) || (CPolyGonAX<LP1X &&CPolyGonBX>LP1X) )
    282.      {
    283.        return 1;
    284.      }
    285.     else
    286.      return 0;
    287.    }
    288.   else
    289.   {
    290.     k=(double)(LP1Y-LP2Y)/(LP1X-LP2X);
    291.     f1=k*(CPolyGonAX-LP1X)-CPolyGonAY+LP1Y;
    292.     f2=k*(CPolyGonBX-LP1X)-CPolyGonBY+LP1Y;
    293.     if(f1*f2<0)
    294.      return 1;
    295.     else
    296.      return 0;   
    297.   }
    298. }
    299. int  ChooseEdge(EDGE Edge, int  x, int  y)
    300. {
    301.   int i,j;
    302.   int LP1X,LP1Y,LP2X,LP2Y;
    303.   int NodeAX=0,NodeAY=0;
    304.   int result=-1;
    305.   
    306.   LP1X=Edge.headX;
    307.   LP1Y=Edge.headY;
    308.   LP2X=Edge.tailX;
    309.   LP2Y=Edge.tailY;
    310.    
    311.   for(j=0;j<PolyGonA.nNode;j++)
    312.     {
    313.        NodeAX=PolyGonA.Node[j].x;
    314.        NodeAY=PolyGonA.Node[j].y;
    315.        if(NodeAX==x&&NodeAY==y)
    316.           continue;
    317.        result=JudgeAcross(LP1X,LP1Y,LP2X,LP2Y,NodeAX,NodeAY,PolyGonB.cx,PolyGonB.cy);
    318.        if(result==0)
    319.           return 0;
    320.     }
    321.   return 1;
    322. }
    323. void  DrawPolyGonATo(HDC hDC, int  dx, int  dy)
    324. {
    325. int i,N;
    326. int tmpx=0,tmpy=0;
    327. N=H;
    328. tmpx=PolyGonA.cx;
    329. tmpy=PolyGonA.cy;
    330. for(i=0;i<PolyGonA.nNode;i++)
    331.    {
    332.      PolyGonA.Node[i].x=PolyGonA.Node[i].x+dx;
    333.      PolyGonA.Node[i].y=PolyGonA.Node[i].y+dy;
    334.    
    335.      PolyGonA.Edge[i].headX=PolyGonA.Edge[i].headX+dx;
    336.      PolyGonA.Edge[i].headY=PolyGonA.Edge[i].headY+dy;
    337.      
    338.      PolyGonA.Edge[i].tailX=PolyGonA.Edge[i].tailX+dx;
    339.      PolyGonA.Edge[i].tailY=PolyGonA.Edge[i].tailY+dy;
    340.    }
    341.      PolyGonA.cx=PolyGonA.cx+dx;
    342.      PolyGonA.cy=PolyGonA.cy+dy;
    343.    DrawPolyGon(hDC,PolyGonA.Edge,PolyGonA.nNode);
    344. /*   moveto(tmpx,N-tmpy);
    345.    setlinestyle(1,1,1);
    346.    setcolor(10);   
    347.    lineto(PolyGonA.cx,N-PolyGonA.cy);
    348. */
    349.    MoveToEx(hDC,PolyGonA.cx,N-PolyGonA.cy,NULL);
    350.    LineTo(hDC,PolyGonA.cx,N-PolyGonA.cy);
    351.    
    352. /*   putpixel(PolyGonA.cx,N-PolyGonA.cy,4);  */
    353. }
    354. void  TurnPolyGon(HDC hDC)
    355. {
    356.   int i,result=-1;
    357.   int CountA=0,CountB=0;
    358.   int indexA=0,indexB=0;
    359.   int Min=0,Max=0;
    360.   int dx=0,dy=0;
    361.   int nTrace=0;  
    362.   int tpx,tpy;
    363.   HPEN hPen;
    364.   for(i=1;i<PolyGonA.nNode;i++)
    365.    if(PolyGonA.Node[i].y<=PolyGonA.Node[Min].y)
    366.      Min=i;
    367.   for(i=0;i<PolyGonA.nNode;i++)
    368.     if(PolyGonA.Edge[i].headX==PolyGonA.Node[Min].x && PolyGonA.Edge[i].headY==PolyGonA.Node[Min].y )
    369.       indexA=i;
    370.   for(i=1;i<PolyGonB.nNode;i++)
    371.    if(PolyGonB.Node[i].y>=PolyGonB.Node[Max].y)
    372.      Max=i;
    373.   for(i=0;i<PolyGonB.nNode;i++)
    374.     if(PolyGonB.Edge[i].headX==PolyGonB.Node[Max].x && PolyGonB.Edge[i].headY==PolyGonB.Node[Max].y )
    375.       indexB=i;
    376.   
    377.   trace[0].x=PolyGonA.cx;
    378.   trace[0].y=PolyGonA.cy;
    379.   nTrace++;                      /* 本段代码记录轨迹顶点的起点坐标 */
    380.   
    381.   Sleep(2000);
    382.   
    383.   
    384.   while(1)
    385.   {
    386.     result=ChooseEdge( PolyGonB.Edge[indexB], PolyGonA.Edge[indexA].headX , PolyGonA.Edge[indexA].headY );
    387.     if(result)
    388.       {   
    389.       
    390.         dx=PolyGonB.Edge[indexB].tailX-PolyGonB.Edge[indexB].headX;
    391.         dy=PolyGonB.Edge[indexB].tailY-PolyGonB.Edge[indexB].headY;
    392.         if(nTrace<=PolyGonA.nNode+PolyGonB.nNode)
    393.          {
    394.             trace[nTrace].x=trace[nTrace-1].x+dx;
    395.             trace[nTrace].y=trace[nTrace-1].y+dy;
    396.             nTrace++;
    397.          }
    398.         hPen=CreatePen(PS_SOLID,1,RGB(192,192,192));
    399.         SelectObject(hDC,hPen);
    400.         DrawPolyGon(hDC,PolyGonA.Edge,PolyGonA.nNode);         
    401.         
    402.         tpx=PolyGonA.cx;
    403.         tpy=PolyGonA.cy;
    404.         hPen=CreatePen(PS_SOLID,1,RGB(255,255,0));
    405.         SelectObject(hDC,hPen);
    406.         DrawPolyGon(hDC,PolyGonB.Edge,PolyGonB.nNode);         
    407.         
    408.         hPen=CreatePen(PS_SOLID,1,RGB(255,0,0));
    409.         SelectObject(hDC,hPen);        
    410.         DrawPolyGonATo(hDC,dx,dy);
    411.         
    412.         MoveToEx(hDC,tpx,H-tpy,NULL);
    413.         hPen=CreatePen(PS_DASHDOT,1,RGB(0,255,0));
    414.         SelectObject(hDC,hPen);  
    415.         LineTo(hDC,PolyGonA.cx,H-PolyGonA.cy);
    416.       
    417.         indexB=(indexB+1)%PolyGonB.nNode;
    418.         CountB++;
    419.         Sleep(1000);
    420.       }
    421.     else
    422.       {
    423.         dx=PolyGonA.Edge[indexA].headX-PolyGonA.Edge[indexA].tailX;
    424.         dy=PolyGonA.Edge[indexA].headY-PolyGonA.Edge[indexA].tailY;
    425.         if(nTrace<=PolyGonA.nNode+PolyGonB.nNode)
    426.          {
    427.             trace[nTrace].x=trace[nTrace-1].x+dx;
    428.             trace[nTrace].y=trace[nTrace-1].y+dy;
    429.             nTrace++;
    430.          }
    431.         hPen=CreatePen(PS_SOLID,1,RGB(192,192,192));
    432.         SelectObject(hDC,hPen);
    433.         DrawPolyGon(hDC,PolyGonA.Edge,PolyGonA.nNode);         
    434.         tpx=PolyGonA.cx;
    435.         tpy=PolyGonA.cy;
    436.         hPen=CreatePen(PS_SOLID,1,RGB(255,255,0));
    437.         SelectObject(hDC,hPen);
    438.         DrawPolyGon(hDC,PolyGonB.Edge,PolyGonB.nNode);         
    439.         hPen=CreatePen(PS_SOLID,1,RGB(255,0,0));
    440.         SelectObject(hDC,hPen);
    441.         DrawPolyGonATo(hDC,dx,dy);
    442.         MoveToEx(hDC,tpx,H-tpy,NULL);
    443.         hPen=CreatePen(PS_DASHDOT,1,RGB(0,255,0));
    444.         SelectObject(hDC,hPen);  
    445.         LineTo(hDC,PolyGonA.cx,H-PolyGonA.cy);
    446.         indexA=(indexA+1)%PolyGonA.nNode;
    447.         CountA++;
    448.         Sleep(1000);
    449.       }
    450.     if(CountA>=PolyGonA.nNode && CountB>=PolyGonB.nNode)
    451.           break;
    452.   }
    453. }
    454. void  DrawTrace(HDC hDC)
    455. {
    456. int i;
    457. int tmpx,tmpy;
    458. int N;
    459. N=H;
    460. tmpx=trace[0].x;
    461. tmpy=N-trace[0].y;
    462. MoveToEx(hDC,tmpx,tmpy,NULL);
    463. LineTo(hDC,tmpx,tmpy);
    464. for(i=1;i<=PolyGonA.nNode+PolyGonB.nNode;i++)
    465.    {
    466.     sleep(1);
    467.     tmpx=trace[i].x;
    468.     tmpy=N-trace[i].y;
    469.     LineTo(hDC,tmpx,tmpy);
    470.     Sleep(500);
    471.    }
    472. }
    473.             
    474. LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
    475. char  szClassName[ ]  =   " NFP 算法 " ;
    476. int  flag = 0 ;
    477. int  WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance,
    478.          LPSTR lpszArgument,  int  nFunsterStil)
    479. {
    480.     HWND hwnd;               /* This is the handle for our window */
    481.     MSG messages;            /* Here messages to the application are saved */
    482.     WNDCLASSEX wincl;        /* Data structure for the windowclass */
    483.     wincl.hInstance = hThisInstance;
    484.     wincl.lpszClassName = szClassName;
    485.     wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
    486.     wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
    487.     wincl.cbSize = sizeof (WNDCLASSEX);
    488.     wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    489.     wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    490.     wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    491.     wincl.lpszMenuName = NULL;                 /* No menu */
    492.     wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
    493.     wincl.cbWndExtra = 0;                      /* structure or the window instance */
    494.     wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
    495.     if (!RegisterClassEx (&wincl))
    496.         return 0;
    497.     hwnd = CreateWindowEx (
    498.            0,                   /* Extended possibilites for variation */
    499.            szClassName,         /* Classname */
    500.            "NFP 算法",       /* Title Text */
    501.            WS_OVERLAPPEDWINDOW, /* default window */
    502.            0,       /* Windows decides the position */
    503.            0,       /* where the window ends up on the screen */
    504.            W,                 /* The programs width */
    505.            H,                 /* and height in pixels */
    506.            HWND_DESKTOP,        /* The window is a child-window to desktop */
    507.            NULL,                /* No menu */
    508.            hThisInstance,       /* Program Instance handler */
    509.            NULL                 /* No Window Creation data */
    510.            );
    511.     ShowWindow(hwnd,nFunsterStil);
    512.     while (GetMessage(&messages, NULL, 0, 0))
    513.     {
    514.         TranslateMessage(&messages);
    515.         DispatchMessage(&messages);
    516.     }
    517.     return messages.wParam;
    518. }
    519. LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    520. {
    521.     HDC hDC;
    522.     PAINTSTRUCT PtStr;
    523.     static HWND hwndButton = 0;
    524.    
    525.    
    526.     switch (message)                  /* handle the messages */
    527.     {
    528.         case WM_CREATE:
    529.              hwndButton = CreateWindow (
    530.                   "button",/* Builtin button class */
    531.                   "Click Here",
    532.                    WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
    533.                    0, 0, 100, 50,
    534.                    hwnd,/* Parent is this window. */
    535.                    (HMENU) 1,/* Control ID: 1 */
    536.                    ((LPCREATESTRUCT) lParam)->hInstance,
    537.                    NULL  
    538.                    );
    539.               break;
    540.         case WM_PAINT:
    541. /*********************************************************/
    542.               break;
    543.         case WM_COMMAND:
    544.            if (flag==1)
    545.                break;
    546.            else
    547.                flag=1;
    548.            /* Check the control ID, notification code and
    549.              * control handle to see if this is a button click
    550.              * message from our child button. */
    551.             if (LOWORD(wParam) == 1 &&
    552.                 HIWORD(wParam) == BN_CLICKED &&
    553.                (HWND) lParam == hwndButton)
    554.                {
    555.                  /* Our button was clicked. Close the window. */
    556.                   hDC=BeginPaint(hwnd,&PtStr);
    557.             
    558.                   HPEN hPen=CreatePen(PS_SOLID,1,RGB(255,0,0));
    559.                    SelectObject(hDC,hPen);
    560. /*********************************************************/
    561.             
    562.                   init();
    563.                   CreatEdgeList();
    564.                   DrawPolyGon(hDC,PolyGonA.Edge,PolyGonA.nNode);
    565.               
    566.                   hPen=CreatePen(PS_SOLID,1,RGB(255,255,0));
    567.                   SelectObject(hDC,hPen);
    568.             
    569.                   DrawPolyGon(hDC,PolyGonB.Edge,PolyGonB.nNode);
    570.             
    571.                   Sleep(5000);
    572.             
    573.                   Adjust();
    574.                
    575.                   hPen=CreatePen(PS_SOLID,1,RGB(255,0,0));
    576.                   SelectObject(hDC,hPen);
    577.             
    578.                   DrawPolyGon(hDC,PolyGonA.Edge,PolyGonA.nNode);
    579.             
    580.                   TurnPolyGon(hDC);
    581.                   hPen=CreatePen(PS_SOLID,1,RGB(192,192,192));
    582.                   SelectObject(hDC,hPen);
    583.                   DrawPolyGon(hDC,PolyGonB.Edge,PolyGonB.nNode);
    584.             
    585.                   EndPaint(hwnd,&PtStr);
    586.                  }
    587.                   flag=0;
    588.                   break;
    589.             
    590.         case WM_DESTROY:
    591.             PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
    592.             break;
    593.         default:                      /* for messages that we don't deal with */
    594.             return DefWindowProc (hwnd, message, wParam, lParam);
    595.     }
    596.     return 0;
    597. }
    复制代码

     

     

     

     

    凸多边形碰撞的NFP算法实现
    中国膜结构网打造全中国最好的膜结构综合平台 ,统一协调膜结构设计,膜结构施工,膜材采购,膜材定制,膜结构预算全方位服务。 中国空间膜结构协会合作单位。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池| |网站地图

    GMT+8, 2024-9-8 09:13 , Processed in 0.066885 second(s), 26 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表