`
daojin
  • 浏览: 676762 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

二叉树代码我写得很乱!!!整理一下思路

阅读更多

从初始话开始,一个是构造,一个是更新:

 

原来的意思是没有分割。。。但是:

 

     由于总的三角形的数量在分割过程中不断地更新,因此要不断地去构造新的三角形列表。因此所有的LIST必须保存真实的。而不能仅仅保存一个索引!!!

 

先说怎么构造:

 

1. 

   //这个可以写一个函数用来筛选!

   得到三角形列表,和已经用过的平面列表,构造备用分割面列表;

   //首先,从中剔除相同的面。思路是:

   for each  i in sanjiaoxing{

      //检查是否已经存在

      bool InUse=false;

       for each j in  BeiyongDividList 

       {

             if(已经存在)

              {

                    InUse=true;break;

              }

       }    

      for each j in  DividList 

       {

             if(已经存在)

              {

                    InUse=true;break;

              }

       }     

      //在这里根据INUSE的值来确定是否ADD

      if(!InUse)DividList.add(i);

  }

 

 

2。从备用的LIST里面选择一个最佳的的分割面,这个分割面可以用来分割所有的三角形集合。

 

     把这个分割面加到已经用过的分割面列表里。

 

3. 用最佳的分割面来分割所有的三角形集合为前集合,和后集合。

 

   

   

节点组成: 一个分割面。

叶子组成: 一组面的集合。

 

如果把这两个结合起来,那就是:

 

 

class Node {

   bool IsLeaf;

   DivideFlat flat;

   Pologons plos;

};

 

 

二:更新:

 

   1.节点获得三角形列表

   2.如果这个节点是节点:

         {

             利用分割面分割这些三角形列表。

             调用子节点的更新(方法)。也就是递归调用。

         } 

   3.如果是叶子。我们把这个三角形表加到自身的三角形表里面。调用自身的创建方法。

三。两者结合:

算法:

   0.初始化根节点为叶子。没有分割面,没有多变形列表。

   1.节点通过函数参数获得三角形列表。

   2.如果是叶子,我们把这个三角形表加到自身的三角形表里面,从中选择最好的分割面。       

   3.如果找不到,函数返回。

   4.如果找到了,分割三角形列表。把自己提升为节点,同时,设置子节点为叶子,把三角形列表传给子节点的本函数。转1.

   5.如果不是叶子,利用已经存在的分割面来分割此三角形列表。调用子节点的本函数。转1.

四。附加数据:

   一个是已用的三角形列表。。。这个应该是每棵树一个。。

   一个是备用的分割面列表。。。这个只有是叶子的时候才会起作用,而且是局部变量。  

 

五。我也在想这样一个问题:

 

      如果说,一开始对所有的三角形,按照所在平面进行分类,每一个或者更多三角形对应于平面列表中的某一个索引。

 

      也就是说创建一个List数组,来将三角形本身的数组索引与平面索引对应起来。。。。

    

      如果这样做:

           一个是平面的管理:只需要添加,坚决不能删除。

           一个是三角形的管理:不允许删除,只能添加或者更新。

七。因此:

        作为一个 BSP 树,我们需要如下的数据:一个三个LIst:

         class BSPTREE

        {

            NODE* root;

            LIST TriangleList;

    LIST MAPLIST;//它的大小跟三角形数量一样多。

    LIST pingmianLIST;

    bool INUSELIST;//它的大小跟pingMIANLIST一样。

        }

    而NODE中,仅仅需要保存的是这些索引。

 

八。构造与更新树:

 

      需要用一个三角形列表来构造,同时构造三个list,然后,根据这三个LIST来构造我们的节点。

 

      如果是叶子,则保留的是自身的三角形索引数组。。

 

      如果是节点,则保留的是平面的索引。

 

     class NODE{

     bool ISLEAF;

        int Triangles_index[n];

        int flat_INDEX ;  

     }

 

  这样的好处是,如果我们如果我们找到一个分割面,我们可以直接检查这个平面是否已经被使用作为分割面。

 

九。如果把4个LIST给封装起来,提供增,删,改,查四种操作,这将是一个更加不错的注意:

 

  class A{

  private:

    LIST TriangleList;

    LIST MAPLIST;//它的大小跟三角形数量一样多。

    LIST pingmianLIST;

    bool INUSELIST;//它的大小跟pingMIANLIST一样。 

  }

十。我们提供这样一些接口:

 

    bool AddTriangle(Triangle);

 

    bool UpdateTriangle(index,Triangle);

 

    Triangle GetTriangle(index);  

 

    Flat GetFlat(int index); 

 

    int GetTriangleFlat(int index);

    

    bool AddFlat(flat falt);

   

    bool IsTriangleUsedAsFLIP(index);

 

    bool IsFlatUsedAsFLIP(index);

 

    UseTriangleAsFlip(int index);

    

    UseFlatAsFlip(int index);

 

    GetNotUsedFLipList();

 

十一。这样的话,可以直接得到可用的分割面列表。仅仅需要做的是:

 

    GetTheBestFlip(int Triangles【】);

 

    int  DividTriangleByFlat(int Triangle,int Flat,int *index);

 

            int IsInFrontOrBackOrDividedByFlat(int Triangl,int flat );

 

十二。一切。。。的一切。。行动中,

 

 

   

 

    

 

    

     

    

 

 

 

    

                

 

        

    

  

 

 

分享到:
评论

相关推荐

    leetcode递归专题-leetcode:不定期发布leetcode解题思路和代码

    不定期发布leetcode解题思路和代码 一些好的题目 动态规划 一般dp 区间dp 位数dp 状压dp 树形DP 树 二叉树 前缀树 -- 其他树上问题 ---- ---- ---- ---- ---- ---- ---- ---- ---- 图 拓扑排序 最小生成树 最短路 ...

    2008-2014年吉林大学计算机科学与技术学院学硕考研真题和答案(考研狗自己整理的答案,包含详细的解题步骤~)

    考试科目为“数据结构+计算机网络”,科目代码为941,现将考研过程中将自己的考研真题答案整理出来,答案针对每一题都有详细的解题步骤,能够帮助大家理解知识点和解题思路。内容包含2008-2014年考研真题和答案。

    免费下载:C语言难点分析整理.doc

    2. C语言难点分析整理 10 3. C语言难点 18 4. C/C++实现冒泡排序算法 32 5. C++中指针和引用的区别 35 6. const char*, char const*, char*const的区别 36 7. C中可变参数函数实现 38 8. C程序内存中组成部分 41 9. ...

    C语言难点分析整理

    2. C语言难点分析整理 10 3. C语言难点 18 4. C/C++实现冒泡排序算法 32 5. C++中指针和引用的区别 35 6. const char*, char const*, char*const的区别 36 7. C中可变参数函数实现 38 8. C程序内存中组成部分 41 9. ...

    C语言难点分析整理.doc

    2. C语言难点分析整理 10 3. C语言难点 18 4. C/C++实现冒泡排序算法 32 5. C++中指针和引用的区别 35 6. const char*, char const*, char*const的区别 36 7. C中可变参数函数实现 38 8. C程序内存中组成部分 ...

    c语言难点分析整理,C语言

    2. C语言难点分析整理 10 3. C语言难点 18 4. C/C++实现冒泡排序算法 32 5. C++中指针和引用的区别 35 6. const char*, char const*, char*const的区别 36 7. C中可变参数函数实现 38 8. C程序内存中组成部分 41 9. ...

    leetcode力扣是什么-leetcode:leetcodebytags按自己整理的一些类别

    看了一些leetcode刷题指南,总结一下两个重点,一是最好按照类别刷题,总结思路;二是由易到难,不要产生太大挫败感。 另外最好集中时间强度大一点来刷;还可以每个题只预留固定的思考时间,做不出就wa掉看discuss。...

    传智播客扫地僧视频讲义源码

    12_构造和析构的重点整理 13_构造和析构总结 14_中午课程复习 15_构造函数的调用规则研究 16_浅拷贝问题抛出 17_浅拷贝问题分析_传智扫地僧 18_浅拷贝问题解决_深拷贝_显示编写拷贝构造函数 19_深拷贝和浅拷贝_默认...

    高级C语言详解

    2. C语言难点分析整理 10 3. C语言难点 18 4. C/C++实现冒泡排序算法 32 5. C++中指针和引用的区别 35 6. const char*, char const*, char*const的区别 36 7. C中可变参数函数实现 38 8. C程序内存中组成部分 41 9. ...

    leetcode跳跃-Leetcode_Cplusplus:C++中的Leetcode解决方案

    按知识点分类整理了Leetcode的一些题目,给出编程思路,提供了参考的C++实现代码。 目录 1.栈和队列 1.1-3 1.4 1.5 1.6 1.7 1.8 2.链表 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 3.贪心算法 3.1 3.2 3.3 3.4 3.5 3.6 ...

    高级C语言 C 语言编程要点

    2. C语言难点分析整理 10 3. C语言难点 18 4. C/C++实现冒泡排序算法 32 5. C++中指针和引用的区别 35 6. const char*, char const*, char*const的区别 36 7. C中可变参数函数实现 38 8. C程序内存中组成部分 41 9. ...

    高级进阶c语言教程..doc

    2. C语言难点分析整理 10 3. C语言难点 18 4. C/C++实现冒泡排序算法 32 5. C++中指针和引用的区别 35 6. const char*, char const*, char*const的区别 36 7. C中可变参数函数实现 38 8. C程序内存中组成部分 41 9. ...

    史上最强的C语言资料

    2. C语言难点分析整理 10 3. C语言难点 18 4. C/C++实现冒泡排序算法 32 5. C++中指针和引用的区别 35 6. const char*, char const*, char*const的区别 36 7. C中可变参数函数实现 38 8. C程序内存中组成部分 41 9. ...

    leetcode分类-bird:每日预研项目

    记录刷leetcode的代码及思路整理总结 参考 数据结构 时间空间复杂度,做完每道题都应该分析一下时间空间复杂度! 链表 堆栈 哈希表、Set:用于查询和计数 优先队列 二叉树,二叉搜索树(左子树小于根结点,右子树...

    高级C语言.PDF

    C语言难点分析整理 .......................................................................................................................... 9 3. C语言难点 ..............................................

Global site tag (gtag.js) - Google Analytics