PostGIS  3.6.1dev-r@@SVN_REVISION@@

◆ test_lw_dist2d_arc_arc()

static void test_lw_dist2d_arc_arc ( void  )
static

Definition at line 908 of file cu_measures.c.

909 {
910  /* lw_dist2d_arc_arc(const POINT2D *A1, const POINT2D *A2, const POINT2D *A3,
911  const POINT2D *B1, const POINT2D *B2, const POINT2D *B3,
912  DISTPTS *dl) */
913  DISTPTS dl;
914  POINT2D A1, A2, A3, B1, B2, B3;
915  int rv;
916 
917  /* Ticket #4326 */
919  A1.x = -1.0; A1.y = 4.0;
920  A2.x = 0.0; A2.y = 5.0;
921  A3.x = 1.0; A3.y = 4.0;
922  B1.x = 1.0; B1.y = 6.0;
923  B2.x = 6.0; B2.y = 1.0;
924  B3.x = 9.0; B3.y = 7.0;
925  rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
926  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
927  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 0.0475666, 0.000001);
928 
929  /* Unit semicircle at 0,0 */
930  B1.x = -1; B1.y = 0;
931  B2.x = 0 ; B2.y = 1;
932  B3.x = 1 ; B3.y = 0;
933 
934  /* Arc inside the semicircle */
936  A1.x = 0; A1.y = .5;
937  A2.x = -0.3; A2.y = .5;
938  A3.x = 0; A3.y = .6;
939  rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
940  printf("%g\n", dl.distance);
941  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
942  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 0.271798, 0.000001);
943 
944  /* Arc inside the semicircle */
946  A1.x = -0.5; A1.y = .5;
947  A2.x = -0.4; A2.y = .2;
948  A3.x = 0; A3.y = 0;
949  rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
950  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
951  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 0.292893, 0.000001);
952 
953  /* Arc above the unit semicircle */
955  A1.x = -1; A1.y = 3;
956  A2.x = 0 ; A2.y = 2;
957  A3.x = 1 ; A3.y = 3;
958  rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
959  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
960  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 1, 0.000001);
961 
962  /* Arc grazes the unit semicircle */
964  A1.x = -1; A1.y = 2;
965  A2.x = 0 ; A2.y = 1;
966  A3.x = 1 ; A3.y = 2;
967  rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
968  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
969  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 0, 0.000001);
970 
971  /* Circles intersect, but arcs do not */
973  A1.x = -1; A1.y = 1;
974  A2.x = 0; A2.y = 2;
975  A3.x = 1; A3.y = 1;
976  rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
977  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
978  CU_ASSERT_DOUBLE_EQUAL(dl.distance, sqrt(2)-1, 0.000001);
979 
980  /* Circles and arcs intersect */
982  A1.x = -1; A1.y = 1;
983  A2.x = 0; A2.y = 0;
984  A3.x = 1; A3.y = 1;
985  rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
986  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
987  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 0, 0.000001);
988 
989  /* Closed circle */
991  A1.x = -2.0; A1.y = -0.1;
992  A2.x = 1.5; A2.y = -0.1;
993  A3.x = -2.0; A3.y = -0.1;
994  rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
995  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
996  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 0.480742, 0.0001);
997 
998  /* Concentric: and fully parallel */
1000  A1.x = -2.0; A1.y = 0.0;
1001  A2.x = 0.0; A2.y = 2.0;
1002  A3.x = 2.0; A3.y = 0.0;
1003  rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
1004  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
1005  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 1.0, 0.000001);
1006 
1007  /* Concentric: with A fully included in B's range */
1009  A1.x = -0.5 / sqrt(2.0); A1.y = 0.5 / sqrt(2.0);
1010  A2.x = 0.0; A2.y = 0.5;
1011  A3.x = 0.5 / sqrt(2.0); A3.y = 0.5 / sqrt(2.0);
1012  rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
1013  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
1014  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 0.5, 0.000001);
1015 
1016  /* Concentric: with A partially included in B's range */
1018  A1.x = -0.5 / sqrt(2.0); A1.y = -0.5 / sqrt(2.0);
1019  A2.x = -0.5; A2.y = 0.0;
1020  A3.x = -0.5 / sqrt(2.0); A3.y = 0.5 / sqrt(2.0);
1021  rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
1022  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
1023  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 0.5, 0.000001);
1024 
1025  /* Concentric: with A and B without parallel segments */
1027  A1.x = -0.5 / sqrt(2.0); A1.y = -0.5 / sqrt(2.0);
1028  A2.x = 0.0; A2.y = -0.5;
1029  A3.x = 0.5 / sqrt(2.0); A3.y = -0.5 / sqrt(2.0);
1030  rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
1031  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
1032  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 0.736813, 0.000001);
1033 
1034  /* Concentric: Arcs are the same */
1036  A1.x = -1.0; A1.y = 0.0;
1037  A2.x = 0.0; A2.y = 1.0;
1038  A3.x = 1.0; A3.y = 0.0;
1039  rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
1040  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
1041  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 0.0, 0.000001);
1042 
1043  /* Check different orientations */
1044  B1.x = -10.0; B1.y = 0.0;
1045  B2.x = 0.0 ; B2.y = 10.0;
1046  B3.x = 10.0 ; B3.y = 0.0;
1047 
1049  A1.x = -22.0; A1.y = 0.0;
1050  A2.x = -17.0; A2.y = -5.0;
1051  A3.x = -12.0; A3.y = 0.0;
1052  rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
1053  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
1054  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 2.0, 0.000001);
1055 
1057  A1.x = -19.0; A1.y = 0.0;
1058  A2.x = -14.0; A2.y = -5.0;
1059  A3.x = - 9.0; A3.y = 0.0;
1060  rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
1061  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
1062  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 1.0, 0.000001);
1063 
1065  A1.x = -9.0; A1.y = 0.0;
1066  A2.x = -4.0; A2.y = -5.0;
1067  A3.x = 1.0; A3.y = 0.0;
1068  rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
1069  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
1070  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 1.0, 0.000001);
1071 
1073  A1.x = -1.0; A1.y = 0.0;
1074  A2.x = 4.0; A2.y = -5.0;
1075  A3.x = 9.0; A3.y = 0.0;
1076  rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
1077  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
1078  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 1.0, 0.000001);
1079 
1081  A1.x = 1.0; A1.y = 0.0;
1082  A2.x = 6.0; A2.y = -5.0;
1083  A3.x = 11.0; A3.y = 0.0;
1084  rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
1085  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
1086  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 1.0, 0.000001);
1087 
1089  A1.x = 11.0; A1.y = 0.0;
1090  A2.x = 16.0; A2.y = -5.0;
1091  A3.x = 21.0; A3.y = 0.0;
1092  rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
1093  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
1094  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 1.0, 0.000001);
1095 
1096 
1098  A1.x = -15.0; A1.y = -6.0;
1099  A2.x = -10.0; A2.y = -1.0;
1100  A3.x = - 5.0; A3.y = -6.0;
1101  rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
1102  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
1103  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 1.0, 0.000001);
1104 
1106  A1.x = -5.0; A1.y = 0.0;
1107  A2.x = 0.0; A2.y = 5.0;
1108  A3.x = 5.0; A3.y = 0.0;
1109  rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
1110  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
1111  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 5.0, 0.000001);
1112 
1114  A1.x = -5.0; A1.y = 0.0;
1115  A2.x = 0.0; A2.y = -5.0;
1116  A3.x = 5.0; A3.y = 0.0;
1117  rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
1118  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
1119  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 5.0, 0.000001);
1120 
1121 }
#define LW_SUCCESS
Definition: liblwgeom.h:97
void lw_dist2d_distpts_init(DISTPTS *dl, int mode)
Definition: measures.c:67
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:1677
#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_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: