-/* routine dealing with the special case of a number of line segments intersecting in exactly one
- point */
-void exchange_many(status_t*status, event_t*e)
-{
- int size = 16;
- int n = 0;
- segment_t**segs = (segment_t**)malloc(sizeof(segment_t*)*size);
- segs[n] = e->s1;e->s1->tmp = n;n++;
- segs[n] = e->s2;e->s2->tmp = n;n++;
-#ifdef DEBUG
- dict_put(status->intersecting_segs, e->s1, 0);
- dict_put(status->intersecting_segs, e->s2, 0);
-#endif
- while(1) {
- event_t*ee = heap_peek(status->queue);
- if(ee->p.x != e->p.x ||
- ee->p.y != e->p.y ||
- ee->type != e->type) {
- break;
- }
- if(n>=size-1) {
- size *= 2;
- segs = realloc(segs, sizeof(segment_t*)*size);
- }
- ee = heap_chopmax(status->queue);
- if(ee->s1->tmp<0) {
- segs[n] = ee->s1;ee->s1->tmp = n;n++;
- }
- if(ee->s2->tmp<0) {
- segs[n] = ee->s2;ee->s2->tmp = n;n++;
- }
-#ifdef DEBUG
- dict_put(status->intersecting_segs, ee->s1, 0);
- dict_put(status->intersecting_segs, ee->s2, 0);
-#endif
- }
- int t;
-#ifdef DEBUG
- printf("event: multi-intersect: ");
- for(t=0;t<n;t++) {
- printf("[%d] ", segs[t]->nr);
- }
- printf("\n");
-#endif
- segment_t*left = 0;
- segment_t*right = 0;
- char warn = 0;
- for(t=0;t<n;t++) {
- if(!segs[t]->left || segs[t]->left->tmp<0) {
- assert(!left);
- left = segs[t];
- }
- if(!segs[t]->right || segs[t]->right->tmp<0) {
- assert(!right);
- right = segs[t];
- }
- if(segs[t]->tmp<0)
- warn = 1;
- }
- if(warn)
- fprintf(stderr, "Warning: multi-cross section contains rogue segments\n");
-
- assert(left);
- assert(right);
- assert(left!=right);
- actlist_invert_fromto(status->actlist, left, right);
- for(t=0;t<n;t++) {
- segs[t]->tmp = -1;
- }
- free(segs);
- if(right->left)
- schedule_crossing(status, right->left, right, status->y);
- if(left->right)
- schedule_crossing(status, left, left->right, status->y);