CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  图形处理/算法

求助:任意多边形切分成三角形的算法和代码!

楼主wongflying(网飞飞)2004-08-02 15:41:05 在 VC/MFC / 图形处理/算法 提问

我搜索了下以前的贴子,也有人问过,请各位大侠,有这方面的算法和代码,能否mail给我!  
  谢先!  
  wongflying@163.com 问题点数:100、回复次数:8Top

1 楼zxq80(飞越时空)回复于 2004-08-02 15:57:05 得分 30

这是以前别人的  
  给定一简单多边形,找出一个肯定在该多边形内的点  
  定理1:每个多边形至少有一个凸顶点  
  定理2:顶点数>=4的简单多边形至少有一条对角线  
  结论: x坐标最大,最小的点肯定是凸顶点  
            y坐标最大,最小的点肯定是凸顶点                      
  */  
  POINT   a_point_insidepoly(int   vcount,   POINT   polygon[])  
  {  
        POINT   v,   a,   b,   r;  
        int   i,   index;  
        v   =   polygon[0];  
        index   =   0;  
        for(i   =   1;   i   <   vcount;   i++){//寻找一个凸顶点,实际上最低点肯定是凸顶点  
                if(polygon[i].y   <   v.y){  
                        v   =   polygon[i];  
                        index   =   i;  
                }  
        }  
        a   =   polygon[(index   -   1   +   vcount)   %   vcount];           //得到v的前一个顶点  
        b   =   polygon[(index   +   1)   %   vcount];                             //得到v的后一个顶点  
        POINT   tri[3],   q;  
        tri[0]   =   a;  
        tri[1]   =   v;  
        tri[2]   =   b;  
        double   md   =   INF;  
        int   in1   =   index;  
        bool   bin   =   false;  
        for(i   =   0;   i   <   vcount;   i++){   //寻找在三角形avb内且离顶点v最近的顶点q  
                if(i   ==   index)   continue;  
                if(i   ==   (index   -   1   +   vcount)   %   vcount)   continue;  
                if(i   ==   (index   +   1)   %   vcount)   continue;  
                if(!InsideConvexPolygon(3,   tri,   polygon[i]))   continue;  
                bin   =   true;  
                if(dist(v,   polygon[i])   <   md){  
        q   =   polygon[i];  
        md   =   dist(v,   q);  
                }  
        }  
        if(!bin){   //没有顶点在三角形avb内,返回线段ab中点  
                r.x   =   (a.x   +   b.x)   /   2;  
                r.y   =   (a.y   +   b.y)   /   2;  
                return   r;  
        }  
        r.x   =   (v.x   +   q.x)   /   2;           //返回线段vq的中点  
        r.y   =   (v.y   +   q.y)   /   2;  
        return   r;  
  }  
   
   
   
  //上面的函数调用一个InsideConvexPolygon   函数,如下:  
  //点q是凸多边形polygon内时,返回true;  
  //注意:多边形polygon一定要是凸多边形,否则要用射线法来判断,比较复杂  
  bool   InsideConvexPolygon(int   vcount,   POINT   polygon[],   POINT   q)  
  {//   可用于三角形!  
          POINT   p;  
          LINESEG   l;  
          int   i;  
          p.x   =   0;   p.y   =   0;  
          for(i   =   0;   i   <   vcount;   i++){//   寻找一个肯定在多边形polygon内的点p:多边形顶点平均值  
                  p.x   +=   polygon[i].x;  
                  p.y   +=   polygon[i].y;  
          }  
          p.x   /=   vcount;  
          p.y   /=   vcount;  
          for(i   =   0;   i   <   vcount;   i++){  
                  l.s   =   polygon[i];  
                  l.e   =   polygon[(i   +   1)   %   vcount];  
  if(multiply(p,   l.e,   l.s)   *   multiply(q,   l.e,   l.s)   <   0)     /*   点p和点q在边l的两侧,说明  
  点q肯定在多边形外         */  
  break;  
          }  
          return   (i   ==   vcount);  
  }  
   
  //HUNTON自己加的  
  int   multiply(POINT   P,   POINT   P1,   POINT   P2)  
  {  
          return((P2.y   -   P1.y)   *   (P.x   -   P1.x)   +   (P1.y   -   P.y)   *   (P2.x   -   P1.x));  
  }  
   
   
  //从原理上说,要找到一个对角线把多边形分成两个部分,然后对每个部分再重复生成对角线分割就可以得到多边形的一种三角形分割了。  
  POINT   a_point_insidepoly(int   vcount,   POINT   polygon[])  
  {  
          POINT   v,   a,   b,   r;  
          int   i,   index;  
          v   =   polygon[0];  
          index   =   0;  
   
          float   y2   =   v.y;     //   new   line  
         
          for(i   =   1;   i   <   vcount;   i++){//寻找一个凸顶点,实际上最低点肯定是凸顶点  
                  if(polygon[i].y   <   v.y){        
          y2   =   v.y;           //   new   line     次小的Y  
                          v   =   polygon[i];   //   最小的     Y  
                          index   =   i;  
                  }  
          }  
          a   =   polygon[(index   -   1   +   vcount)   %   vcount];               //得到v的前一个顶点  
          b   =   polygon[(index   +   1)   %   vcount];                                 //得到v的后一个顶点  
     
          //   下面是新的代码      
          POINT   p1,   p2;               //   new   line,   保存两边和y=y2的直线的交点  
          if   (   a.y   ==   v.y   )    
  p1   =   a;                           //   边平行于X轴  
          else{  
                  p1.y   =   y2;  
  p1.x   =   a.x   -   (a.y   -   y2)   /   (a.y   -   v.y)   *   (a.x   -   v.x);   //   肯定不会除零  
          }  
          if(   b.y   ==   v.y   )   p2   =   b;   //   边平行于X轴  
          else{  
  p2.y   =   y2;  
  p2.x   =   b.x   -   (b.y   -   y2)   /   (b.y   -   v.y)   *   (b.x   -   v.x);   //   肯定不会除零  
          }  
   
          r.x   =   (v.x   +   p1.x   +   p2.x)   /   3;  
          r.y   =   (v.y   +   p1.y   +   p2.y)   /   3;  
           
          return   r;  
  }  
  Top

2 楼wongflying(网飞飞)回复于 2004-08-02 22:03:41 得分 0

有没有多边形也适用的代码呢?  
  谢先!Top

3 楼syy64(太平洋)回复于 2004-08-03 08:19:11 得分 0

不容易呀,我曾经发过一个这个帖子。Top

4 楼czmissyou(海中石)回复于 2004-08-03 10:01:53 得分 35

我是这样做的:  
  1)   用单向循环链表保存多边形顶点,并计算这个链表中每一个顶点的凸凹性。  
  2)   在循环链表中顺序取三个结点P、Q、R   ,如果Q   为凸点,并且由P、Q、R   所构成的三角形PQR不包含多边形上其他顶点,则计算△PQR   的特征角。求出所有这样的三角形,从中选择特征角最大的△PQR   ,保存该三角形,并从链表中删去结点Q。  
  3)   如果链表中不存在三个以上顶点,则转步骤2)。  
  4)   由链表中的最后三个顶点构成一个三角形。  
  Top

5 楼wongflying(网飞飞)回复于 2004-08-04 19:51:57 得分 0

请问“海中石”有现成的代码么?能否提供,我比较急!谢先!Top

6 楼opentuxedo(借哥哥的号来试试)回复于 2004-08-04 20:07:04 得分 35

这还要什么现成代码,记得当初写这个算法时才用了半小时。就是一个循环链表,见凸点就切掉。凸点计算可以用向量叉乘  
  |i     j     k   |  
  |x1   y1   z1|  
  |x2   y2   z2|  
  其中z1=z2=0   ,不说了,自己想吧。Top

7 楼alphapaopao(炮炮)回复于 2004-08-05 09:21:45 得分 0

请教:  
   
  “并且由P、Q、R   所构成的三角形PQR不包含多边形上其他顶点”      
  如果包含其它顶点怎么办?  
   
  请问什么叫做   “特征角”Top

8 楼czmissyou(海中石)回复于 2004-12-06 20:55:38 得分 0

不好意思,没有看到这里还有一个贴子。  
   
  特征角就是三角形中最小的那个角。  
   
  由于多边形顶点是顺时针或逆时针连接起来的,顺序连接起来的三个顶点不可能包含其它顶点。Top

相关问题

  • 求 多边形 转 三角形 C++ 函数,有可能是凹多边形!
  • 用TShape控件可以显示三角形、多边形吗?
  • 请教关于多边形的三角形化的问题
  • 请教多边形填充算法
  • 如何判断一个点是否在封闭多边形内部呢?各位DX请不吝赐教,给出算法代码,谢谢!
  • 请教:求任意简单多边形面积的算法
  • 请教:两个简单多边形是否相交的算法
  • 平面上多边形边的最小间距算法
  • 2D多边形投影算法求解.立马加分!在线...
  • 请教:判断一个简单多边形是否在另一个多边形之内的算法

关键词

  • 算法
  • 代码
  • 坐标
  • 多边形
  • 定理
  • polygon
  • 算法和代码
  • point
  • 简单
  • 点肯定是凸顶点

得分解答快速导航

  • 帖主:wongflying
  • zxq80
  • czmissyou
  • opentuxedo

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo