查看: 779|回复: 0

关于delaunay的源码

[复制链接]

该用户从未签到

发表于 2012-12-10 21:08:45 | 显示全部楼层 |阅读模式
在DelaunayTriangulator.cpp里 有如下代码
  1. // begin triangulation   
  2.     GLuint pidx = 0;
  3.     osg::Vec3Array::const_iterator i;   
  4.    
  5.     OSG_INFO << "DelaunayTriangulator: triangulating vertex grid (" << (points->size()-3) <<" points)\n";   

  6.     for (i=points->begin(); i!=points->end(); ++i, ++pidx)
  7.     {

  8.         // don't process supertriangle vertices
  9.         if (pidx > last_valid_index) break;

  10.         Edge_set edges;

  11.         // iterate through triangles
  12.         Triangle_list::iterator j, next_j;
  13.         for (j=triangles.begin(); j!=triangles.end(); j = next_j)
  14.         {

  15.             next_j = j;
  16.             ++next_j;

  17.             // get the circumcircle (x,y centre & radius)
  18.             osg::Vec3 cc = j->get_circumcircle();

  19.             // OPTIMIZATION: since points are pre-sorted by the X component,
  20.             // check whether we can discard this triangle for future operations
  21.             float xdist = i->x() - cc.x();
  22.             // this is where the circumcircles radius rather than R^2 is faster.
  23.             // original code used r^2 and needed to test xdist*xdist>cc.z && i->x()>cc.x().
  24.             if ((xdist ) > cc.z() )
  25.             {
  26.                 discarded_tris.push_back(*j); // these are not needed for further tests as no more
  27.                 // points will ever lie inside this triangle.
  28.                 triangles.erase(j);
  29.             }
  30.             else
  31.             {

  32.                 // if the point lies in the triangle's circumcircle then add
  33.                 // its edges to the edge list and remove the triangle
  34.                 if (point_in_circle(*i, cc))
  35.                 {
  36.                     for (int ei=0; ei<3; ++ei)
  37.                     {

  38.                         std::pair<Edge_set::iterator, bool> result = edges.insert(j->get_edge(ei));
  39.                         if (!result.second)
  40.                         {
  41.                             // cast away constness of a set element, which is
  42.                             // safe in this case since the set_duplicate is
  43.                             // not used as part of the Less operator.
  44.                             Edge& edge = const_cast<Edge&>(*(result.first));
  45.                             // not clear why this change is needed? But prevents removal of twice referenced edges??
  46.                       //      edge.set_duplicate(true);
  47.                             edge.set_duplicate(!edge.get_duplicate());
  48.                         }
  49.                     }                    
  50.                     triangles.erase(j);
  51.                 }
  52.                                 //add my own code for remove the triangles where at least one edge is above a threshold
  53.             }
  54.                        
  55.         }
复制代码
我想在//add my own code for remove the triangles where at least one edge is above a threshold 这里添加一些处理 就是去掉那些边长大于一个阈值的三角形 但是不知道他的数据结构是什么? 应该去哪里看? 或者有知道的告诉下  怎么获得三角形的边长?感激不尽!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表