PostGIS  3.4.0dev-r@@SVN_REVISION@@

◆ lw_dist3d_distribute_bruteforce()

int lw_dist3d_distribute_bruteforce ( const LWGEOM lwg1,
const LWGEOM lwg2,
DISTPTS3D dl 
)

This function distributes the brute-force for 3D so far the only type, tasks depending on type.

Definition at line 561 of file measures3d.c.

562 {
563  int t1 = lwg1->type;
564  int t2 = lwg2->type;
565 
566  LWDEBUGF(2, "lw_dist3d_distribute_bruteforce is called with typ1=%d, type2=%d", lwg1->type, lwg2->type);
567 
568  if (t1 == POINTTYPE)
569  {
570  if (t2 == POINTTYPE)
571  {
572  dl->twisted = 1;
573  return lw_dist3d_point_point((LWPOINT *)lwg1, (LWPOINT *)lwg2, dl);
574  }
575  else if (t2 == LINETYPE)
576  {
577  dl->twisted = 1;
578  return lw_dist3d_point_line((LWPOINT *)lwg1, (LWLINE *)lwg2, dl);
579  }
580  else if (t2 == POLYGONTYPE)
581  {
582  dl->twisted = 1;
583  return lw_dist3d_point_poly((LWPOINT *)lwg1, (LWPOLY *)lwg2, dl);
584  }
585  else if (t2 == TRIANGLETYPE)
586  {
587  dl->twisted = 1;
588  return lw_dist3d_point_tri((LWPOINT *)lwg1, (LWTRIANGLE *)lwg2, dl);
589  }
590  else
591  {
592  lwerror("%s: Unsupported geometry type: %s", __func__, lwtype_name(t2));
593  return LW_FALSE;
594  }
595  }
596  else if (t1 == LINETYPE)
597  {
598  if (t2 == POINTTYPE)
599  {
600  dl->twisted = -1;
601  return lw_dist3d_point_line((LWPOINT *)lwg2, (LWLINE *)lwg1, dl);
602  }
603  else if (t2 == LINETYPE)
604  {
605  dl->twisted = 1;
606  return lw_dist3d_line_line((LWLINE *)lwg1, (LWLINE *)lwg2, dl);
607  }
608  else if (t2 == POLYGONTYPE)
609  {
610  dl->twisted = 1;
611  return lw_dist3d_line_poly((LWLINE *)lwg1, (LWPOLY *)lwg2, dl);
612  }
613  else if (t2 == TRIANGLETYPE)
614  {
615  dl->twisted = 1;
616  return lw_dist3d_line_tri((LWLINE *)lwg1, (LWTRIANGLE *)lwg2, dl);
617  }
618  else
619  {
620  lwerror("%s: Unsupported geometry type: %s", __func__, lwtype_name(t2));
621  return LW_FALSE;
622  }
623  }
624  else if (t1 == POLYGONTYPE)
625  {
626  if (t2 == POLYGONTYPE)
627  {
628  dl->twisted = 1;
629  return lw_dist3d_poly_poly((LWPOLY *)lwg1, (LWPOLY *)lwg2, dl);
630  }
631  else if (t2 == POINTTYPE)
632  {
633  dl->twisted = -1;
634  return lw_dist3d_point_poly((LWPOINT *)lwg2, (LWPOLY *)lwg1, dl);
635  }
636  else if (t2 == LINETYPE)
637  {
638  dl->twisted = -1;
639  return lw_dist3d_line_poly((LWLINE *)lwg2, (LWPOLY *)lwg1, dl);
640  }
641  else if (t2 == TRIANGLETYPE)
642  {
643  dl->twisted = 1;
644  return lw_dist3d_poly_tri((LWPOLY *)lwg1, (LWTRIANGLE *)lwg2, dl);
645  }
646  else
647  {
648  lwerror("%s: Unsupported geometry type: %s", __func__, lwtype_name(t2));
649  return LW_FALSE;
650  }
651  }
652  else if (t1 == TRIANGLETYPE)
653  {
654  if (t2 == POLYGONTYPE)
655  {
656  dl->twisted = -1;
657  return lw_dist3d_poly_tri((LWPOLY *)lwg2, (LWTRIANGLE *)lwg1, dl);
658  }
659  else if (t2 == POINTTYPE)
660  {
661  dl->twisted = -1;
662  return lw_dist3d_point_tri((LWPOINT *)lwg2, (LWTRIANGLE *)lwg1, dl);
663  }
664  else if (t2 == LINETYPE)
665  {
666  dl->twisted = -1;
667  return lw_dist3d_line_tri((LWLINE *)lwg2, (LWTRIANGLE *)lwg1, dl);
668  }
669  else if (t2 == TRIANGLETYPE)
670  {
671  dl->twisted = 1;
672  return lw_dist3d_tri_tri((LWTRIANGLE *)lwg1, (LWTRIANGLE *)lwg2, dl);
673  }
674  else
675  {
676  lwerror("%s: Unsupported geometry type: %s", __func__, lwtype_name(t2));
677  return LW_FALSE;
678  }
679  }
680 
681  else
682  {
683  lwerror("%s: Unsupported geometry type: %s", __func__, lwtype_name(t1));
684  return LW_FALSE;
685  }
686 }
#define LW_FALSE
Definition: liblwgeom.h:94
#define LINETYPE
Definition: liblwgeom.h:103
#define POINTTYPE
LWTYPE numbers, used internally by PostGIS.
Definition: liblwgeom.h:102
#define POLYGONTYPE
Definition: liblwgeom.h:104
const char * lwtype_name(uint8_t type)
Return the type name string associated with a type number (e.g.
Definition: lwutil.c:216
#define TRIANGLETYPE
Definition: liblwgeom.h:115
#define LWDEBUGF(level, msg,...)
Definition: lwgeom_log.h:88
void lwerror(const char *fmt,...)
Write a notice out to the error handler.
Definition: lwutil.c:190
int lw_dist3d_line_tri(LWLINE *line, LWTRIANGLE *tri, DISTPTS3D *dl)
line to triangle calculation
Definition: measures3d.c:817
int lw_dist3d_tri_tri(LWTRIANGLE *tri1, LWTRIANGLE *tri2, DISTPTS3D *dl)
triangle to triangle calculation
Definition: measures3d.c:915
int lw_dist3d_point_point(LWPOINT *point1, LWPOINT *point2, DISTPTS3D *dl)
point to point calculation
Definition: measures3d.c:702
int lw_dist3d_point_tri(LWPOINT *point, LWTRIANGLE *tri, DISTPTS3D *dl)
Definition: measures3d.c:767
int lw_dist3d_poly_tri(LWPOLY *poly, LWTRIANGLE *tri, DISTPTS3D *dl)
polygon to triangle calculation
Definition: measures3d.c:874
int lw_dist3d_poly_poly(LWPOLY *poly1, LWPOLY *poly2, DISTPTS3D *dl)
polygon to polygon calculation
Definition: measures3d.c:833
int lw_dist3d_line_line(LWLINE *line1, LWLINE *line2, DISTPTS3D *dl)
line to line calculation
Definition: measures3d.c:789
int lw_dist3d_point_poly(LWPOINT *point, LWPOLY *poly, DISTPTS3D *dl)
Computes point to polygon distance For mindistance that means: 1) find the plane of the polygon 2) pr...
Definition: measures3d.c:741
int lw_dist3d_point_line(LWPOINT *point, LWLINE *line, DISTPTS3D *dl)
point to line calculation
Definition: measures3d.c:718
int lw_dist3d_line_poly(LWLINE *line, LWPOLY *poly, DISTPTS3D *dl)
line to polygon calculation
Definition: measures3d.c:800
int twisted
Definition: measures3d.h:45
uint8_t type
Definition: liblwgeom.h:462

References LINETYPE, lw_dist3d_line_line(), lw_dist3d_line_poly(), lw_dist3d_line_tri(), lw_dist3d_point_line(), lw_dist3d_point_point(), lw_dist3d_point_poly(), lw_dist3d_point_tri(), lw_dist3d_poly_poly(), lw_dist3d_poly_tri(), lw_dist3d_tri_tri(), LW_FALSE, LWDEBUGF, lwerror(), lwtype_name(), POINTTYPE, POLYGONTYPE, TRIANGLETYPE, DISTPTS3D::twisted, and LWGEOM::type.

Referenced by lw_dist3d_recursive().

Here is the call graph for this function:
Here is the caller graph for this function: