二叉树代码我写得很乱!!!整理一下思路
来源:互联网 发布:美国救护车 费用 知乎 编辑:程序博客网 时间:2024/05/07 17:35
从初始话开始,一个是构造,一个是更新:
原来的意思是没有分割。。。但是:
由于总的三角形的数量在分割过程中不断地更新,因此要不断地去构造新的三角形列表。因此所有的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 );
十二。一切。。。的一切。。行动中,
- 二叉树代码我写得很乱!!!整理一下思路
- 发现在系统中有好多写得很好的代码,也不知道是哪位前辈留下来的.整理一下...
- 旁若无人 写一些东西 整理一下思路
- 郑重声明:请管理员不要删除我的文章,虽然写得乱了点,我想在找到工作后,好好整理一下
- 你的代码写得很烂
- weblogic迁移至websphere的步骤和方法(简要步骤说明,随笔写的,有点乱,有空再整理一下)
- 自己整理的一套java编码规则,让自己写代码不会那么乱
- 发一下我写的deep learning中的一个代码
- 我只是个写代码的(幽默一下)
- 我写一下
- 整理一下代码
- 有必要写一下博客整理一下知识
- 终于会写二叉树了!贴出来高兴一下
- 【思路】表单控件和查询控件,整理一下思路。
- 同事代码写的乱怎么办?
- 【我要写框架之导入Excel数据至数据库】——思路整理
- 【整理】二叉树概念以及代码实现
- 才写了这么点,我写的好乱
- 常见的排序算法 Java实现
- BSP二叉树算法
- MyEclipse和Eclipse的Tomcat运行区别
- HAUT 1285: 军团再临【并查集*逆向思维】
- Unity将RenderTexture转成一张图片并剪裁保存到本地
- 二叉树代码我写得很乱!!!整理一下思路
- alwayson删除辅助副本上的可用性组
- 我自己写的3D图形数学库。。。有点乱!
- Oracle之select
- 高德地图中如何绘制多边形围栏
- 这里面有分割多边形,和判断平面位置关系两个函数
- JavaScript(二)对象、for ... in
- 对quake3源代码的学习与研究初步的计划
- Vc2003可以直接跑quake3