diff options
Diffstat (limited to 'projects/learning-rust/1.html')
-rw-r--r-- | projects/learning-rust/1.html | 58 |
1 files changed, 37 insertions, 21 deletions
diff --git a/projects/learning-rust/1.html b/projects/learning-rust/1.html index 840a968..be6bfa7 100644 --- a/projects/learning-rust/1.html +++ b/projects/learning-rust/1.html @@ -1,7 +1,7 @@ <!DOCTYPE html> <html> <head> - <title>1: Solar Systems</title> + <title>1: Orbitals</title> <link rel="stylesheet" href="/style.css"/> <link rel="stylesheet" href="/prism/prism.css"/> @@ -9,22 +9,33 @@ </head> <body> <div class="window"> - <div class="window-title"><h2 style="padding: 0px; margin: 0px;">Learning Rust : Solar Systems</h2></div> + <div class="window-title"><h2 style="padding: 0px; margin: 0px;">Learning Rust : Orbitals</h2></div> <i>How do I store non-owning references to collection members?</i> <div class="window-content"> <a class="link-button" href="/projects/learning-rust"><</a> + <a class="link-button" href="/projects/learning-rust">Home</a> + <a class="link-button" href="/projects/learning-rust/2.html">></a> <p>I want to make a data-driven viewer for the solar system, as part of a game inspired by <a href="https://www.aurora2.pentarch.org/">Aurora 4x</a> but Rust is an entirely different beast from C.</p> + <p>So let's start with the types i'll use:</p> + <pre><code class="language-rust"> +pub const GRAVITATIONAL_CONSTANT : f64 = 6.67430e-11; + +pub type Second = u64; +pub type Meter = f64; +pub type Rad = f64; +pub type Kilogram = f64; + </code></pre> <p>I have prior experience writing systems like this, so I figured it would be as easy as:</p> <pre><code class="language-rust"> pub struct Orbital { //Some optional non-owning reference to the parent orbital - mass : f64, - semi_major_axis : f64, - eccentricity : f64, - inclination : f64, - long_asc_node : f64, - argument_periapsis : f64, - mean_anomaly_epoch : f64 + mass : Kilogram, + semi_major_axis : Rad, + eccentricity : Rad, + inclination : Rad, + long_asc_node : Rad, + argument_periapsis : Rad, + mean_anomaly_epoch : Rad } </code></pre> <p>The question then is: How do we store the reference to the parent orbital?</p> @@ -36,33 +47,38 @@ pub struct Orbital { <p>But not every part of the update function needs the parent orbital's position, so I can split the update into two parts:</p> <p>1: Update the orbital elements relative to the parent object</p> <p>2: Use the parent orbital's position to transform the relative coordinates into absolute coordinates</p> + <p>All the tick method needs is an immutable parent object to calculate the standard gravitational parameter of the one-body system being emulated.</p> <p>So here's what I came up with.</p> <pre><code class="language-rust"> pub struct Orbital { - parent_index : usize, - //Temporary state variables for later update. - rel_pos : (f64, f64, f64) + origin : Option<usize>, + //Euler angles for a given time (T) relative to origin + rel_pos : Option<(Second, Meter, Rad, Rad, Rad)> + //Cartesian coordinates for a given time (T) relative to (0, 0, 0) + abs_pos : Option<(Second, Meter, Meter, Meter)> //Orbital parameters - mass : f64, - semi_major_axis : f64, - eccentricity : f64, - inclination : f64, - long_asc_node : f64, - argument_periapsis : f64, - mean_anomaly_epoch : f64 + mass : Kilogram, + semi_major_axis : Meter, + eccentricity : Rad, + inclination : Rad, + long_asc_node : Rad, + argument_periapsis : Rad, + mean_anomaly_epoch : Rad } //... impl Orbital { //... - pub fn update_rel(&mut self) -> Orbital { + //Update relative + pub fn tick(&mut self, &system: System, t: Second) { //... } - pub fn update(&self, &system : System) -> (f64, f64, f64) { + pub fn pos(&self, &system : System, t: Second) -> (Meter, Meter, Meter) { //... } } </code></pre> + <p>Now comes the daunting task of storing our orbitals in a usable manner. Ideally, I want to iterate through the list of orbitals in a way that also lets me access other members of the orbital list from the tick and pos functions. It's a lot harder than it should be.</p> </div> </div> </body> |