コード例 #1
0
/*Testing heap data stracure*/
int main(){

	int * head = heapCreate(15);
	int i;

	for(i=1;i<10;i++)
		heapInsert(i,head);

	heapPrint(head);

	printf("\nremove element : %d\n",heapRemove(head));
	printf("\n\n");
	heapPrint(head);

	printf("\nremove element : %d\n",heapRemove(head));
	printf("\n\n");

	heapInsert(120,head);
	heapInsert(6,head);
	heapInsert(5,head);

	heapPrint(head);

	int arr[] = {46, 109, 711, 275, 196, 367,545,256,789,267,552};

	int * head1= heapify(arr,11);

	printf("\n\n");	
	heapPrint(head1);

	return 0;
}
コード例 #2
0
ファイル: heap.c プロジェクト: djmcguigan/chapmancode
void heapSort(int* arr, int size){
	int count = 0, size1;
	int* temp = (int*)malloc(size*sizeof(int));
	
	for(count; count < size; count++){
		insert(arr[count], temp, count-1);
	}
	count = 0;
	size1 = size;
	for(count; count < size; count++){
		arr[count] = heapRemove(temp, size1--);
	}
	free(temp);
}
コード例 #3
0
ファイル: block.c プロジェクト: seth4618/bbsim
static int
checkASched(Heap* heap, int (*ok)(Block*))
{
  int cnt = 0;
  Block* b = heapPeek(heap);
  if (b == NULL) return 0;
  while ((b != NULL) && ok(b)) {
    heapRemove(heap);
    b->localTime = globalTimeStamp;
    cnt++;
    msg2vm(b, CMD_RUN, b->localTime);
    b->lastSimTime = b->localTime;
    b = heapPeek(heap);
  }
  return cnt;

}
コード例 #4
0
ファイル: pathlib.c プロジェクト: darwin/pacwars2
int peFindPathWW(PED* PE, MapNode* Start, MapNode* End, peTime StartTime, int Speed, PathStep** path)
{
  MapNode* v = Start;
  MapNode* s;
  MapNode* best = Start;
  int i;
  int BaseCost;
  int c,z;
  
  if (Start == End) return 0;
  
  PE->LastSID++;
  heapClear(PE->Open);
  
  v->g = 0;
  v->f = 0;
  v->h = (*PE->Heuristics)(PE, v, End);
  v->Steps = 0;
  v->Time = 0;
  heapAdd(PE->Open, v);
  
  while ((v != End) && (PE->Open->ActSize!=0))
  {
#ifdef PE_MONITOR  // pro monitorovani enginu
    peENodes++;
#endif
    
    v = PE->Open->HeapBuffer[1];
    heapRemove(PE->Open, v);
    
    // best position is the closest to the dest
    // and the most distanced from the start
    if ((v->h<best->h) || (v->h=best->h) && (v->g>best->g)) best = v; 
    
    for (i=0; i<8; i++)
    {
      s = peMapXY(PE, v->Pos.X+Dir2Delta[i][0], v->Pos.Y+Dir2Delta[i][1]); // s = sousedni policko
      if ((!s) || (s->TC==PE->MAXTC) || (s->Owner!=-1)) continue;
      if (s->SearchID == PE->LastSID)
      {
        if (s->HeapPos>0)
        {
          if (DirType[i]==0)
            BaseCost = PE->HorizontalCost;
          else
            BaseCost = PE->DiagonalCost;
          c = v->g + BaseCost;
          z = v->FootSteps;
          
          if (c + z < s->g)
          {
            s->h = (*PE->Heuristics)(PE, s, End);
            s->Steps = v->Steps + 1;
            s->Time = v->Time + Speed;
            s->f = (*PE->MixFunction)(PE, c, s->h, z);
            s->g = c + z;
            s->CameFrom = v->Pos;
            heapSiftUp(PE->Open, s->HeapPos);
          }
        }
        // else konecny
      } 
      else
      {
        s->SearchID = PE->LastSID;
        if (DirType[i]==0)
          BaseCost = PE->HorizontalCost;
        else
          BaseCost = PE->DiagonalCost;
        
        c = v->g + BaseCost;
        z = v->FootSteps;
        
        s->h = (*PE->Heuristics)(PE, s, End);
        s->Steps = v->Steps + 1;
        s->Time = v->Time + Speed;
        s->f = (*PE->MixFunction)(PE, c, s->h, z);
        s->g = c + z;
        s->CameFrom = v->Pos;
        if (heapAdd(PE->Open, s)==HP_NOSPACE)
        {
          // we ran out off free heap space
          // get the best known position and continue
          // after walker reaches this position
          End = best;
          v = best;
          break;
        }
      }
    }
  }
  if (Start == End) return 0;
  if (v!=End) return 0;
  if (!peAddPath(PE, path, End->Steps+1)) return 0;
  
  i=v->Steps+1;
  while (i>0)
  {
    i--;
    (*path)[i].Time = StartTime + v->Time;
    (*path)[i].Type = PST_CONTINUE | PST_FOOTSTEP;
    (*path)[i].Pos = v->Pos;
    v->FootSteps+=PE->FootStepCost;
    
    v=peMapXY(PE, v->CameFrom.X, v->CameFrom.Y);
  }
  
  (*path)[End->Steps].Type = PST_END | PST_FOOTSTEP;
  
  return End->Steps+1;
}
コード例 #5
0
void ApexQuadricSimplifier::collapseEdge(QuadricEdge& edge)
{
	uint32_t vNr0 = edge.vertexNr[0];
	uint32_t vNr1 = edge.vertexNr[1];
	QuadricVertex* qv0 = mVertices[vNr0];
	QuadricVertex* qv1 = mVertices[vNr1];

	PX_ASSERT(qv0->bDeleted == 0);
	PX_ASSERT(qv1->bDeleted == 0);

	//FILE* f = NULL;
	//fopen_s(&f, "c:\\collapse.txt", "a");
	//fprintf_s(f, "Collapse Vertex %d -> %d\n", vNr1, vNr0);

	// contract edge to the vertex0
	qv0->pos = qv0->pos * (1.0f - edge.ratio) + qv1->pos * edge.ratio;
	qv0->q += qv1->q;

	// merge the edges
	for (uint32_t i = 0; i < qv1->mEdges.size(); i++)
	{
		QuadricEdge& ei = mEdges[qv1->mEdges[i]];
		uint32_t vi = ei.otherVertex(vNr1);
		if (vi == vNr0)
		{
			continue;
		}

		// test whether we already have this neighbor
		bool found = false;
		for (uint32_t j = 0; j < qv0->mEdges.size(); j++)
		{
			QuadricEdge& ej = mEdges[qv0->mEdges[j]];
			if (ej.otherVertex(vNr0) == vi)
			{
				found = true;
				break;
			}
		}
		if (found)
		{
			mVertices[vi]->removeEdge((int32_t)qv1->mEdges[i]);
			ei.deleted = true;
			if (ei.heapPos >= 0)
			{
				heapRemove((uint32_t)ei.heapPos, false);
			}
#if TESTING
			testHeap();
#endif
		}
		else
		{
			ei.replaceVertex(vNr1, vNr0);
			qv0->mEdges.pushBack(qv1->mEdges[i]);
		}
	}
	// remove common edge and update adjacent edges
	for (int32_t i = (int32_t)qv0->mEdges.size() - 1; i >= 0; i--)
	{
		QuadricEdge& ei = mEdges[qv0->mEdges[(uint32_t)i]];
		if (ei.otherVertex(vNr0) == vNr1)
		{
			qv0->mEdges.replaceWithLast((uint32_t)i);
		}
		else
		{
			computeCost(ei);
			if (ei.heapPos >= 0)
			{
				heapUpdate((uint32_t)ei.heapPos);
			}
#if TESTING
			testHeap();
#endif
		}
	}

	// delete collapsed triangles
	for (int32_t i = (int32_t)qv0->mTriangles.size() - 1; i >= 0; i--)
	{
		uint32_t triangleIndex = qv0->mTriangles[(uint32_t)i];
		QuadricTriangle& t = mTriangles[triangleIndex];
		if (!t.deleted && t.containsVertex(vNr1))
		{
			mNumDeletedTriangles++;
			t.deleted = true;
			//fprintf_s(f, "Delete Triangle %d\n", triangleIndex);

			PX_ASSERT(t.containsVertex(vNr0));

			for (uint32_t j = 0; j < 3; j++)
			{
				mVertices[t.vertexNr[j]]->removeTriangle((int32_t)triangleIndex);
				//fprintf_s(f, "  v %d\n", t.vertexNr[j]);
			}
		}
	}
	// update triangles
	for (uint32_t i = 0; i < qv1->mTriangles.size(); i++)
	{
		QuadricTriangle& t = mTriangles[qv1->mTriangles[i]];
		if (t.deleted)
		{
			continue;
		}
		if (t.containsVertex(vNr1))
		{
			qv0->mTriangles.pushBack(qv1->mTriangles[i]);
		}
		t.replaceVertex(vNr1, vNr0);
	}

	mNumDeletedVertices += qv1->bDeleted == 1 ? 0 : 1;
	qv1->bDeleted = 1;
	edge.deleted = true;
	//fclose(f);

#if TESTING
	testMesh();
	testHeap();
#endif
}
コード例 #6
0
uint32_t ApexQuadricSimplifier::simplify(uint32_t subdivision, int32_t maxSteps, float maxError, IProgressListener* progressListener)
{
	float maxLength = 0.0f;

	uint32_t nbCollapsed = 0;

	if (subdivision > 0)
	{
		maxLength = (mBounds.minimum - mBounds.maximum).magnitude() / subdivision;
	}

	uint32_t progressCounter = 0;
	uint32_t maximum = maxSteps >= 0 ? maxSteps : mHeap.size();

	HierarchicalProgressListener progress(100, progressListener);
	progress.setSubtaskWork(90, "Isomesh simplicifaction");
#if TESTING
	testHeap();
#endif

	while (maxSteps == -1 || (maxSteps-- > 0))
	{

		if ((++progressCounter & 0xff) == 0)
		{
			const int32_t percent = (int32_t)(100 * progressCounter / maximum);
			progress.setProgress(percent);
		}

		bool edgeFound = false;
		QuadricEdge* e = NULL;
		while (mHeap.size() - mNumDeletedHeapElements > 1)
		{
			e = mHeap[1];

			if (maxError >= 0 && e->cost > maxError)
			{
				// get me out of here
				edgeFound = false;
				break;
			}

			if (legalCollapse(*e, maxLength))
			{
				heapRemove(1, false);
#if TESTING
				testHeap();
#endif
				edgeFound = true;
				break;
			}
			uint32_t vNr0 = e->vertexNr[0];
			uint32_t vNr1 = e->vertexNr[1];
			QuadricVertex* qv0 = mVertices[vNr0];
			QuadricVertex* qv1 = mVertices[vNr1];
			heapRemove(1, qv0->bDeleted == 0 && qv1->bDeleted == 0);
#if TESTING
			testHeap();
#endif
		}

		if (!edgeFound)
		{
			break;
		}

		collapseEdge(*e);
		nbCollapsed++;
	}

	progress.completeSubtask();
	progress.setSubtaskWork(10, "Heap rebuilding");

	progressCounter = mNumDeletedHeapElements;
	while (mNumDeletedHeapElements > 0)
	{
		if ((mNumDeletedHeapElements & 0x7f) == 0)
		{
			const int32_t percent =  (int32_t)(100 * (progressCounter - mNumDeletedHeapElements) / progressCounter);
			progress.setProgress(percent);
		}
#if TESTING
		testHeap();
#endif
		mNumDeletedHeapElements--;
		heapUpdate(mHeap.size() - 1 - mNumDeletedHeapElements);
	}

	progress.completeSubtask();
#if TESTING
	testHeap();
#endif
	return nbCollapsed;
}