Donut

Struct Donut 

Source
pub struct Donut<const WIDTH: u8 = 80, const HEIGHT: u8 = 22, const VIEWER_DISTANCE: u8 = 5, const BRIGHTNESS_FACTOR: u8 = 8, const J_STEP_VALUE: u8 = 7, const J_STEP_DENOM: u8 = 100, const I_STEP_VALUE: u8 = 2, const I_STEP_DENOM: u8 = 100, const CHAR_BRIGHTNESS_0: char = ' ', const CHAR_BRIGHTNESS_1: char = '.', const CHAR_BRIGHTNESS_2: char = ',', const CHAR_BRIGHTNESS_3: char = '-', const CHAR_BRIGHTNESS_4: char = '~', const CHAR_BRIGHTNESS_5: char = ':', const CHAR_BRIGHTNESS_6: char = ';', const CHAR_BRIGHTNESS_7: char = '=', const CHAR_BRIGHTNESS_8: char = '!', const CHAR_BRIGHTNESS_9: char = '*', const CHAR_BRIGHTNESS_10: char = '#', const CHAR_BRIGHTNESS_11: char = '$', const CHAR_BRIGHTNESS_12: char = '@'> {
    pub a_cos: f32,
    pub a_sin: f32,
    pub b_cos: f32,
    pub b_sin: f32,
}
Expand description

A configurable “Donut” that can render ASCII frames without std.

The donut is rendered by sampling points on a torus surface using two angles, and projecting those points into 2D screen space. The brightness of each point is determined by the surface’s orientation relative to a light source.

Fields§

§a_cos: f32§a_sin: f32§b_cos: f32§b_sin: f32

Implementations§

Source§

impl<const WIDTH: u8, const HEIGHT: u8, const VIEWER_DISTANCE: u8, const BRIGHTNESS_FACTOR: u8, const J_STEP_VALUE: u8, const J_STEP_DENOM: u8, const I_STEP_VALUE: u8, const I_STEP_DENOM: u8, const C0: char, const C1: char, const C2: char, const C3: char, const C4: char, const C5: char, const C6: char, const C7: char, const C8: char, const C9: char, const C10: char, const C11: char, const C12: char> Donut<WIDTH, HEIGHT, VIEWER_DISTANCE, BRIGHTNESS_FACTOR, J_STEP_VALUE, J_STEP_DENOM, I_STEP_VALUE, I_STEP_DENOM, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12>

Source

pub const fn new() -> Self

Create a new donut with initial rotation values set to represent 0 (cosine=1, sine=0).

Source

pub fn rotate(&mut self, da: f32, db: f32)

Increment the rotation angles by da and db.

Rotating the donut creates the animation effect.

Source

pub fn render_frame_in_place(&self, output: &mut [char], zbuf: &mut [f32])

Render one ASCII frame in-place:

  • output should be (WIDTH*HEIGHT) in length, for storing characters.
  • zbuf should also be (WIDTH*HEIGHT) in length, for storing depth.

All these slots will be overwritten with the new frame’s data.

You can then print the output slice as lines of WIDTH characters.

Trait Implementations§

Source§

impl Default for Donut

Source§

fn default() -> Self

Returns the “default value” for a type. Read more

Auto Trait Implementations§

§

impl<const WIDTH: u8, const HEIGHT: u8, const VIEWER_DISTANCE: u8, const BRIGHTNESS_FACTOR: u8, const J_STEP_VALUE: u8, const J_STEP_DENOM: u8, const I_STEP_VALUE: u8, const I_STEP_DENOM: u8, const CHAR_BRIGHTNESS_0: char, const CHAR_BRIGHTNESS_1: char, const CHAR_BRIGHTNESS_2: char, const CHAR_BRIGHTNESS_3: char, const CHAR_BRIGHTNESS_4: char, const CHAR_BRIGHTNESS_5: char, const CHAR_BRIGHTNESS_6: char, const CHAR_BRIGHTNESS_7: char, const CHAR_BRIGHTNESS_8: char, const CHAR_BRIGHTNESS_9: char, const CHAR_BRIGHTNESS_10: char, const CHAR_BRIGHTNESS_11: char, const CHAR_BRIGHTNESS_12: char> Freeze for Donut<WIDTH, HEIGHT, VIEWER_DISTANCE, BRIGHTNESS_FACTOR, J_STEP_VALUE, J_STEP_DENOM, I_STEP_VALUE, I_STEP_DENOM, CHAR_BRIGHTNESS_0, CHAR_BRIGHTNESS_1, CHAR_BRIGHTNESS_2, CHAR_BRIGHTNESS_3, CHAR_BRIGHTNESS_4, CHAR_BRIGHTNESS_5, CHAR_BRIGHTNESS_6, CHAR_BRIGHTNESS_7, CHAR_BRIGHTNESS_8, CHAR_BRIGHTNESS_9, CHAR_BRIGHTNESS_10, CHAR_BRIGHTNESS_11, CHAR_BRIGHTNESS_12>

