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

◆ 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: