summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormzuenni <michi.zuendorf@gmail.com>2024-08-10 23:38:14 +0200
committermzuenni <michi.zuendorf@gmail.com>2024-08-10 23:38:14 +0200
commit497dc5e137b908e694c55bdd7a18842484939e7b (patch)
tree581a8246c8cb6f89c70ecc5c03c775be23373f0b
parent6285c377d819cbcf1883d3496e7f7d461b29e171 (diff)
more tests
-rw-r--r--content/geometry/spheres.cpp30
-rw-r--r--test/geometry/spheres.cpp28
2 files changed, 43 insertions, 15 deletions
diff --git a/content/geometry/spheres.cpp b/content/geometry/spheres.cpp
index ec22262..d34bca9 100644
--- a/content/geometry/spheres.cpp
+++ b/content/geometry/spheres.cpp
@@ -1,3 +1,16 @@
+// 3D Punkt in kartesischen Koordinaten.
+struct point{
+ double x, y, z;
+ point() {}
+ point(double x, double y, double z) : x(x), y(y), z(z) {}
+ point(double lat, double lon) {
+ lat *= PI / 180.0; lon *= PI / 180.0;
+ x = cos(lat) * sin(lon);
+ y = cos(lat) * cos(lon);
+ z = sin(lat);
+ }
+};
+
// Great Circle Distance mit Längen- und Breitengrad.
double gcDist(double pLat, double pLon,
double qLat, double qLon, double radius) {
@@ -11,19 +24,6 @@ double gcDist(double pLat, double pLon,
}
// Great Circle Distance mit kartesischen Koordinaten.
-double gcDist(point p, point q) {
+double gcDist(point p, point q) { // radius = 1
return acos(p.x * q.x + p.y * q.y + p.z * q.z);
-}
-
-// 3D Punkt in kartesischen Koordinaten.
-struct point{
- double x, y, z;
- point() {}
- point(double x, double y, double z) : x(x), y(y), z(z) {}
- point(double lat, double lon) {
- lat *= PI / 180.0; lon *= PI / 180.0;
- x = cos(lat) * sin(lon);
- y = cos(lat) * cos(lon);
- z = sin(lat);
- }
-};
+} \ No newline at end of file
diff --git a/test/geometry/spheres.cpp b/test/geometry/spheres.cpp
new file mode 100644
index 0000000..16e0ebd
--- /dev/null
+++ b/test/geometry/spheres.cpp
@@ -0,0 +1,28 @@
+#include "../util.h"
+constexpr double PI = acos(-1.0);
+#pragma GCC diagnostic ignored "-Wshadow"
+#include <geometry/spheres.cpp>
+
+void test_consistent() {
+ ll queries = 0;
+ for (int tries = 0; tries < 100'000; tries++) {
+ auto pLat = Random::real<double>(-180, 180);
+ auto pLon = Random::real<double>(0, 360);
+ auto qLat = Random::real<double>(-180, 180);
+ auto qLon = Random::real<double>(0, 360);
+
+ point p(pLat, pLon);
+ point q(qLat, qLon);
+
+ auto gotA = gcDist(pLat, pLon, qLat, qLon, 1);
+ auto gotB = gcDist(p, q);
+
+ if (abs(gotA - gotB) > 1e-6) cerr << "gotA: " << gotA << ", gotB: " << gotB << FAIL;
+ queries++;
+ }
+ cerr << "tested random: " << queries << endl;
+}
+
+int main() {
+ test_consistent();
+}