§

impl<const WIDTH: u8, const HEIGHT: u8, const VIEWER_DISTANCE: u8, const BRIGHTNESS_FACTOR: u8, const J_STEP_VALUE: u8, const J_STEP_DENOM: u8, const I_STEP_VALUE: u8, const I_STEP_DENOM: u8, const CHAR_BRIGHTNESS_0: char, const CHAR_BRIGHTNESS_1: char, const CHAR_BRIGHTNESS_2: char, const CHAR_BRIGHTNESS_3: char, const CHAR_BRIGHTNESS_4: char, const CHAR_BRIGHTNESS_5: char, const CHAR_BRIGHTNESS_6: char, const CHAR_BRIGHTNESS_7: char, const CHAR_BRIGHTNESS_8: char, const CHAR_BRIGHTNESS_9: char, const CHAR_BRIGHTNESS_10: char, const CHAR_BRIGHTNESS_11: char, const CHAR_BRIGHTNESS_12: char> RefUnwindSafe for Donut<WIDTH, HEIGHT, VIEWER_DISTANCE, BRIGHTNESS_FACTOR, J_STEP_VALUE, J_STEP_DENOM, I_STEP_VALUE, I_STEP_DENOM, CHAR_BRIGHTNESS_0, CHAR_BRIGHTNESS_1, CHAR_BRIGHTNESS_2, CHAR_BRIGHTNESS_3, CHAR_BRIGHTNESS_4, CHAR_BRIGHTNESS_5, CHAR_BRIGHTNESS_6, CHAR_BRIGHTNESS_7, CHAR_BRIGHTNESS_8, CHAR_BRIGHTNESS_9, CHAR_BRIGHTNESS_10, CHAR_BRIGHTNESS_11, CHAR_BRIGHTNESS_12>

§

impl<const WIDTH: u8, const HEIGHT: u8, const VIEWER_DISTANCE: u8, const BRIGHTNESS_FACTOR: u8, const J_STEP_VALUE: u8, const J_STEP_DENOM: u8, const I_STEP_VALUE: u8, const I_STEP_DENOM: u8, const CHAR_BRIGHTNESS_0: char, const CHAR_BRIGHTNESS_1: char, const CHAR_BRIGHTNESS_2: char, const CHAR_BRIGHTNESS_3: char, const CHAR_BRIGHTNESS_4: char, const CHAR_BRIGHTNESS_5: char, const CHAR_BRIGHTNESS_6: char, const CHAR_BRIGHTNESS_7: char, const CHAR_BRIGHTNESS_8: char, const CHAR_BRIGHTNESS_9: char, const CHAR_BRIGHTNESS_10: char, const CHAR_BRIGHTNESS_11: char, const CHAR_BRIGHTNESS_12: char> Send for Donut<WIDTH, HEIGHT, VIEWER_DISTANCE, BRIGHTNESS_FACTOR, J_STEP_VALUE, J_STEP_DENOM, I_STEP_VALUE, I_STEP_DENOM, CHAR_BRIGHTNESS_0, CHAR_BRIGHTNESS_1, CHAR_BRIGHTNESS_2, CHAR_BRIGHTNESS_3, CHAR_BRIGHTNESS_4, CHAR_BRIGHTNESS_5, CHAR_BRIGHTNESS_6, CHAR_BRIGHTNESS_7, CHAR_BRIGHTNESS_8, CHAR_BRIGHTNESS_9, CHAR_BRIGHTNESS_10, CHAR_BRIGHTNESS_11, CHAR_BRIGHTNESS_12>

§

