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

◆ test_lw_dist2d_arc_arc()

static void test_lw_dist2d_arc_arc ( void  )
static

Definition at line 887 of file cu_measures.c.

888{
889 /* lw_dist2d_arc_arc(const POINT2D *A1, const POINT2D *A2, const POINT2D *A3,
890 const POINT2D *B1, const POINT2D *B2, const POINT2D *B3,
891 DISTPTS *dl) */
892 DISTPTS dl;
893 POINT2D A1, A2, A3, B1, B2, B3;
894 int rv;
895
896 /* Ticket #4326 */
898 A1.x = -1.0; A1.y = 4.0;
899 A2.x = 0.0; A2.y = 5.0;
900 A3.x = 1.0; A3.y = 4.0;
901 B1.x = 1.0; B1.y = 6.0;
902 B2.x = 6.0; B2.y = 1.0;
903 B3.x = 9.0; B3.y = 7.0;
904 rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
905 CU_ASSERT_EQUAL( rv, LW_SUCCESS );
906 CU_ASSERT_DOUBLE_EQUAL(dl.distance, 0.0475666, 0.000001);
907
908 /* Unit semicircle at 0,0 */
909 B1.x = -1; B1.y = 0;
910 B2.x = 0 ; B2.y = 1;
911 B3.x = 1 ; B3.y = 0;
912
913 /* Arc above the unit semicircle */
915 A1.x = -1; A1.y = 3;
916 A2.x = 0 ; A2.y = 2;
917 A3.x = 1 ; A3.y = 3;
918 rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
919 CU_ASSERT_EQUAL( rv, LW_SUCCESS );
920 CU_ASSERT_DOUBLE_EQUAL(dl.distance, 1, 0.000001);
921
922 /* Arc grazes the unit semicircle */
924 A1.x = -1; A1.y = 2;
925 A2.x = 0 ; A2.y = 1;
926 A3.x = 1 ; A3.y = 2;
927 rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
928 CU_ASSERT_EQUAL( rv, LW_SUCCESS );
929 CU_ASSERT_DOUBLE_EQUAL(dl.distance, 0, 0.000001);
930
931 /* Circles intersect, but arcs do not */
933 A1.x = -1; A1.y = 1;
934 A2.x = 0; A2.y = 2;
935 A3.x = 1; A3.y = 1;
936 rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
937 CU_ASSERT_EQUAL( rv, LW_SUCCESS );
938 CU_ASSERT_DOUBLE_EQUAL(dl.distance, sqrt(2)-1, 0.000001);
939
940 /* Circles and arcs intersect */
942 A1.x = -1; A1.y = 1;
943 A2.x = 0; A2.y = 0;
944 A3.x = 1; A3.y = 1;
945 rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
946 CU_ASSERT_EQUAL( rv, LW_SUCCESS );
947 CU_ASSERT_DOUBLE_EQUAL(dl.distance, 0, 0.000001);
948
949 /* Concentric: and fully parallel */
951 A1.x = -2.0; A1.y = 0.0;
952 A2.x = 0.0; A2.y = 2.0;
953 A3.x = 2.0; A3.y = 0.0;
954 rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
955 CU_ASSERT_EQUAL( rv, LW_SUCCESS );
956 CU_ASSERT_DOUBLE_EQUAL(dl.distance, 1.0, 0.000001);
957
958 /* Concentric: with A fully included in B's range */
960 A1.x = -0.5 / sqrt(2.0); A1.y = 0.5 / sqrt(2.0);
961 A2.x = 0.0; A2.y = 0.5;
962 A3.x = 0.5 / sqrt(2.0); A3.y = 0.5 / sqrt(2.0);
963 rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
964 CU_ASSERT_EQUAL( rv, LW_SUCCESS );
965 CU_ASSERT_DOUBLE_EQUAL(dl.distance, 0.5, 0.000001);
966
967 /* Concentric: with A partially included in B's range */
969 A1.x = -0.5 / sqrt(2.0); A1.y = -0.5 / sqrt(2.0);
970 A2.x = -0.5; A2.y = 0.0;
971 A3.x = -0.5 / sqrt(2.0); A3.y = 0.5 / sqrt(2.0);
972 rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
973 CU_ASSERT_EQUAL( rv, LW_SUCCESS );
974 CU_ASSERT_DOUBLE_EQUAL(dl.distance, 0.5, 0.000001);
975
976 /* Concentric: with A and B without parallel segments */
978 A1.x = -0.5 / sqrt(2.0); A1.y = -0.5 / sqrt(2.0);
979 A2.x = 0.0; A2.y = -0.5;
980 A3.x = 0.5 / sqrt(2.0); A3.y = -0.5 / sqrt(2.0);
981 rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
982 CU_ASSERT_EQUAL( rv, LW_SUCCESS );
983 CU_ASSERT_DOUBLE_EQUAL(dl.distance, 0.736813, 0.000001);
984
985 /* Concentric: Arcs are the same */
987 A1.x = -1.0; A1.y = 0.0;
988 A2.x = 0.0; A2.y = 1.0;
989 A3.x = 1.0; A3.y = 0.0;
990 rv = lw_dist2d_arc_arc(&A1, &A2, &A3, &B1, &B2, &B3, &dl);
991 CU_ASSERT_EQUAL( rv, LW_SUCCESS );
992 CU_ASSERT_DOUBLE_EQUAL(dl.distance, 0.0, 0.000001);
993
994 /* Check different orientations */
995 B1.x = -10.0; B1.y = 0.0;
996 B2.x = 0.0 ; B2.y = 10.0;
997 B3.x = 10.0 ; B3.y = 0.0;
998
1000 A1.x = -22.0; A1.y = 0.0;
1001 A2.x = -17.0; A2.y = -5.0;
1002 A3.x = -12.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, 2.0, 0.000001);
1006
1008 A1.x = -19.0; A1.y = 0.0;
1009 A2.x = -14.0; A2.y = -5.0;
1010 A3.x = - 9.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, 1.0, 0.000001);
1014
1016 A1.x = -9.0; A1.y = 0.0;
1017 A2.x = -4.0; A2.y = -5.0;
1018 A3.x = 1.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 = -1.0; A1.y = 0.0;
1025 A2.x = 4.0; A2.y = -5.0;
1026 A3.x = 9.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 = 6.0; A2.y = -5.0;
1034 A3.x = 11.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 = 11.0; A1.y = 0.0;
1041 A2.x = 16.0; A2.y = -5.0;
1042 A3.x = 21.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
1047
1049 A1.x = -15.0; A1.y = -6.0;
1050 A2.x = -10.0; A2.y = -1.0;
1051 A3.x = - 5.0; A3.y = -6.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, 1.0, 0.000001);
1055
1057 A1.x = -5.0; A1.y = 0.0;
1058 A2.x = 0.0; A2.y = 5.0;
1059 A3.x = 5.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, 5.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
1072}
#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:1575
#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:376
double x
Definition liblwgeom.h:376

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: