从初始话开始,一个是构造,一个是更新:
原来的意思是没有分割。。。但是:
由于总的三角形的数量在分割过程中不断地更新,因此要不断地去构造新的三角形列表。因此所有的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解题思路和代码 一些好的题目 动态规划 一般dp 区间dp 位数dp 状压dp 树形DP 树 二叉树 前缀树 -- 其他树上问题 ---- ---- ---- ---- ---- ---- ---- ---- ---- 图 拓扑排序 最小生成树 最短路 ...
考试科目为“数据结构+计算机网络”,科目代码为941,现将考研过程中将自己的考研真题答案整理出来,答案针对每一题都有详细的解题步骤,能够帮助大家理解知识点和解题思路。内容包含2008-2014年考研真题和答案。
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. ...
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. ...
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程序内存中组成部分 ...
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刷题指南,总结一下两个重点,一是最好按照类别刷题,总结思路;二是由易到难,不要产生太大挫败感。 另外最好集中时间强度大一点来刷;还可以每个题只预留固定的思考时间,做不出就wa掉看discuss。...
12_构造和析构的重点整理 13_构造和析构总结 14_中午课程复习 15_构造函数的调用规则研究 16_浅拷贝问题抛出 17_浅拷贝问题分析_传智扫地僧 18_浅拷贝问题解决_深拷贝_显示编写拷贝构造函数 19_深拷贝和浅拷贝_默认...
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的一些题目,给出编程思路,提供了参考的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 ...
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. ...
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. ...
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的代码及思路整理总结 参考 数据结构 时间空间复杂度,做完每道题都应该分析一下时间空间复杂度! 链表 堆栈 哈希表、Set:用于查询和计数 优先队列 二叉树,二叉搜索树(左子树小于根结点,右子树...
C语言难点分析整理 .......................................................................................................................... 9 3. C语言难点 ..............................................