summaryrefslogtreecommitdiffstats
path: root/projects/learning-rust/1.html
diff options
context:
space:
mode:
authorJon Santmyer <jon@jonsantmyer.com>2024-09-30 12:05:43 -0400
committerJon Santmyer <jon@jonsantmyer.com>2024-09-30 12:05:43 -0400
commit4feb3a8fb81fa648c2c5f7a72029ff5b54cf0dcb (patch)
tree3f3025d22a9fe142690e04813c69f337cced3367 /projects/learning-rust/1.html
parentad94bcef3a643e1a96a9e7e5390132a8cd4f4256 (diff)
downloadwebsite-4feb3a8fb81fa648c2c5f7a72029ff5b54cf0dcb.tar.gz
website-4feb3a8fb81fa648c2c5f7a72029ff5b54cf0dcb.tar.bz2
website-4feb3a8fb81fa648c2c5f7a72029ff5b54cf0dcb.zip
learning rust project startHEADmaster
Diffstat (limited to 'projects/learning-rust/1.html')
-rw-r--r--projects/learning-rust/1.html58
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">&lt;</a>
+ <a class="link-button" href="/projects/learning-rust">Home</a>
+ <a class="link-button" href="/projects/learning-rust/2.html">&gt;</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&lt;usize&gt;,
+ //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>