PostGIS  3.4.0dev-r@@SVN_REVISION@@

◆ test_lw_dist2d_arc_arc()

static void test_lw_dist2d_arc_arc ( void  )
static

Definition at line 895 of file cu_measures.c.

896 {
897  /* lw_dist2d_arc_arc(const POINT2D *A1, const POINT2D *A2, const POINT2D *A3,
898  const POINT2D *B1, const POINT2D *B2, const POINT2D *B3,
899  DISTPTS *dl) */
900  DISTPTS dl;
901  POINT2D A1, A2, A3, B1, B2, B3;
902  int rv;
903 
904  /* Ticket #4326 */
906  A1.x = -1.0; A1.y = 4.0;
907  A2.x = 0.0; A2.y = 5.0;
908  A3.x = 1.0; A3.y = 4.0;
909  B1.x = 1.0; B1.y = 6.0;
910  B2.x = 6.0; B2.y = 1.0;
911  B3.x = 9.0; B3.y = 7.0;
912  rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
913  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
914  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 0.0475666, 0.000001);
915 
916  /* Unit semicircle at 0,0 */
917  B1.x = -1; B1.y = 0;
918  B2.x = 0 ; B2.y = 1;
919  B3.x = 1 ; B3.y = 0;
920 
921  /* Arc above the unit semicircle */
923  A1.x = -1; A1.y = 3;
924  A2.x = 0 ; A2.y = 2;
925  A3.x = 1 ; A3.y = 3;
926  rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
927  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
928  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 1, 0.000001);
929 
930  /* Arc grazes the unit semicircle */
932  A1.x = -1; A1.y = 2;
933  A2.x = 0 ; A2.y = 1;
934  A3.x = 1 ; A3.y = 2;
935  rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
936  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
937  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 0, 0.000001);
938 
939  /* Circles intersect, but arcs do not */
941  A1.x = -1; A1.y = 1;
942  A2.x = 0; A2.y = 2;
943  A3.x = 1; A3.y = 1;
944  rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
945  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
946  CU_ASSERT_DOUBLE_EQUAL(dl.distance, sqrt(2)-1, 0.000001);
947 
948  /* Circles and arcs intersect */
950  A1.x = -1; A1.y = 1;
951  A2.x = 0; A2.y = 0;
952  A3.x = 1; A3.y = 1;
953  rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
954  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
955  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 0, 0.000001);
956 
957  /* Concentric: and fully parallel */
959  A1.x = -2.0; A1.y = 0.0;
960  A2.x = 0.0; A2.y = 2.0;
961  A3.x = 2.0; A3.y = 0.0;
962  rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
963  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
964  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 1.0, 0.000001);
965 
966  /* Concentric: with A fully included in B's range */
968  A1.x = -0.5 / sqrt(2.0); A1.y = 0.5 / sqrt(2.0);
969  A2.x = 0.0; A2.y = 0.5;
970  A3.x = 0.5 / sqrt(2.0); A3.y = 0.5 / sqrt(2.0);
971  rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
972  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
973  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 0.5, 0.000001);
974 
975  /* Concentric: with A partially included in B's range */
977  A1.x = -0.5 / sqrt(2.0); A1.y = -0.5 / sqrt(2.0);
978  A2.x = -0.5; A2.y = 0.0;
979  A3.x = -0.5 / sqrt(2.0); A3.y = 0.5 / sqrt(2.0);
980  rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
981  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
982  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 0.5, 0.000001);
983 
984  /* Concentric: with A and B without parallel segments */
986  A1.x = -0.5 / sqrt(2.0); A1.y = -0.5 / sqrt(2.0);
987  A2.x = 0.0; A2.y = -0.5;
988  A3.x = 0.5 / sqrt(2.0); A3.y = -0.5 / sqrt(2.0);
989  rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
990  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
991  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 0.736813, 0.000001);
992 
993  /* Concentric: Arcs are the same */
995  A1.x = -1.0; A1.y = 0.0;
996  A2.x = 0.0; A2.y = 1.0;
997  A3.x = 1.0; A3.y = 0.0;
998  rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
999  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
1000  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 0.0, 0.000001);
1001 
1002  /* Check different orientations */
1003  B1.x = -10.0; B1.y = 0.0;
1004  B2.x = 0.0 ; B2.y = 10.0;
1005  B3.x = 10.0 ; B3.y = 0.0;
1006 
1008  A1.x = -22.0; A1.y = 0.0;
1009  A2.x = -17.0; A2.y = -5.0;
1010  A3.x = -12.0; A3.y = 0.0;
1011  rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
1012  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
1013  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 2.0, 0.000001);
1014 
1016  A1.x = -19.0; A1.y = 0.0;
1017  A2.x = -14.0; A2.y = -5.0;
1018  A3.x = - 9.0; A3.y = 0.0;
1019  rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
1020  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
1021  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 1.0, 0.000001);
1022 
1024  A1.x = -9.0; A1.y = 0.0;
1025  A2.x = -4.0; A2.y = -5.0;
1026  A3.x = 1.0; A3.y = 0.0;
1027  rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
1028  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
1029  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 1.0, 0.000001);
1030 
1032  A1.x = -1.0; A1.y = 0.0;
1033  A2.x = 4.0; A2.y = -5.0;
1034  A3.x = 9.0; A3.y = 0.0;
1035  rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
1036  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
1037  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 1.0, 0.000001);
1038 
1040  A1.x = 1.0; A1.y = 0.0;
1041  A2.x = 6.0; A2.y = -5.0;
1042  A3.x = 11.0; A3.y = 0.0;
1043  rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
1044  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
1045  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 1.0, 0.000001);
1046 
1048  A1.x = 11.0; A1.y = 0.0;
1049  A2.x = 16.0; A2.y = -5.0;
1050  A3.x = 21.0; A3.y = 0.0;
1051  rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
1052  CU_ASSERT_EQUAL( rv, LW_SUCCESS );
1053  CU_ASSERT_DOUBLE_EQUAL(dl.distance, 1.0, 0.000001);
1054 
1055 
1057  A1.x = -15.0; A1.y = -6.0;
1058  A2.x = -10.0; A2.y = -1.0;
1059  A3.x = - 5.0; A3.y = -6.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 = -5.0; A1.y = 0.0;
1066  A2.x = 0.0; A2.y = 5.0;
1067  A3.x = 5.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, 5.0, 0.000001);
1071 
1073  A1.x = -5.0; A1.y = 0.0;
1074  A2.x = 0.0; A2.y = -5.0;
1075  A3.x = 5.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, 5.0, 0.000001);
1079 
1080 }
#define LW_SUCCESS
Definition: liblwgeom.h:97
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:1576
#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: