TerrainGen coverage


terraingen/
Coverage:
low: ≥ 0%
medium: ≥ 75.0%
high: ≥ 90.0%
Lines:
1 / 1
100.0%
Branches:
-
-%
Functions:
1 / 1
100.0%

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