mirror of
https://github.com/kristoferssolo/donut-rs.git
synced 2025-10-21 19:20:34 +00:00
Fix flickering
This commit is contained in:
parent
3f0e643614
commit
0d2d5548ae
35
src/main.rs
35
src/main.rs
@ -5,11 +5,11 @@ fn main() {
|
|||||||
let mut a: f32 = 0.0;
|
let mut a: f32 = 0.0;
|
||||||
let mut b: f32 = 0.0;
|
let mut b: f32 = 0.0;
|
||||||
|
|
||||||
print!("\x1B[2J"); // clears screen
|
print!("\x1b[2J"); // clears screen
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
let mut z: [f32; SCREEN_SIZE] = [0.0; SCREEN_SIZE];
|
let mut zbuffer: [f32; SCREEN_SIZE] = [0.0; SCREEN_SIZE];
|
||||||
let mut screen: [char; SCREEN_SIZE] = [' '; SCREEN_SIZE];
|
let mut output: [char; SCREEN_SIZE] = [' '; SCREEN_SIZE];
|
||||||
|
|
||||||
for j in (0..=628).step_by(7) {
|
for j in (0..=628).step_by(7) {
|
||||||
let j: f32 = 0.01 * j as f32;
|
let j: f32 = 0.01 * j as f32;
|
||||||
@ -28,16 +28,19 @@ fn main() {
|
|||||||
let cos_j: f32 = j.cos();
|
let cos_j: f32 = j.cos();
|
||||||
|
|
||||||
let cos_j2: f32 = cos_j + 2.0;
|
let cos_j2: f32 = cos_j + 2.0;
|
||||||
let mess: f32 = 1.0 / (sin_i * cos_j2 * sin_a + sin_j * cos_a + 5.0);
|
|
||||||
|
let z: f32 = sin_i * cos_j2 * sin_a + sin_j * cos_a + 5.0;
|
||||||
|
let ooz: f32 = 1.0 / z; // one over z
|
||||||
|
|
||||||
let t: f32 = sin_i * cos_j2 * cos_a - sin_j * sin_a;
|
let t: f32 = sin_i * cos_j2 * cos_a - sin_j * sin_a;
|
||||||
// 40 is the left screen shift
|
// 40 is the left screen shift
|
||||||
let x: i32 = (40.0 + 30.0 * mess * (cos_i * cos_j2 * cos_b - t * sin_b)) as i32;
|
let x: i32 = (40.0 + 30.0 * ooz * (cos_i * cos_j2 * cos_b - t * sin_b)) as i32;
|
||||||
// 12 is the bottom screen shift
|
// 12 is the bottom screen shift
|
||||||
let y: i32 = (12.0 + 15.0 * mess * (cos_i * cos_j2 * sin_b + t * cos_b)) as i32;
|
let y: i32 = (12.0 + 15.0 * ooz * (cos_i * cos_j2 * sin_b + t * cos_b)) as i32;
|
||||||
let o: usize = (x + WIDTH * y) as usize;
|
let o: usize = (x + WIDTH * y) as usize;
|
||||||
// multiplying by 8 to bring in range 0-11 as 8*(sqrt(2))=11
|
// multiplying by 8 to bring in range 0-11 as 8*(sqrt(2))=11
|
||||||
// because we have 11 luminance characters
|
// because we have 11 luminance characters
|
||||||
let n: i32 = (8.0
|
let luminance_index: i32 = (8.0
|
||||||
* ((sin_j * sin_a - sin_i * cos_j * cos_a) * cos_b
|
* ((sin_j * sin_a - sin_i * cos_j * cos_a) * cos_b
|
||||||
- sin_i * cos_j * sin_a
|
- sin_i * cos_j * sin_a
|
||||||
- sin_j * cos_a
|
- sin_j * cos_a
|
||||||
@ -50,25 +53,25 @@ fn main() {
|
|||||||
// i.e. when z[o] is 0 or the prev point is behind the new point
|
// i.e. when z[o] is 0 or the prev point is behind the new point
|
||||||
// so we change it to the point nearer to the eye/ above prev point
|
// so we change it to the point nearer to the eye/ above prev point
|
||||||
|
|
||||||
if 0 < y && y < HEIGHT && 0 < x && x < WIDTH && mess > z[o] {
|
if 0 < y && y < HEIGHT && 0 < x && x < WIDTH && ooz > zbuffer[o] {
|
||||||
z[o] = mess;
|
zbuffer[o] = ooz;
|
||||||
if n > 0 {
|
if luminance_index > 0 {
|
||||||
let m: usize = n as usize;
|
let m: usize = luminance_index as usize;
|
||||||
screen[o] = ".,-~:;=!*#$Q".chars().nth(m).unwrap();
|
output[o] = ".,-~:;=!*#$@".chars().nth(m).unwrap();
|
||||||
} else {
|
} else {
|
||||||
screen[o] = '.';
|
output[o] = '.';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// print
|
// print
|
||||||
print!("\x1B[2J");
|
print!("\x1b[H");
|
||||||
for index in 0..screen.len() {
|
for index in 0..output.len() {
|
||||||
let i: i32 = index as i32;
|
let i: i32 = index as i32;
|
||||||
if i % WIDTH == 0 {
|
if i % WIDTH == 0 {
|
||||||
println!();
|
println!();
|
||||||
} else {
|
} else {
|
||||||
print!("{}", screen[index]);
|
print!("{}", output[index]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user