440{
442 int out_index=0;
444 int in_index=0;
445 int pi;
446
447#if POSTGIS_DEBUG_LEVEL > 0
448 static int call = -1;
449 call++;
450#endif
451
452 LWDEBUGF(4,
"FindPolygons[%d]: allocated space for %d rings\n", call, obj->
nParts);
453
454
457
458
459 for (pi=0; pi < obj->
nParts; pi++)
460 {
461 int vi;
462 int vs;
463 int ve;
464 int nv;
465 double area = 0.0;
467
468
469 if (pi == obj->
nParts - 1)
471 else
473
475
476
477 nv = ve - vs;
478
479
485
486
487 for (vi = vs; vi < ve; vi++)
488 {
489 int vn = vi+1;
490 if (vn == ve)
491 vn = vs;
492
497
500 }
501
502
503
504
505
506
507
508
509 if (area < 0.0 || obj->nParts == 1)
510 {
511 Outer[out_index] = ring;
512 out_index++;
513 }
514 else
515 {
516
517 Inner[in_index] = ring;
518 in_index++;
519 }
520 }
521
522 LWDEBUGF(4,
"FindPolygons[%d]: found %d Outer, %d Inners\n", call, out_index, in_index);
523
524
525
526 for (pi = 0; pi < in_index; pi++)
527 {
529 int i;
530 Ring *inner = Inner[pi], *outer = NULL;
531
536
541
542
543
544
545
546
547
548
549 for (i = out_index - 1; i >= 0; i--)
550 {
551 int in;
552
553 in =
PIP(pt, Outer[i]->list, Outer[i]->n);
554 if ( in ||
PIP(pt2, Outer[i]->list, Outer[i]->n) )
555 {
556 outer = Outer[i];
557 break;
558 }
559 }
560
561 if (outer)
562 {
564 while (outer->next)
565 outer = outer->next;
566
567 outer->next = inner;
568 }
569 else
570 {
571
572
573 LWDEBUGF(4,
"FindPolygons[%d]: hole %d is orphan\n", call, pi);
574
575 Outer[out_index] = inner;
576 out_index++;
577 }
578 }
579
580 *Out = Outer;
581
582
583
584
586
587 return out_index;
588}
#define LWDEBUGF(level, msg,...)
int PIP(Point P, Point *V, int n)
PIP(): crossing number test for a point in a polygon input: P = a point, V[] = vertex points of a pol...
struct struct_ring * next