int scheduleEvent(Ball **ball, Heap *heap, int index) { int j; insertToHeap(heap, eventWallCollideX(heap, ball[index])); insertToHeap(heap, eventWallCollideY(heap, ball[index])); for(j = 0; j < PARTICLE_COUNT; j++) insertToHeap(heap, eventBallCollide(heap, ball[index], ball[j])); }
int main() { printf("Enter Time Limit : "); scanf("%f",&TIME_LIMIT); int i, j; srand(time(NULL)); Heap *heap; Ball **ball; Interaction *nextCollision; heap = initHeap(); ball = (Ball **)malloc(PARTICLE_COUNT * sizeof(Ball *)); gnuplotPipe = initPipe(); for(i = 0; i < PARTICLE_COUNT; i++) { logFile[i] = initGraph(i); gnuplotGraphPipe[i] = initGraphPipe(i); } for(i = 0; i < PARTICLE_COUNT; i++) { ball[i] = initBallRandom(i); insertToHeap(heap, eventWallCollideX(heap, ball[i])); insertToHeap(heap, eventWallCollideY(heap, ball[i])); for(j = 0; j < i; j++) insertToHeap(heap, eventBallCollide(heap, ball[i], ball[j])); } while(sim_time < TIME_LIMIT) { nextCollision = getNextEvent(heap); simulateTo(ball, nextCollision->tstamp); printf("Collision at t=%lf\n", sim_time); resolveCollision(nextCollision); removeFromHeap(heap, nextCollision->interactee->id); scheduleEvent(ball, heap, nextCollision->interactee->id); if(nextCollision->interactor != NULL) { removeFromHeap(heap, nextCollision->interactor->id); scheduleEvent(ball, heap, nextCollision->interactor->id); } } fprintf(gnuplotPipe, "quit\n"); saveGraph(ball); showGraph(ball); return 0; }
heap* createHeap(graph* gr, int origin,int* size_val) { int i; heap* h = (heap*)malloc(sizeof(heap)); int size=0;/*heap array size*/ edge_st* temp; bzero(h,sizeof(heap)); for(i=1;i<gr->num;i++) { temp = (edge_st*)malloc(sizeof(edge_st)); temp->source = i; temp->length = (i==origin)?0:INT_MAX; insertToHeap(h,temp,&size); } *size_val = size; return h; }