コード例 #1
0
ファイル: LAY_init.c プロジェクト: NevilleDNZ/ella2000
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);
}
コード例 #2
0
ファイル: stable3d.cpp プロジェクト: ShiyangZhang/mfem
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);
}
コード例 #3
0
ファイル: stable3d.cpp プロジェクト: ShiyangZhang/mfem
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;
}
コード例 #4
0
ファイル: stable3d.cpp プロジェクト: ShiyangZhang/mfem
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;
}
コード例 #5
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();
	}
}