impl<const WIDTH: u8, const HEIGHT: u8, const VIEWER_DISTANCE: u8, const BRIGHTNESS_FACTOR: u8, const J_STEP_VALUE: u8, const J_STEP_DENOM: u8, const I_STEP_VALUE: u8, const I_STEP_DENOM: u8, const CHAR_BRIGHTNESS_0: char, const CHAR_BRIGHTNESS_1: char, const CHAR_BRIGHTNESS_2: char, const CHAR_BRIGHTNESS_3: char, const CHAR_BRIGHTNESS_4: char, const CHAR_BRIGHTNESS_5: char, const CHAR_BRIGHTNESS_6: char, const CHAR_BRIGHTNESS_7: char, const CHAR_BRIGHTNESS_8: char, const CHAR_BRIGHTNESS_9: char, const CHAR_BRIGHTNESS_10: char, const CHAR_BRIGHTNESS_11: char, const CHAR_BRIGHTNESS_12: char> Sync for Donut<WIDTH, HEIGHT, VIEWER_DISTANCE, BRIGHTNESS_FACTOR, J_STEP_VALUE, J_STEP_DENOM, I_STEP_VALUE, I_STEP_DENOM, CHAR_BRIGHTNESS_0, CHAR_BRIGHTNESS_1, CHAR_BRIGHTNESS_2, CHAR_BRIGHTNESS_3, CHAR_BRIGHTNESS_4, CHAR_BRIGHTNESS_5, CHAR_BRIGHTNESS_6, CHAR_BRIGHTNESS_7, CHAR_BRIGHTNESS_8, CHAR_BRIGHTNESS_9, CHAR_BRIGHTNESS_10, CHAR_BRIGHTNESS_11, CHAR_BRIGHTNESS_12>

§

impl<const WIDTH: u8, const HEIGHT: u8, const VIEWER_DISTANCE: u8, const BRIGHTNESS_FACTOR: u8, const J_STEP_VALUE: u8, const J_STEP_DENOM: u8, const I_STEP_VALUE: u8, const I_STEP_DENOM: u8, const CHAR_BRIGHTNESS_0: char, const CHAR_BRIGHTNESS_1: char, const CHAR_BRIGHTNESS_2: char, const CHAR_BRIGHTNESS_3: char, const CHAR_BRIGHTNESS_4: char, const CHAR_BRIGHTNESS_5: char, const CHAR_BRIGHTNESS_6: char, const CHAR_BRIGHTNESS_7: char, const CHAR_BRIGHTNESS_8: char, const CHAR_BRIGHTNESS_9: char, const CHAR_BRIGHTNESS_10: char, const CHAR_BRIGHTNESS_11: char, const CHAR_BRIGHTNESS_12: char> Unpin for Donut<WIDTH, HEIGHT, VIEWER_DISTANCE, BRIGHTNESS_FACTOR, J_STEP_VALUE, J_STEP_DENOM, I_STEP_VALUE, I_STEP_DENOM, CHAR_BRIGHTNESS_0, CHAR_BRIGHTNESS_1, CHAR_BRIGHTNESS_2, CHAR_BRIGHTNESS_3, CHAR_BRIGHTNESS_4, CHAR_BRIGHTNESS_5, CHAR_BRIGHTNESS_6, CHAR_BRIGHTNESS_7, CHAR_BRIGHTNESS_8, CHAR_BRIGHTNESS_9, CHAR_BRIGHTNESS_10, CHAR_BRIGHTNESS_11, CHAR_BRIGHTNESS_12>

§

impl<const WIDTH: u8, const HEIGHT: u8, const VIEWER_DISTANCE: u8, const BRIGHTNESS_FACTOR: u8, const J_STEP_VALUE: u8, const J_STEP_DENOM: u8, const I_STEP_VALUE: u8, const I_STEP_DENOM: u8, const CHAR_BRIGHTNESS_0: char, const CHAR_BRIGHTNESS_1: char, const CHAR_BRIGHTNESS_2: char, const CHAR_BRIGHTNESS_3: char, const CHAR_BRIGHTNESS_4: char, const CHAR_BRIGHTNESS_5: char, const CHAR_BRIGHTNESS_6: char, const CHAR_BRIGHTNESS_7: char, const CHAR_BRIGHTNESS_8: char, const CHAR_BRIGHTNESS_9: char, const CHAR_BRIGHTNESS_10: char, const CHAR_BRIGHTNESS_11: char, const CHAR_BRIGHTNESS_12: char> UnwindSafe for Donut<WIDTH, HEIGHT, VIEWER_DISTANCE, BRIGHTNESS_FACTOR, J_STEP_VALUE, J_STEP_DENOM, I_STEP_VALUE, I_STEP_DENOM, CHAR_BRIGHTNESS_0, CHAR_BRIGHTNESS_1, CHAR_BRIGHTNESS_2, CHAR_BRIGHTNESS_3, CHAR_BRIGHTNESS_4, CHAR_BRIGHTNESS_5, CHAR_BRIGHTNESS_6, CHAR_BRIGHTNESS_7, CHAR_BRIGHTNESS_8, CHAR_BRIGHTNESS_9, CHAR_BRIGHTNESS_10, CHAR_BRIGHTNESS_11, CHAR_BRIGHTNESS_12>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.