diff --git a/example/include/geographic.h b/example/include/geographic.h index 0ccda628..003db203 100644 --- a/example/include/geographic.h +++ b/example/include/geographic.h @@ -178,10 +178,10 @@ distance spherical_distance(position from, position to) using isq::sin, isq::cos, isq::asin, isq::acos; - const quantity from_lat = from.lat.quantity_from(equator); - const quantity from_lon = from.lon.quantity_from(prime_meridian); - const quantity to_lat = to.lat.quantity_from(equator); - const quantity to_lon = to.lon.quantity_from(prime_meridian); + const quantity from_lat = from.lat.quantity_from_zero(); + const quantity from_lon = from.lon.quantity_from_zero(); + const quantity to_lat = to.lat.quantity_from_zero(); + const quantity to_lon = to.lon.quantity_from_zero(); // https://en.wikipedia.org/wiki/Great-circle_distance#Formulae if constexpr (sizeof(T) >= 8) { diff --git a/example/unmanned_aerial_vehicle.cpp b/example/unmanned_aerial_vehicle.cpp index 228e22f0..fe465f68 100644 --- a/example/unmanned_aerial_vehicle.cpp +++ b/example/unmanned_aerial_vehicle.cpp @@ -97,8 +97,8 @@ template hae_altitude to_hae(msl_altitude msl, position pos) { const auto geoid_undulation = - isq::height(GeographicLibWhatsMyOffset(pos.lat.quantity_from(equator).numerical_value_in(si::degree), - pos.lon.quantity_from(prime_meridian).numerical_value_in(si::degree)) * + isq::height(GeographicLibWhatsMyOffset(pos.lat.quantity_from_zero().numerical_value_in(si::degree), + pos.lon.quantity_from_zero().numerical_value_in(si::degree)) * si::metre); return height_above_ellipsoid + (msl - mean_sea_level - geoid_undulation); } diff --git a/src/core/include/mp-units/quantity_point.h b/src/core/include/mp-units/quantity_point.h index 4f8c1bcc..d633d1f4 100644 --- a/src/core/include/mp-units/quantity_point.h +++ b/src/core/include/mp-units/quantity_point.h @@ -266,13 +266,11 @@ public: const auto q = quantity_from(unit.point_origin); if constexpr (requires { q.in(unit); }) // restore the unit if possible (non-truncating) - // original quantity point unit can be lost in the below operation - const auto q = quantity_from(zeroth_point_origin(R)); - if constexpr (requires { q.in(unit); }) - // restore it if possible (non-truncating) - return q.in(unit); - else - return q; + return q.in(unit); + else + return q; + } else + return quantity_from(absolute_point_origin); } // unit conversions diff --git a/test/unit_test/static/quantity_point_test.cpp b/test/unit_test/static/quantity_point_test.cpp index 082ff3f2..bb3da04e 100644 --- a/test/unit_test/static/quantity_point_test.cpp +++ b/test/unit_test/static/quantity_point_test.cpp @@ -798,6 +798,10 @@ static_assert(quantity_point{isq::height(42 * m)}.quantity_from_zero() == 42 * m static_assert(quantity_point{20 * deg_C}.quantity_from_zero() == 20 * deg_C); static_assert(quantity_point{20. * deg_C}.in(deg_F).quantity_from_zero() == 68 * deg_F); +static_assert((mean_sea_level + 42 * m).quantity_from_zero() == 42 * m); +static_assert((ground_level + 42 * m).quantity_from_zero() == 84 * m); +static_assert((tower_peak + 42 * m).quantity_from_zero() == 126 * m); + static_assert((mean_sea_level + 42 * m).quantity_from(mean_sea_level) == 42 * m); static_assert((mean_sea_level + isq::height(42 * m)).quantity_from(mean_sea_level) == 42 * m); @@ -979,14 +983,14 @@ static_assert([](auto v) { //////////////////////// // same type -static_assert((mean_sea_level + 1 * m += 1 * m).quantity_from(mean_sea_level).numerical_value_in(m) == 2); -static_assert((mean_sea_level + 2 * m -= 1 * m).quantity_from(mean_sea_level).numerical_value_in(m) == 1); +static_assert((mean_sea_level + 1 * m += 1 * m).quantity_from_zero().numerical_value_in(m) == 2); +static_assert((mean_sea_level + 2 * m -= 1 * m).quantity_from_zero().numerical_value_in(m) == 1); // different types -static_assert((mean_sea_level + 2.5 * m += 3 * m).quantity_from(mean_sea_level).numerical_value_in(m) == 5.5); -static_assert((mean_sea_level + 123 * m += 1 * km).quantity_from(mean_sea_level).numerical_value_in(m) == 1123); -static_assert((mean_sea_level + 5.5 * m -= 3 * m).quantity_from(mean_sea_level).numerical_value_in(m) == 2.5); -static_assert((mean_sea_level + 1123 * m -= 1 * km).quantity_from(mean_sea_level).numerical_value_in(m) == 123); +static_assert((mean_sea_level + 2.5 * m += 3 * m).quantity_from_zero().numerical_value_in(m) == 5.5); +static_assert((mean_sea_level + 123 * m += 1 * km).quantity_from_zero().numerical_value_in(m) == 1123); +static_assert((mean_sea_level + 5.5 * m -= 3 * m).quantity_from_zero().numerical_value_in(m) == 2.5); +static_assert((mean_sea_level + 1123 * m -= 1 * km).quantity_from_zero().numerical_value_in(m) == 123); template typename QP>