Show automaton rule by default

This commit is contained in:
Joscha 2025-03-02 22:40:41 +01:00
parent fc51055e88
commit b2211efe52
3 changed files with 21 additions and 8 deletions

View file

@ -1,3 +1,4 @@
{
"rule": 123,
"feed": false
}

View file

@ -3,8 +3,16 @@
#let data = json("data.json")
#set par(spacing: 6pt)
#image("image.png")
#if data.rule != none [
Cellular Automaton
#h(1fr)
Rule #data.rule
]
#if data.feed {
lib.feed
}

View file

@ -86,12 +86,12 @@ fn is_interesting(image: &RgbaImage) -> bool {
true
}
fn generate_interesting_image(rows: u32, cols: u32) -> RgbaImage {
fn generate_interesting_image(rows: u32, cols: u32) -> (u8, RgbaImage) {
loop {
let rule = rand::random();
let image = generate_image(rows, cols, rule);
if is_interesting(&image) {
break image;
break (rule, image);
}
println!("Uninteresting automaton, generating a new one");
}
@ -99,11 +99,13 @@ fn generate_interesting_image(rows: u32, cols: u32) -> RgbaImage {
#[derive(Serialize)]
struct Data {
rule: Option<u8>,
feed: bool,
}
#[derive(Deserialize)]
pub struct FormData {
pub show_rule: Option<bool>,
pub rule: Option<u8>,
pub rows: Option<u32>,
pub scale: Option<u32>,
@ -111,16 +113,13 @@ pub struct FormData {
}
pub async fn post(server: State<Server>, Form(form): Form<FormData>) -> somehow::Result<()> {
let data = Data {
feed: form.feed.unwrap_or(true),
};
let show_rule = form.show_rule.unwrap_or(true);
let scale = form.scale.unwrap_or(4).clamp(1, 16);
let rows = form.rows.unwrap_or(128 * 4 / scale).clamp(1, 1024 / scale);
let cols = Printer::WIDTH / scale;
let image = match form.rule {
Some(rule) => generate_image(rows, cols, rule),
let (rule, image) = match form.rule {
Some(rule) => (rule, generate_image(rows, cols, rule)),
None => generate_interesting_image(rows, cols),
};
@ -131,6 +130,11 @@ pub async fn post(server: State<Server>, Form(form): Form<FormData>) -> somehow:
imageops::Nearest,
);
let data = Data {
rule: Some(rule).filter(|_| show_rule),
feed: form.feed.unwrap_or(true),
};
let mut bytes: Vec<u8> = Vec::new();
image
.write_to(&mut Cursor::new(&mut bytes), ImageFormat::Png)