PostGIS  3.2.2dev-r@@SVN_REVISION@@

◆ test_lw_dist2d_arc_arc()

static void test_lw_dist2d_arc_arc ( void  )
static

Definition at line 902 of file cu_measures.c.

903 {
904  /* lw_dist2d_arc_arc(const POINT2D *A1, const POINT2D *A2, const POINT2D *A3,
905  const POINT2D *B1, const POINT2D *B2, const POINT2D *B3,
906  DISTPTS *dl) */
907  DISTPTS dl;
908  POINT2D A1, A2, A3, B1, B2, B3;
909  int rv;
910 
911  /* Ticket #4326 */
913  A1.x = -1.0; A1.y = 4.0;
914  A2.x = 0.0; A2.y = 5.0;
915  A3.x = 1.0; A3.y = 4.0;
916  B1.x = 1.0; B1.y = 6.0;
917  B2.x = 6.0; B2.y = 1.0;
918  B3.x = 9.0; B3.y = 7.0;
919  rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
920  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
921  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 0.0475666, 0.000001);
922 
923  /* Unit semicircle at 0,0 */
924  B1.x = -1; B1.y = 0;
925  B2.x = 0 ; B2.y = 1;
926  B3.x = 1 ; B3.y = 0;
927 
928  /* Arc above the unit semicircle */
930  A1.x = -1; A1.y = 3;
931  A2.x = 0 ; A2.y = 2;
932  A3.x = 1 ; A3.y = 3;
933  rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
934  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
935  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 1, 0.000001);
936 
937  /* Arc grazes the unit semicircle */
939  A1.x = -1; A1.y = 2;
940  A2.x = 0 ; A2.y = 1;
941  A3.x = 1 ; A3.y = 2;
942  rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
943  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
944  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 0, 0.000001);
945 
946  /* Circles intersect, but arcs do not */
948  A1.x = -1; A1.y = 1;
949  A2.x = 0; A2.y = 2;
950  A3.x = 1; A3.y = 1;
951  rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
952  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
953  CU_ASSERT_DOUBLE_EQUAL(dl.distance, sqrt(2)-1, 0.000001);
954 
955  /* Circles and arcs intersect */
957  A1.x = -1; A1.y = 1;
958  A2.x = 0; A2.y = 0;
959  A3.x = 1; A3.y = 1;
960  rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
961  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
962  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 0, 0.000001);
963 
964  /* Concentric: and fully parallel */
966  A1.x = -2.0; A1.y = 0.0;
967  A2.x = 0.0; A2.y = 2.0;
968  A3.x = 2.0; A3.y = 0.0;
969  rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
970  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
971  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 1.0, 0.000001);
972 
973  /* Concentric: with A fully included in B's range */
975  A1.x = -0.5 / sqrt(2.0); A1.y = 0.5 / sqrt(2.0);
976  A2.x = 0.0; A2.y = 0.5;
977  A3.x = 0.5 / sqrt(2.0); A3.y = 0.5 / sqrt(2.0);
978  rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
979  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
980  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 0.5, 0.000001);
981 
982  /* Concentric: with A partially included in B's range */
984  A1.x = -0.5 / sqrt(2.0); A1.y = -0.5 / sqrt(2.0);
985  A2.x = -0.5; A2.y = 0.0;
986  A3.x = -0.5 / sqrt(2.0); A3.y = 0.5 / sqrt(2.0);
987  rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
988  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
989  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 0.5, 0.000001);
990 
991  /* Concentric: with A and B without parallel segments */
993  A1.x = -0.5 / sqrt(2.0); A1.y = -0.5 / sqrt(2.0);
994  A2.x = 0.0; A2.y = -0.5;
995  A3.x = 0.5 / sqrt(2.0); A3.y = -0.5 / sqrt(2.0);
996  rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
997  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
998  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 0.736813, 0.000001);
999 
1000  /* Concentric: Arcs are the same */
1002  A1.x = -1.0; A1.y = 0.0;
1003  A2.x = 0.0; A2.y = 1.0;
1004  A3.x = 1.0; A3.y = 0.0;
1005  rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
1006  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
1007  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 0.0, 0.000001);
1008 
1009  /* Check different orientations */
1010  B1.x = -10.0; B1.y = 0.0;
1011  B2.x = 0.0 ; B2.y = 10.0;
1012  B3.x = 10.0 ; B3.y = 0.0;
1013 
1015  A1.x = -22.0; A1.y = 0.0;
1016  A2.x = -17.0; A2.y = -5.0;
1017  A3.x = -12.0; A3.y = 0.0;
1018  rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
1019  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
1020  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 2.0, 0.000001);
1021 
1023  A1.x = -19.0; A1.y = 0.0;
1024  A2.x = -14.0; A2.y = -5.0;
1025  A3.x = - 9.0; A3.y = 0.0;
1026  rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
1027  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
1028  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 1.0, 0.000001);
1029 
1031  A1.x = -9.0; A1.y = 0.0;
1032  A2.x = -4.0; A2.y = -5.0;
1033  A3.x = 1.0; A3.y = 0.0;
1034  rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
1035  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
1036  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 1.0, 0.000001);
1037 
1039  A1.x = -1.0; A1.y = 0.0;
1040  A2.x = 4.0; A2.y = -5.0;
1041  A3.x = 9.0; A3.y = 0.0;
1042  rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
1043  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
1044  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 1.0, 0.000001);
1045 
1047  A1.x = 1.0; A1.y = 0.0;
1048  A2.x = 6.0; A2.y = -5.0;
1049  A3.x = 11.0; A3.y = 0.0;
1050  rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
1051  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
1052  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 1.0, 0.000001);
1053 
1055  A1.x = 11.0; A1.y = 0.0;
1056  A2.x = 16.0; A2.y = -5.0;
1057  A3.x = 21.0; A3.y = 0.0;
1058  rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
1059  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
1060  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 1.0, 0.000001);
1061 
1062 
1064  A1.x = -15.0; A1.y = -6.0;
1065  A2.x = -10.0; A2.y = -1.0;
1066  A3.x = - 5.0; A3.y = -6.0;
1067  rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
1068  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
1069  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 1.0, 0.000001);
1070 
1072  A1.x = -5.0; A1.y = 0.0;
1073  A2.x = 0.0; A2.y = 5.0;
1074  A3.x = 5.0; A3.y = 0.0;
1075  rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
1076  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
1077  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 5.0, 0.000001);
1078 
1080  A1.x = -5.0; A1.y = 0.0;
1081  A2.x = 0.0; A2.y = -5.0;
1082  A3.x = 5.0; A3.y = 0.0;
1083  rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
1084  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
1085  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 5.0, 0.000001);
1086 
1087 }
#define LW_SUCCESS
Definition: liblwgeom.h:111
void lw_dist2d_distpts_init(DISTPTS *dl, int mode)
Definition: measures.c:64
int lw_dist2d_arc_arc(const POINT2D *A1, const POINT2D *A2, const POINT2D *A3, const POINT2D *B1, const POINT2D *B2, const POINT2D *B3, DISTPTS *dl)
Definition: measures.c:1676
#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_arc_arc(), lw_dist2d_distpts_init(), 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: