PostGIS  3.1.6dev-r@@SVN_REVISION@@

◆ test_lw_dist2d_seg_arc()

static void test_lw_dist2d_seg_arc ( void  )
static

Definition at line 814 of file cu_measures.c.

815 {
816  /* int lw_dist2d_seg_arc(const POINT2D *A1, const POINT2D *A2, const POINT2D *B1, const POINT2D *B2, const POINT2D *B3, DISTPTS *dl) */
817 
818  DISTPTS dl;
819  POINT2D A1, A2, B1, B2, B3;
820  int rv;
821 
822  /* Unit semicircle */
823  B1.x = -1; B1.y = 0;
824  B2.x = 0 ; B2.y = 1;
825  B3.x = 1 ; B3.y = 0;
826 
827  /* Edge above the unit semicircle */
829  A1.x = -2; A1.y = 2;
830  A2.x = 2 ; A2.y = 2;
831  rv = lw_dist2d_seg_arc(&A1, &A2, &B1, &B2, &B3, &dl);
832  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
833  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 1, 0.000001);
834 
835  /* Edge to the right of the unit semicircle */
837  A1.x = 2; A1.y = -2;
838  A2.x = 2; A2.y = 2;
839  rv = lw_dist2d_seg_arc(&A1, &A2, &B1, &B2, &B3, &dl);
840  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
841  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 1, 0.000001);
842 
843  /* Edge to the left of the unit semicircle */
845  A1.x = -2; A1.y = -2;
846  A2.x = -2; A2.y = 2;
847  rv = lw_dist2d_seg_arc(&A1, &A2, &B1, &B2, &B3, &dl);
848  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
849  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 1, 0.000001);
850 
851  /* Edge within the unit semicircle */
853  A1.x = 0; A1.y = 0;
854  A2.x = 0; A2.y = 0.5;
855  rv = lw_dist2d_seg_arc(&A1, &A2, &B1, &B2, &B3, &dl);
856  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
857  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 0.5, 0.000001);
858 
859  /* Edge grazing the unit semicircle */
861  A1.x = -2; A1.y = 1;
862  A2.x = 2; A2.y = 1;
863  rv = lw_dist2d_seg_arc(&A1, &A2, &B1, &B2, &B3, &dl);
864  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
865  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 0., 0.000001);
866 
867  /* Line grazing the unit semicircle, but edge not */
869  A1.x = 1; A1.y = 1;
870  A2.x = 2; A2.y = 1;
871  rv = lw_dist2d_seg_arc(&A1, &A2, &B1, &B2, &B3, &dl);
872  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
873  CU_ASSERT_DOUBLE_EQUAL(dl.distance, sqrt(2.0)-1, 0.000001);
874 
875  /* Edge intersecting the unit semicircle */
877  A1.x = 0; A1.y = 0;
878  A2.x = 2; A2.y = 2;
879  rv = lw_dist2d_seg_arc(&A1, &A2, &B1, &B2, &B3, &dl);
880  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
881  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 0, 0.000001);
882 
883  /* Line intersecting the unit semicircle, but edge not */
885  A1.x = -1; A1.y = 1;
886  A2.x = -2; A2.y = 2;
887  rv = lw_dist2d_seg_arc(&A1, &A2, &B1, &B2, &B3, &dl);
888  //printf("distance %g\n", dl.distance);
889  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
890  CU_ASSERT_DOUBLE_EQUAL(dl.distance, sqrt(2.0)-1, 0.000001);
891 }
#define LW_SUCCESS
Definition: liblwgeom.h:111
int lw_dist2d_seg_arc(const POINT2D *A1, const POINT2D *A2, const POINT2D *B1, const POINT2D *B2, const POINT2D *B3, DISTPTS *dl)
Calculate the shortest distance between an arc and an edge.
Definition: measures.c:1362
void lw_dist2d_distpts_init(DISTPTS *dl, int mode)
Definition: measures.c:64
#define DIST_MIN
Definition: measures.h:44
double distance
Definition: measures.h:51
Structure used in distance-calculations.
Definition: measures.h:50
double y
Definition: liblwgeom.h:404
double x
Definition: liblwgeom.h:404

References DIST_MIN, DISTPTS::distance, lw_dist2d_distpts_init(), lw_dist2d_seg_arc(), LW_SUCCESS, POINT2D::x, and POINT2D::y.

Referenced by measures_suite_setup().

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