layers/craters/ages/age_model.h
| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | /// @file | ||
| 2 | /// @brief `CraterAgeModel`, crater ages by diameter, and the simplest: `FreshAges`, `UniformAges`. | ||
| 3 | #pragma once | ||
| 4 | |||
| 5 | #include "terraingen/random/stream.h" | ||
| 6 | |||
| 7 | namespace terraingen { | ||
| 8 | |||
| 9 | /// Assigns ages to craters by diameter, within a visible lifetime per diameter. | ||
| 10 | class CraterAgeModel { | ||
| 11 | public: | ||
| 12 | 114529 | virtual ~CraterAgeModel() = default; | |
| 13 | |||
| 14 | /// The visible lifetime in Gyr of craters of `diameter` metres. | ||
| 15 | /// @throws std::domain_error if `diameter` is not positive and finite, or the model is not | ||
| 16 | /// defined there. | ||
| 17 | double LifetimeGyr(double diameter) const; | ||
| 18 | |||
| 19 | /// Draws the age in Gyr, within [0, `LifetimeGyr(diameter)`], of a crater of `diameter` metres. | ||
| 20 | /// @throws std::domain_error as `LifetimeGyr`. | ||
| 21 | double SampleAgeGyr(RandomStream& random, double diameter) const; | ||
| 22 | |||
| 23 | /// The share of a crater's lifetime left at `ageGyr`: 1 - `ageGyr` / `LifetimeGyr(diameter)`, | ||
| 24 | /// clamped to [0, 1]; 1 when the lifetime is zero. Diameter in metres. | ||
| 25 | /// @throws std::domain_error as `LifetimeGyr`. | ||
| 26 | double RemainingLifetime(double diameter, double ageGyr) const; | ||
| 27 | |||
| 28 | protected: | ||
| 29 | /// The lifetime in Gyr for a diameter (m) already checked positive and finite. | ||
| 30 | virtual double LifetimeAt(double diameter) const = 0; | ||
| 31 | |||
| 32 | /// Draws an age in Gyr for a diameter in metres; the caller clamps it to [0, `lifetimeGyr`]. | ||
| 33 | virtual double SampleAgeAt(RandomStream& random, double diameter, double lifetimeGyr) const = 0; | ||
| 34 | }; | ||
| 35 | |||
| 36 | /// Every crater is fresh: age and lifetime zero. | ||
| 37 | class FreshAges final : public CraterAgeModel { | ||
| 38 | protected: | ||
| 39 | double LifetimeAt(double diameter) const override; | ||
| 40 | double SampleAgeAt(RandomStream& random, double diameter, double lifetimeGyr) const override; | ||
| 41 | }; | ||
| 42 | |||
| 43 | /// Ages uniform over one lifetime for every diameter, so freshness is uniform in [0, 1]. | ||
| 44 | class UniformAges final : public CraterAgeModel { | ||
| 45 | public: | ||
| 46 | /// @param lifetimeGyr The lifetime of every crater, in Gyr. | ||
| 47 | /// @throws std::invalid_argument unless `lifetimeGyr` is positive and finite. | ||
| 48 | explicit UniformAges(double lifetimeGyr); | ||
| 49 | |||
| 50 | protected: | ||
| 51 | double LifetimeAt(double diameter) const override; | ||
| 52 | double SampleAgeAt(RandomStream& random, double diameter, double lifetimeGyr) const override; | ||
| 53 | |||
| 54 | private: | ||
| 55 | double lifetimeGyr_; | ||
| 56 | }; | ||
| 57 | |||
| 58 | } // namespace terraingen | ||
| 59 |