有方法。
我曾经作过。当然没有11万个那么多。不过也有4、5万个顶点。
我采用的方法是把所有的点放到一个数组里面。然后按照在某一个方向上的投影排序,
比如在x轴上的投影,或者其他任意轴上的投影。
然后从数组开头,在tolerance的范围开一个窗口,在这个窗口里的点都有可能重合。
如果这个窗口里面的点比较少,那么直接可以作比较,比较它们是否重合。如果仍然比较多,
那么就按照另外一个(最好是正交的)方向再对这个集合(窗口中的点)进行排序。这个算法的效率还算比较高。不过不知道能不能达到5s。
============================================================================
提问题时标题要简明扼要地说明问题内容,切忌使用"急","求救"之类不能说明问题的标题
http://alphasun.betajin.com/   遇到问题可以给我发消息,给我发信息时请附带原帖地址
DocWizard C++程序文档自动生成工具 | Wave OpenGL | HttpProxy | AjaxParser词法分析

解决方案 »

  1.   

    3D数据格式:STL格式,里面包含有大量的相邻的三角片,重复的顶点是肯定会有的。对11万个三角片的,国外COPYCAD软件就用1秒钟时间,并显示总共顶点数目大概5万多个点。我使用直接比较,还用CMAP以及map方式编程,都没有达到那么优化,不知是否是编程问题。谁能告诉我怎样采用更有效的采用map来处理。
      谢谢!
      

  2.   

    我有个算法,不知时间效率高不高,如果不高,大家别攻击我呀,呵呵!
    为了避免顶点的重复,在为某一顶点的坐标值赋值时,先检查一下该(x,y,z)是否已经被别的点占用;如果是,就跳过去,换别的(x,y,z)。如果不是,再赋值给这个顶点。当然点的数据结构可以至少包括四个成员:
    C3DPoint
    {
    double x;
    double y;
    double z;
    bool bOccupied;//表示该点是否已经被占用!
    };
      

  3.   

    输入数据是否有重合点,这要看模型文件、模型数据的类型了。另外 ljmking(ljmking) ,好像没有民百我的方法的精髓。
      

  4.   

    “先检查一下该(x,y,z)”
    你采用什么方法检查呢?x,y,z是浮点数,没法用来作hash,也没法用来作下标。
    如果是整数的话,到还是可以采用hash。
      

  5.   

    想法变通一下,把浮点数转化为整数不就得了。
    比如:假设浮点数小数点后均保留4位有效数字,构造hash表时,对应点的三个坐标值是它本来的值的10000倍(1*e+4),通过哈希函数定址后再除以10000即可,就转化为本来的三个浮点数坐标值了。
      

  6.   

    mtsh(清风华仔) :
    这是不行的,三维系统都有一个tolerance,比如 10^(-8),这个tolerance是系统的精度。
    整数化之后就会降低精度。系统是不能接受的。问题的本质是整数的表示精度远远比不了浮点数。
      

  7.   

    刚才算了一下,32位无符号整数相当于9位多的十进制数,浮点数的精度是15位十进制数。
    如果tolerance = 10^(-8) 米,并且系统需要处理 10 米 范围的模型,那么,32位无符号数
    的精度,将将够用,没有剩余的精度裕量了。另外,在整数上判断两个点重合,颇为不方便。做误差分析比较麻烦。
      

  8.   

    哦,这样啊目前我还没有对三维系统研究过,缺乏了解,多谢alphapaopao(炮炮)的指点,见笑了。^_^
      

  9.   

    mtsh(清风华仔) :
    客气,客气。
    如果要整数化,可以把浮点数转换成精度相当的定点数,有点麻烦。比如专程用两个32位整数表示的定点数,精度够了。
      

  10.   

    速度快,最关键的在比较上,我觉得这里的比较应该不是只用一个比较方法,而是几种比较方法的综合。比如可以先比较X+Y+Z的值,在比较X,Y,Z,或着是先比较X,Y,Z的最低位,在比较更高位的,还有就是可以先比较X,Y,Z的二进制中1的数目在用其它的比较方法等
      

  11.   

    我觉得 mtsh(清风华仔) 可以考虑,不过不是要把 浮点数转换定点数,只是取该浮点数相对应的定点数来构造哈希表,在哈希表中保存的还是浮点数本身。
      

  12.   

    hash表不能保证相邻的点在相邻的桶里,因为相邻点经过hash,可能处于不同的桶,两个桶不能保证相邻。这样,重合点无法去除了。
      

  13.   

    如果是线性表,按照某个方向排序,这样,相邻的点肯定能在数组上相邻,对于点P,在数组上取前后都是tolerance范围的一段(也就是2*tolearnce)的范围,那么,和P重合的点肯定在这个范围内。当然这个范围内还是可能有不重合的点。移动当前判断点P,从 arr[0], 一直到 arr[n-1],完成一遍扫描,就可以把所有重复点都去除。这个方法还是能大大的减少重复点判断的范围,减少时间复杂度。