PostGIS 3.7.0dev-r@@SVN_REVISION@@
Loading...
Searching...
No Matches

◆ test_lw_dist2d_seg_arc()

static void test_lw_dist2d_seg_arc ( void  )
static

Definition at line 828 of file cu_measures.c.

829{
830 /* int lw_dist2d_seg_arc(const POINT2D *A1, const POINT2D *A2, const POINT2D *B1, const POINT2D *B2, const POINT2D *B3, DISTPTS *dl) */
831
832 DISTPTS dl;
833 POINT2D A1, A2, B1, B2, B3;
834 int rv;
835
836 /* Unit semicircle */
837 B1.x = -1; B1.y = 0;
838 B2.x = 0 ; B2.y = 1;
839 B3.x = 1 ; B3.y = 0;
840
841 /* Edge above the unit semicircle */
843 A1.x = -2; A1.y = 2;
844 A2.x = 2 ; A2.y = 2;
845 rv = lw_dist2d_seg_arc(&A1, &A2, &B1, &B2, &B3, &dl);
846 CU_ASSERT_EQUAL( rv, LW_SUCCESS );
847 CU_ASSERT_DOUBLE_EQUAL(dl.distance, 1, 0.000001);
848
849 /* Edge to the right of the unit semicircle */
851 A1.x = 2; A1.y = -2;
852 A2.x = 2; A2.y = 2;
853 rv = lw_dist2d_seg_arc(&A1, &A2, &B1, &B2, &B3, &dl);
854 CU_ASSERT_EQUAL( rv, LW_SUCCESS );
855 CU_ASSERT_DOUBLE_EQUAL(dl.distance, 1, 0.000001);
856
857 /* Edge to the left of the unit semicircle */
859 A1.x = -2; A1.y = -2;
860 A2.x = -2; A2.y = 2;
861 rv = lw_dist2d_seg_arc(&A1, &A2, &B1, &B2, &B3, &dl);
862 CU_ASSERT_EQUAL( rv, LW_SUCCESS );
863 CU_ASSERT_DOUBLE_EQUAL(dl.distance, 1, 0.000001);
864
865 /* Edge within the unit semicircle */
867 A1.x = 0; A1.y = 0;
868 A2.x = 0; A2.y = 0.5;
869 rv = lw_dist2d_seg_arc(&A1, &A2, &B1, &B2, &B3, &dl);
870 CU_ASSERT_EQUAL( rv, LW_SUCCESS );
871 CU_ASSERT_DOUBLE_EQUAL(dl.distance, 0.5, 0.000001);
872
873 /* Edge grazing the unit semicircle */
875 A1.x = -2; A1.y = 1;
876 A2.x = 2; A2.y = 1;
877 rv = lw_dist2d_seg_arc(&A1, &A2, &B1, &B2, &B3, &dl);
878 CU_ASSERT_EQUAL( rv, LW_SUCCESS );
879 CU_ASSERT_DOUBLE_EQUAL(dl.distance, 0., 0.000001);
880
881 /* Line grazing the unit semicircle, but edge not */
883 A1.x = 1; A1.y = 1;
884 A2.x = 2; A2.y = 1;
885 rv = lw_dist2d_seg_arc(&A1, &A2, &B1, &B2, &B3, &dl);
886 CU_ASSERT_EQUAL( rv, LW_SUCCESS );
887 CU_ASSERT_DOUBLE_EQUAL(dl.distance, sqrt(2.0)-1, 0.000001);
888
889 /* Edge intersecting the unit semicircle */
891 A1.x = 0; A1.y = 0;
892 A2.x = 2; A2.y = 2;
893 rv = lw_dist2d_seg_arc(&A1, &A2, &B1, &B2, &B3, &dl);
894 CU_ASSERT_EQUAL( rv, LW_SUCCESS );
895 CU_ASSERT_DOUBLE_EQUAL(dl.distance, 0, 0.000001);
896
897 /* Line intersecting the unit semicircle, but edge not */
899 A1.x = -1; A1.y = 1;
900 A2.x = -2; A2.y = 2;
901 rv = lw_dist2d_seg_arc(&A1, &A2, &B1, &B2, &B3, &dl);
902 //printf("distance %g\n", dl.distance);
903 CU_ASSERT_EQUAL( rv, LW_SUCCESS );
904 CU_ASSERT_DOUBLE_EQUAL(dl.distance, sqrt(2.0)-1, 0.000001);
905}
#define LW_SUCCESS
Definition liblwgeom.h:97
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:1351
void lw_dist2d_distpts_init(DISTPTS *dl, int mode)
Definition measures.c:67
#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:390
double x
Definition liblwgeom.h:390

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: