From 5c9e65c7f27aeaaca52e9e36a03cce861644a17c Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Fri, 24 Aug 2018 03:37:22 -0600 Subject: [PATCH] Add strange units to the distance conversion (closes #703) --- include/openspace/util/distanceconversion.h | 121 +++++++++++++++----- 1 file changed, 92 insertions(+), 29 deletions(-) diff --git a/include/openspace/util/distanceconversion.h b/include/openspace/util/distanceconversion.h index 0a2a05f86c..eff927ac92 100644 --- a/include/openspace/util/distanceconversion.h +++ b/include/openspace/util/distanceconversion.h @@ -49,7 +49,17 @@ enum class DistanceUnit { Parsec, Kiloparsec, Megaparsec, - Gigaparsec + Gigaparsec, + + // Weird units + Thou, + Inch, + Foot, + Yard, + Chain, + Furlong, + Mile, + League }; // Assumption: Unit names are sequential in memory @@ -67,6 +77,15 @@ constexpr const char* DistanceUnitParsec = "parsec"; constexpr const char* DistanceUnitKiloparsec = "kiloparsec"; constexpr const char* DistanceUnitMegaparsec = "megaparsec"; constexpr const char* DistanceUnitGigaparsec = "gigaparsec"; +constexpr const char* DistanceUnitThou = "thou"; +constexpr const char* DistanceUnitInch = "inch"; +constexpr const char* DistanceUnitFoot = "foot"; +constexpr const char* DistanceUnitYard = "yard"; +constexpr const char* DistanceUnitChain = "chain"; +constexpr const char* DistanceUnitFurlong = "furlong"; +constexpr const char* DistanceUnitMile = "mile"; +constexpr const char* DistanceUnitLeague = "league"; + // Assumption: Unit names are sequential in memory constexpr const char* DistanceUnitNanometers = "nanometers"; @@ -83,32 +102,46 @@ constexpr const char* DistanceUnitParsecs = "parsecs"; constexpr const char* DistanceUnitKiloparsecs = "kiloparsecs"; constexpr const char* DistanceUnitMegaparsecs = "megaparsecs"; constexpr const char* DistanceUnitGigaparsecs = "gigaparsecs"; +constexpr const char* DistanceUnitThous = "thou"; +constexpr const char* DistanceUnitInches = "inches"; +constexpr const char* DistanceUnitFeet = "feet"; +constexpr const char* DistanceUnitYards = "yards"; +constexpr const char* DistanceUnitChains = "chains"; +constexpr const char* DistanceUnitFurlongs = "furlongs"; +constexpr const char* DistanceUnitMiles = "miles"; +constexpr const char* DistanceUnitLeagues = "leagues"; -constexpr const std::array(DistanceUnit::Gigaparsec) + 1> +constexpr const std::array(DistanceUnit::League) + 1> DistanceUnits = { DistanceUnit::Nanometer, DistanceUnit::Micrometer, DistanceUnit::Millimeter, DistanceUnit::Meter, DistanceUnit::Kilometer, DistanceUnit::AU, DistanceUnit::Lighthour, DistanceUnit::Lightday, DistanceUnit::Lightmonth, DistanceUnit::Lightyear, DistanceUnit::Parsec, DistanceUnit::Kiloparsec, - DistanceUnit::Megaparsec, DistanceUnit::Gigaparsec + DistanceUnit::Megaparsec, DistanceUnit::Gigaparsec, DistanceUnit::Thou, + DistanceUnit::Inch, DistanceUnit::Foot, DistanceUnit::Yard, DistanceUnit::Chain, + DistanceUnit::Furlong, DistanceUnit::Mile, DistanceUnit::League }; -constexpr const std::array(DistanceUnit::Gigaparsec) + 1> +constexpr const std::array(DistanceUnit::League) + 1> DistanceUnitNamesSingular = { DistanceUnitNanometer, DistanceUnitMicrometer, DistanceUnitMillimeter, DistanceUnitMeter, DistanceUnitKilometer, DistanceUnitAU, DistanceUnitLighthour, DistanceUnitLightday, DistanceUnitLightmonth, DistanceUnitLightyear, DistanceUnitParsec, DistanceUnitKiloparsec, DistanceUnitMegaparsec, - DistanceUnitGigaparsec + DistanceUnitGigaparsec, DistanceUnitThou, DistanceUnitInch, DistanceUnitFoot, + DistanceUnitYard, DistanceUnitChain, DistanceUnitFurlong, DistanceUnitMile, + DistanceUnitLeague }; -constexpr const std::array(DistanceUnit::Gigaparsec) + 1> +constexpr const std::array(DistanceUnit::League) + 1> DistanceUnitNamesPlural = { DistanceUnitNanometers, DistanceUnitMicrometers, DistanceUnitMillimeters, DistanceUnitMeters, DistanceUnitKilometers, DistanceUnitAUs, DistanceUnitLighthours, DistanceUnitLightdays, DistanceUnitLightmonths, DistanceUnitLightyears, DistanceUnitParsecs, DistanceUnitKiloparsecs, DistanceUnitMegaparsecs, - DistanceUnitGigaparsecs + DistanceUnitGigaparsecs, DistanceUnitThous, DistanceUnitInches, DistanceUnitFeet, + DistanceUnitYards, DistanceUnitChains, DistanceUnitFurlongs, DistanceUnitMile, + DistanceUnitLeague }; constexpr bool isValidDistanceUnitName(const char* name) { @@ -132,28 +165,36 @@ constexpr bool isValidDistanceUnitName(const char* name) { constexpr const char* nameForDistanceUnit(DistanceUnit unit, bool pluralForm = false) { switch (unit) { - case DistanceUnit::Nanometer: - case DistanceUnit::Micrometer: - case DistanceUnit::Millimeter: - case DistanceUnit::Meter: - case DistanceUnit::Kilometer: - case DistanceUnit::AU: - case DistanceUnit::Lighthour: - case DistanceUnit::Lightday: - case DistanceUnit::Lightmonth: - case DistanceUnit::Lightyear: - case DistanceUnit::Parsec: - case DistanceUnit::Kiloparsec: - case DistanceUnit::Megaparsec: - case DistanceUnit::Gigaparsec: - if (pluralForm) { - return DistanceUnitNamesPlural[static_cast(unit)]; - } - else { - return DistanceUnitNamesSingular[static_cast(unit)]; - } - default: - throw ghoul::MissingCaseException(); + case DistanceUnit::Nanometer: + case DistanceUnit::Micrometer: + case DistanceUnit::Millimeter: + case DistanceUnit::Meter: + case DistanceUnit::Kilometer: + case DistanceUnit::AU: + case DistanceUnit::Lighthour: + case DistanceUnit::Lightday: + case DistanceUnit::Lightmonth: + case DistanceUnit::Lightyear: + case DistanceUnit::Parsec: + case DistanceUnit::Kiloparsec: + case DistanceUnit::Megaparsec: + case DistanceUnit::Gigaparsec: + case DistanceUnit::Thou: + case DistanceUnit::Inch: + case DistanceUnit::Foot: + case DistanceUnit::Yard: + case DistanceUnit::Chain: + case DistanceUnit::Furlong: + case DistanceUnit::Mile: + case DistanceUnit::League: + if (pluralForm) { + return DistanceUnitNamesPlural[static_cast(unit)]; + } + else { + return DistanceUnitNamesSingular[static_cast(unit)]; + } + default: + throw ghoul::MissingCaseException(); } } @@ -221,6 +262,28 @@ constexpr double convertDistance(double meters, DistanceUnit requestedUnit) { return meters / (1e6 * distanceconstants::Parsec); case DistanceUnit::Gigaparsec: return meters / (1e9 * distanceconstants::Parsec); + // Such wow, such coefficients + case DistanceUnit::Thou: + return (meters * 1000.0 / 25.4) * 1000.0; // m -> mm -> inch -> thou + case DistanceUnit::Inch: + return (meters * 1000.0 / 25.4); // m -> mm -> inch + case DistanceUnit::Foot: + return (meters * 1000.0 / 25.4) / 12.0; // m -> mm -> inch -> feet + case DistanceUnit::Yard: + // m -> mm -> inch -> feet -> yard + return (meters * 1000.0 / 25.4) / 12.0 / 3.0; + case DistanceUnit::Chain: + // m -> mm -> inch -> feet -> yard -> chain + return (meters * 1000.0 / 25.4) / 12.0 / 3.0 / 22.0; + case DistanceUnit::Furlong: + // m -> mm -> inch -> feet -> yard -> chain -> furlong + return (meters * 1000.0 / 25.4) / 12.0 / 3.0 / 22.0 / 10.0; + case DistanceUnit::Mile: + // m -> mm -> inch -> feet -> yard -> chain -> furlong -> mile + return (meters * 1000.0 / 25.4) / 12.0 / 3.0 / 22.0 / 10.0 / 8.0; + case DistanceUnit::League: + // m -> mm -> inch -> feet -> yard -> chain -> furlong -> mile -> league + return (meters * 1000.0 / 25.4) / 12.0 / 3.0 / 22.0 / 10.0 / 8.0 / 3.0; default: throw ghoul::MissingCaseException(); }