extern Table *LAY_InitTable() { Table *LAY_table = CreateTable( "LAY", LAY_NSTRUCTS, LAY_NUNIONS ); AddElement( LAY_LPAIR, "Lpair", Sort1( LAY_LAYOUT), Sort2( LAY_LAYOUT, LAY_LAYOUT), Sort2( "a", "b"), LAY_table ); AddElement( LAY_LBRACKET, "Lbracket", Sort1( LAY_LAYOUT), Sort3( LAY_LAYOUT, LAY_LAYOUT, LAY_LAYOUT), Sort3( "open", "body", "close"), LAY_table ); AddElement( LAY_HLIST, "Hlist", Sort1( LAY_LAYOUT), Sort1( LAY_VECLAYOUT), Sort1( "list"), LAY_table ); AddElement( LAY_VLIST, "Vlist", Sort1( LAY_LAYOUT), Sort1( LAY_VECLAYOUT), Sort1( "list"), LAY_table ); AddSort( LAY_LAYOUT, "Layout", LAY_table); return( LAY_table); }
int STable3D::Push (int r, int c, int f) { STable3DNode *node; MFEM_ASSERT(r != c && c != f && f != r, "STable3D::Push : r = " << r << ", c = " << c << ", f = " << f); Sort3 (r, c, f); for (node = Rows[r]; node != NULL; node = node->Prev) { if (node->Column == c) if (node->Floor == f) { return node->Number; } } #ifdef MFEM_USE_MEMALLOC node = NodesMem.Alloc (); #else node = new STable3DNode; #endif node->Column = c; node->Floor = f; node->Number = NElem; node->Prev = Rows[r]; Rows[r] = node; NElem++; return (NElem-1); }
int STable3D::Index (int r, int c, int f) const { STable3DNode *node; Sort3 (r, c, f); for (node = Rows[r]; node != NULL; node = node->Prev) { if (node->Column == c) if (node->Floor == f) { return node->Number; } } return -1; }
int STable3D::operator() (int r, int c, int f) const { STable3DNode *node; Sort3 (r, c, f); for (node = Rows[r]; node != NULL; node = node->Prev) { if (node->Column == c) if (node->Floor == f) { return node->Number; } } MFEM_ABORT("(r,c,f) = (" << r << "," << c << "," << f << ")"); return 0; }
void AABBTreeLeaf::Sort3(const AABBBox& box, AABBTreeNode*const begin, AABBTreeNode*const end, const unsigned char avaliableAxis) { this->begin = begin; this->end = end; this->box = box; if(!HasAlreadySubdivided()) { leaves = new AABBTreeLeaf[TOTAL_LEAVES]; } //if there is only one node left if(end == begin) { //std::cout << 1 << std::endl; if(!leaves[LEFT].IsEmpty()) { leaves[LEFT].DumpData(); leaves[RIGHT].DumpData(); } return; } AABBBox leftBox(Range<float>(FLT_MAX, -FLT_MAX), Range<float>(FLT_MAX, -FLT_MAX), Range<float>(FLT_MAX, -FLT_MAX)); AABBBox rightBox(Range<float>(FLT_MAX, -FLT_MAX), Range<float>(FLT_MAX, -FLT_MAX), Range<float>(FLT_MAX, -FLT_MAX)); AABBTreeNode* leftNodeEnd = begin - 1; float split = 0; const unsigned size = GetSize(); if((avaliableAxis & xFlag) && (box.rangeX.Length() >= box.rangeY.Length() || !(avaliableAxis & yFlag)) && (box.rangeX.Length() >= box.rangeZ.Length() || !(avaliableAxis & zFlag))) { split = box.rangeX.MidPoint(); for(AABBTreeNode* node = begin; node != begin + size; ++node) { if(node->GetMidpoint().x < split) { leftBox.ResizeToFit(node->GetBox()); ++leftNodeEnd; AABBTreeNode temp = *leftNodeEnd; *leftNodeEnd = *node; *node = temp; } else { rightBox.ResizeToFit(node->GetBox()); } } if(leftNodeEnd == begin - 1 || leftNodeEnd == end) { Sort3(box, begin, end, avaliableAxis & (yFlag | zFlag)); return; } leaves[LEFT].Sort3(leftBox, begin, leftNodeEnd, avaliableAxis); leaves[RIGHT].Sort3(rightBox, leftNodeEnd + 1, end, avaliableAxis); } else if((avaliableAxis & yFlag) && (box.rangeY.Length() >= box.rangeZ.Length() || !(avaliableAxis & zFlag))) { split = box.rangeY.MidPoint(); for(AABBTreeNode* node = begin; node != begin + size; ++node) { if(node->GetMidpoint().y < split) { leftBox.ResizeToFit(node->GetBox()); ++leftNodeEnd; AABBTreeNode temp = *leftNodeEnd; *leftNodeEnd = *node; *node = temp; } else { rightBox.ResizeToFit(node->GetBox()); } } if(leftNodeEnd == begin - 1 || leftNodeEnd == end) { Sort3(box, begin, end, avaliableAxis & (xFlag | zFlag)); return; } leaves[LEFT].Sort3(leftBox, begin, leftNodeEnd, avaliableAxis); leaves[RIGHT].Sort3(rightBox, leftNodeEnd + 1, end, avaliableAxis); } else if(avaliableAxis & zFlag) { split = box.rangeZ.MidPoint(); for(AABBTreeNode* node = begin; node != begin + size; ++node) { if(node->GetMidpoint().z < split) { leftBox.ResizeToFit(node->GetBox()); ++leftNodeEnd; AABBTreeNode temp = *leftNodeEnd; *leftNodeEnd = *node; *node = temp; } else { rightBox.ResizeToFit(node->GetBox()); } } if(leftNodeEnd == begin - 1 || leftNodeEnd == end) { Sort3(box, begin, end, avaliableAxis & (xFlag | yFlag)); return; } leaves[LEFT].Sort3(leftBox, begin, leftNodeEnd, avaliableAxis); leaves[RIGHT].Sort3(rightBox, leftNodeEnd + 1, end, avaliableAxis); } else { //if(Math::IsEqual(begin->box.rangeX.start, end->box.rangeX.start)) //{ // std::cout << begin - end << std::endl; //} //if(GetSize() < 0) //{ // int size = GetSize(); // std::cout << size << std::endl; //} //if(avaliableAxis != 0) //{ // std::cout << avaliableAxis << std::endl; //} //std::cout << GetSize() << std::endl; leaves[LEFT].DumpData(); leaves[RIGHT].DumpData(); } }