qtruss/
plotelt.rs

1//! Describes a plottable truss element.
2
3/// Color of maximum tensile stress.
4const TENSION: (f32, f32, f32) = (212., 0., 0.);
5
6/// Color of maximum compressive stress.
7const COMPRESSION: (f32, f32, f32) = (24., 106., 237.);
8
9/// Color of zero-load element.
10const ZEROLOAD: (f32, f32, f32) = (194., 194., 194.);
11
12#[derive(Clone, Copy, Debug)]
13/// A plottable truss element.
14pub struct PlottableElement {
15    pub x1: f32,
16    pub y1: f32,
17    pub x2: f32,
18    pub y2: f32,
19    pub stress: f32,
20    pub thickness: f32,
21}
22
23impl PlottableElement {
24    /// Constructs a "zero" element.
25    pub fn zero() -> Self {
26        Self {
27            x1: 0.0,
28            y1: 0.0,
29            x2: 0.0,
30            y2: 0.0,
31            stress: 0.0,
32            thickness: 0.0,
33        }
34    }
35
36    /// Returns an RGBA color suited for the stress applied.
37    pub fn rgba(&self) -> (u8, u8, u8, u8) {
38        let s = self.stress.abs();
39        if self.stress >= 0.0 {
40            // Tension
41            let r = (TENSION.0 - ZEROLOAD.0) * s + ZEROLOAD.0;
42            let g = (TENSION.1 - ZEROLOAD.1) * s + ZEROLOAD.1;
43            let b = (TENSION.2 - ZEROLOAD.2) * s + ZEROLOAD.2;
44            let a = 255.0 - 255.0 * (-100.0 * s).exp();
45
46            (r as u8, g as u8, b as u8, a as u8)
47        } else {
48            // Compression
49            let r = (COMPRESSION.0 - ZEROLOAD.0) * s + ZEROLOAD.0;
50            let g = (COMPRESSION.1 - ZEROLOAD.1) * s + ZEROLOAD.1;
51            let b = (COMPRESSION.2 - ZEROLOAD.2) * s + ZEROLOAD.2;
52            let a = 255.0 - 255.0 * (-100.0 * s).exp();
53
54            (r as u8, g as u8, b as u8, a as u8)
55        }
56    }
57}