void GetLeafList(PBTNODE pNode, CList<PBTNODE,PBTNODE&>& pNL) { if(pNode->left==NULL && pNode->right==NULL){ pNL.AddTail(pNode); return; } if(pNode->left!=NULL) GetLeafList(pNode->left,pNL); if(pNode->right!=NULL) GetLeafList(pNode->right,pNL); }
void GetLeafList(CSGTreeNode* root, std::vector<uint32_t>& list) { if (root->Type == TYPE_LEAF) { list.push_back(root->pMesh->id()); } else { GetLeafList(root->pLeft, list); GetLeafList(root->pRight, list); } }
static void GetLeafList(CSGTreeNode* root, decltype(CSGTreeOld::Leaves)& leaves) { if (root->Type == TYPE_LEAF) { leaves[root->pMesh->id()] = root; } else { GetLeafList(root->pLeft, leaves); GetLeafList(root->pRight, leaves); } }
CSGTreeOld* ConvertToPositiveTree(const CSGTreeOld* myTree) { CSGTreeOld* result = new CSGTreeOld; uint32_t maxLvl = 0; result->pRoot = ConvertToPositiveTree(myTree->pRoot, false, 0, maxLvl); GetLeafList(result); return result; }
CSGTreeOld* copy(const CSGTreeOld* thiz) { if (!thiz) return nullptr; CSGTreeOld* pCopy = new CSGTreeOld; pCopy->pRoot = copy(thiz->pRoot); GetLeafList(pCopy); return pCopy; }
__int64 Extract(PBTNODE pNode) { __int64 res = 0; CList<PBTNODE,PBTNODE&> pNL; GetLeafList(pNode, pNL); __int64 ir = pNL.GetCount(); //底数 POSITION pos = pNL.GetHeadPosition(); while(pos){ PBTNODE c = pNL.GetNext(pos); PBTNODE n = GotoNext(c); DWORD lv = n==NULL?0:n->dwLevel; res += pow(ir,lv)*c->dwPre; } res += 62; return res; }
static Relation CompressCSGTreeWithOppo(CSGTreeOld* tree, uint32_t Id) { auto leaf = tree->Leaves[Id]; CSGTreeNode *curPtr = leaf, *parent = leaf->Parent, *neib; while (true) { if (!parent) { delete tree->pRoot; tree->pRoot = nullptr; tree->Leaves.clear(); return REL_OPPOSITE; } if (LeftOrRight(curPtr) < 0.0) neib = parent->pRight; else neib = parent->pLeft; if (neib->relation == REL_OPPOSITE) { curPtr = parent; parent = parent->Parent; } else if (neib->relation == REL_SAME) { if (parent->Type == TYPE_UNION) return CompressCSGTreeWithInside(tree, Id); else if (parent->Type == TYPE_INTERSECT) return CompressCSGTreeWithOutside(tree, Id); else assert(0); } else break; } curPtr->relation = REL_OPPOSITE; SAFE_DELETE(curPtr->pLeft); SAFE_DELETE(curPtr->pRight); GetLeafList(tree); return REL_NOT_AVAILABLE; }
static Relation CompressCSGTreeWithOutside(CSGTreeOld* tree, uint32_t Id) { auto leaf = tree->Leaves[Id]; CSGTreeNode *curPtr = leaf, *parent = leaf->Parent; while (parent && parent->Type == TYPE_INTERSECT) { curPtr = parent; parent = parent->Parent; } if (!parent) { delete tree->pRoot; tree->pRoot = nullptr; tree->Leaves.clear(); return REL_OUTSIDE; } assert(parent->Type == TYPE_UNION); int resCur = LeftOrRight(curPtr); int resPar = LeftOrRight(parent); if (resPar == 0) // root { if (resCur < 0) { tree->pRoot = parent->pRight; parent->pRight = nullptr; delete parent; } else { assert(resCur); tree->pRoot = parent->pLeft; parent->pLeft = nullptr; delete parent; } tree->pRoot->Parent = nullptr; } else if (resPar < 0) { if (resCur < 0) { parent->pRight->Parent = parent->Parent; parent->Parent->pLeft = parent->pRight; parent->pRight = nullptr; delete parent; } else { assert(resCur); parent->pLeft->Parent = parent->Parent; parent->Parent->pLeft = parent->pLeft; parent->pLeft = nullptr; delete parent; } } else { if (resCur < 0) { parent->pRight->Parent = parent->Parent; parent->Parent->pRight = parent->pRight; parent->pRight = nullptr; delete parent; } else { assert(resCur); parent->pLeft->Parent = parent->Parent; parent->Parent->pRight = parent->pLeft; parent->pLeft = nullptr; delete parent; } } GetLeafList(tree); return REL_UNKNOWN; }
static void GetLeafList(CSGTreeOld* tree) { tree->Leaves.clear(); if (!tree->pRoot) return; GetLeafList(tree->pRoot, tree->Leaves); }