예제 #1
0
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);
}
예제 #2
0
    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);
		}
    }
예제 #3
0
	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);
		}
	}
예제 #4
0
	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;
	}
예제 #5
0
    CSGTreeOld* copy(const CSGTreeOld* thiz)
	{
		if (!thiz) return nullptr;

		CSGTreeOld* pCopy = new CSGTreeOld;
		pCopy->pRoot = copy(thiz->pRoot);
		GetLeafList(pCopy);
		return pCopy;
	}
예제 #6
0
__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;
}
예제 #7
0
	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;
	}
예제 #8
0
	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;
	}
예제 #9
0
	static void GetLeafList(CSGTreeOld* tree)
	{
		tree->Leaves.clear();
		if (!tree->pRoot) return;
		GetLeafList(tree->pRoot, tree->Leaves);
	}