@@ -63,6 +63,9 @@ class TestQgsGeometryUtils: public QObject
63
63
void testTangentPointAndCircle ();
64
64
void testCircleCircleOuterTangents ();
65
65
void testGml ();
66
+ void testInterpolatePointOnLineQgsPoint ();
67
+ void testInterpolatePointOnLine ();
68
+ void testInterpolatePointOnLineByValue ();
66
69
};
67
70
68
71
@@ -915,5 +918,115 @@ void TestQgsGeometryUtils::testGml()
915
918
QGSCOMPAREGML ( elemToString ( elm ), expectedGML3_inverted );
916
919
}
917
920
921
+ void TestQgsGeometryUtils::testInterpolatePointOnLineQgsPoint ()
922
+ {
923
+ QgsPoint p = QgsGeometryUtils::interpolatePointOnLine ( QgsPoint ( 0 , 0 ), QgsPoint ( 10 , 0 ), 0 );
924
+ QCOMPARE ( p.x (), 0.0 );
925
+ QCOMPARE ( p.y (), 0.0 );
926
+ p = QgsGeometryUtils::interpolatePointOnLine ( QgsPoint ( 0 , 0 ), QgsPoint ( 10 , 0 ), 1 );
927
+ QCOMPARE ( p.x (), 10.0 );
928
+ QCOMPARE ( p.y (), 0.0 );
929
+ p = QgsGeometryUtils::interpolatePointOnLine ( QgsPoint ( 0 , 0 ), QgsPoint ( 0 , 10 ), 0 );
930
+ QCOMPARE ( p.x (), 0.0 );
931
+ QCOMPARE ( p.y (), 0.0 );
932
+ p = QgsGeometryUtils::interpolatePointOnLine ( QgsPoint ( 0 , 0 ), QgsPoint ( 0 , 10 ), 1 );
933
+ QCOMPARE ( p.x (), 0.0 );
934
+ QCOMPARE ( p.y (), 10.0 );
935
+ p = QgsGeometryUtils::interpolatePointOnLine ( QgsPoint ( 0 , 0 ), QgsPoint ( -10 , -6 ), 0.5 );
936
+ QCOMPARE ( p.x (), -5.0 );
937
+ QCOMPARE ( p.y (), -3.0 );
938
+ p = QgsGeometryUtils::interpolatePointOnLine ( QgsPoint ( 0 , 0 ), QgsPoint ( -10 , -6 ), 0.2 );
939
+ QCOMPARE ( p.x (), -2.0 );
940
+ QCOMPARE ( p.y (), -1.2 );
941
+ p = QgsGeometryUtils::interpolatePointOnLine ( QgsPoint ( 0 , 0 ), QgsPoint ( -10 , -6 ), 2 );
942
+ QCOMPARE ( p.x (), -20.0 );
943
+ QCOMPARE ( p.y (), -12.0 );
944
+ p = QgsGeometryUtils::interpolatePointOnLine ( QgsPoint ( 0 , 0 ), QgsPoint ( -10 , -6 ), -1 );
945
+ QCOMPARE ( p.x (), 10.0 );
946
+ QCOMPARE ( p.y (), 6.0 );
947
+ // with m
948
+ p = QgsGeometryUtils::interpolatePointOnLine ( QgsPoint ( 0 , 0 , 0 , 5 , QgsWkbTypes::PointM ), QgsPoint ( -10 , -6 , 0 , 10 , QgsWkbTypes::PointM ), 0.4 );
949
+ QCOMPARE ( p.wkbType (), QgsWkbTypes::PointM );
950
+ QCOMPARE ( p.x (), -4.0 );
951
+ QCOMPARE ( p.y (), -2.4 );
952
+ QCOMPARE ( p.m (), 7.0 );
953
+ // with z
954
+ p = QgsGeometryUtils::interpolatePointOnLine ( QgsPoint ( 0 , 0 , 5 , 0 , QgsWkbTypes::PointZ ), QgsPoint ( -10 , -6 , 10 , 0 , QgsWkbTypes::PointZ ), 0.4 );
955
+ QCOMPARE ( p.wkbType (), QgsWkbTypes::PointZ );
956
+ QCOMPARE ( p.x (), -4.0 );
957
+ QCOMPARE ( p.y (), -2.4 );
958
+ QCOMPARE ( p.z (), 7.0 );
959
+ // with zm
960
+ p = QgsGeometryUtils::interpolatePointOnLine ( QgsPoint ( 0 , 0 , 5 , 10 , QgsWkbTypes::PointZM ), QgsPoint ( -10 , -6 , 10 , 5 , QgsWkbTypes::PointZM ), 0.4 );
961
+ QCOMPARE ( p.wkbType (), QgsWkbTypes::PointZM );
962
+ QCOMPARE ( p.x (), -4.0 );
963
+ QCOMPARE ( p.y (), -2.4 );
964
+ QCOMPARE ( p.z (), 7.0 );
965
+ QCOMPARE ( p.m (), 8.0 );
966
+ }
967
+
968
+ void TestQgsGeometryUtils::testInterpolatePointOnLine ()
969
+ {
970
+ QgsPointXY p = QgsGeometryUtils::interpolatePointOnLine ( 0 , 0 , 10 , 0 , 0 );
971
+ QCOMPARE ( p.x (), 0.0 );
972
+ QCOMPARE ( p.y (), 0.0 );
973
+ p = QgsGeometryUtils::interpolatePointOnLine ( 0 , 0 , 10 , 0 , 1 );
974
+ QCOMPARE ( p.x (), 10.0 );
975
+ QCOMPARE ( p.y (), 0.0 );
976
+ p = QgsGeometryUtils::interpolatePointOnLine ( 0 , 0 , 0 , 10 , 0 );
977
+ QCOMPARE ( p.x (), 0.0 );
978
+ QCOMPARE ( p.y (), 0.0 );
979
+ p = QgsGeometryUtils::interpolatePointOnLine ( 0 , 0 , 0 , 10 , 1 );
980
+ QCOMPARE ( p.x (), 0.0 );
981
+ QCOMPARE ( p.y (), 10.0 );
982
+ p = QgsGeometryUtils::interpolatePointOnLine ( 0 , 0 , -10 , -6 , 0.5 );
983
+ QCOMPARE ( p.x (), -5.0 );
984
+ QCOMPARE ( p.y (), -3.0 );
985
+ p = QgsGeometryUtils::interpolatePointOnLine ( 0 , 0 , -10 , -6 , 0.2 );
986
+ QCOMPARE ( p.x (), -2.0 );
987
+ QCOMPARE ( p.y (), -1.2 );
988
+ p = QgsGeometryUtils::interpolatePointOnLine ( 0 , 0 , -10 , -6 , 2 );
989
+ QCOMPARE ( p.x (), -20.0 );
990
+ QCOMPARE ( p.y (), -12.0 );
991
+ p = QgsGeometryUtils::interpolatePointOnLine ( 0 , 0 , -10 , -6 , -1 );
992
+ QCOMPARE ( p.x (), 10.0 );
993
+ QCOMPARE ( p.y (), 6.0 );
994
+ }
995
+
996
+ void TestQgsGeometryUtils::testInterpolatePointOnLineByValue ()
997
+ {
998
+ QgsPointXY p = QgsGeometryUtils::interpolatePointOnLineByValue ( 0 , 0 , 0 , 10 , 0 , 1 , 0 );
999
+ QCOMPARE ( p.x (), 0.0 );
1000
+ QCOMPARE ( p.y (), 0.0 );
1001
+ p = QgsGeometryUtils::interpolatePointOnLineByValue ( 0 , 0 , 0 , 10 , 0 , 1 , 1 );
1002
+ QCOMPARE ( p.x (), 10.0 );
1003
+ QCOMPARE ( p.y (), 0.0 );
1004
+ p = QgsGeometryUtils::interpolatePointOnLineByValue ( 0 , 0 , 5 , 0 , 10 , 15 , 5 );
1005
+ QCOMPARE ( p.x (), 0.0 );
1006
+ QCOMPARE ( p.y (), 0.0 );
1007
+ p = QgsGeometryUtils::interpolatePointOnLineByValue ( 0 , 0 , 15 , 0 , 10 , 5 , 5 );
1008
+ QCOMPARE ( p.x (), 0.0 );
1009
+ QCOMPARE ( p.y (), 10.0 );
1010
+ p = QgsGeometryUtils::interpolatePointOnLineByValue ( 0 , 0 , 1 , -10 , -6 , 3 , 2 );
1011
+ QCOMPARE ( p.x (), -5.0 );
1012
+ QCOMPARE ( p.y (), -3.0 );
1013
+ p = QgsGeometryUtils::interpolatePointOnLineByValue ( 0 , 0 , 1 , -10 , -6 , 3 , 1.4 );
1014
+ QCOMPARE ( p.x (), -2.0 );
1015
+ QCOMPARE ( p.y (), -1.2 );
1016
+ p = QgsGeometryUtils::interpolatePointOnLineByValue ( 0 , 0 , 3 , -10 , -6 , 1 , 2 );
1017
+ QCOMPARE ( p.x (), -5.0 );
1018
+ QCOMPARE ( p.y (), -3.0 );
1019
+ p = QgsGeometryUtils::interpolatePointOnLineByValue ( 0 , 0 , 1 , -10 , -6 , 3 , -1 );
1020
+ QCOMPARE ( p.x (), 10.0 );
1021
+ QCOMPARE ( p.y (), 6.0 );
1022
+ p = QgsGeometryUtils::interpolatePointOnLineByValue ( 0 , 0 , 1 , -10 , -6 , 3 , 5 );
1023
+ QCOMPARE ( p.x (), -20.0 );
1024
+ QCOMPARE ( p.y (), -12.0 );
1025
+ // v1 == v2, test for no crash
1026
+ p = QgsGeometryUtils::interpolatePointOnLineByValue ( 0 , 0 , 1 , -10 , -6 , 1 , 1 );
1027
+ QCOMPARE ( p.x (), 0.0 );
1028
+ QCOMPARE ( p.y (), 0.0 );
1029
+ }
1030
+
918
1031
QGSTEST_MAIN ( TestQgsGeometryUtils )
919
1032
#include " testqgsgeometryutils.moc"
0 commit comments