438{
440 int out_index=0;
442 int in_index=0;
443 int pi;
444
445#if POSTGIS_DEBUG_LEVEL > 0
446 static int call = -1;
447 call++;
448#endif
449
450 LWDEBUGF(4,
"FindPolygons[%d]: allocated space for %d rings\n", call, obj->
nParts);
451
452
455
456
457 for (pi=0; pi < obj->
nParts; pi++)
458 {
459 int vi;
460 int vs;
461 int ve;
462 int nv;
463 double area = 0.0;
465
466
467 if (pi == obj->
nParts - 1)
469 else
471
473
474
475 nv = ve - vs;
476
477
483
484
485 for (vi = vs; vi < ve; vi++)
486 {
487 int vn = vi+1;
488 if (vn == ve)
489 vn = vs;
490
495
498 }
499
500
501
502
503
504
505
506
507 if (area < 0.0 || obj->nParts == 1)
508 {
509 Outer[out_index] = ring;
510 out_index++;
511 }
512 else
513 {
514
515 Inner[in_index] = ring;
516 in_index++;
517 }
518 }
519
520 LWDEBUGF(4,
"FindPolygons[%d]: found %d Outer, %d Inners\n", call, out_index, in_index);
521
522
523
524 for (pi = 0; pi < in_index; pi++)
525 {
527 int i;
528 Ring *inner = Inner[pi], *outer = NULL;
529
532
535
536
537
538
539
540
541
542
543 for (i = out_index - 1; i >= 0; i--)
544 {
545 int in;
546
547 in =
PIP(pt, Outer[i]->list, Outer[i]->n);
548 if ( in ||
PIP(pt2, Outer[i]->list, Outer[i]->n) )
549 {
550 outer = Outer[i];
551 break;
552 }
553 }
554
555 if (outer)
556 {
558 while (outer->next)
559 outer = outer->next;
560
561 outer->next = inner;
562 }
563 else
564 {
565
566
567 LWDEBUGF(4,
"FindPolygons[%d]: hole %d is orphan\n", call, pi);
568
569 Outer[out_index] = inner;
570 out_index++;
571 }
572 }
573
574 *Out = Outer;
575
576
577
578
580
581 return out_index;
582}
#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