commit
439f4859b8
@ -0,0 +1,2 @@
|
|||||||
|
/target
|
||||||
|
**/*.rs.bk
|
@ -0,0 +1,116 @@
|
|||||||
|
# This file is automatically @generated by Cargo.
|
||||||
|
# It is not intended for manual editing.
|
||||||
|
[[package]]
|
||||||
|
name = "bitflags"
|
||||||
|
version = "1.0.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "cairo-rs"
|
||||||
|
version = "0.6.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"cairo-sys-rs 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"glib 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"glib-sys 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"gobject-sys 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "cairo-sys-rs"
|
||||||
|
version = "0.8.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"glib-sys 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "glib"
|
||||||
|
version = "0.7.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"glib-sys 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"gobject-sys 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "glib-sys"
|
||||||
|
version = "0.8.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "gobject-sys"
|
||||||
|
version = "0.8.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"glib-sys 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "lazy_static"
|
||||||
|
version = "1.3.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "libc"
|
||||||
|
version = "0.2.51"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "lsys"
|
||||||
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"cairo-rs 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pkg-config"
|
||||||
|
version = "0.3.14"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "winapi"
|
||||||
|
version = "0.3.7"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "winapi-i686-pc-windows-gnu"
|
||||||
|
version = "0.4.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "winapi-x86_64-pc-windows-gnu"
|
||||||
|
version = "0.4.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[metadata]
|
||||||
|
"checksum bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "228047a76f468627ca71776ecdebd732a3423081fcf5125585bcd7c49886ce12"
|
||||||
|
"checksum cairo-rs 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9e09d8a818b2ccc8983f04d95a9350c3cf8d24cc456cedca3b88fa3a81fdc0e2"
|
||||||
|
"checksum cairo-sys-rs 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b3fa13914fdc013387afa771f554f2f71d6ae931f4e5be9246c337d60c3dc484"
|
||||||
|
"checksum glib 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0c4e8fdc159c196a5dfa53a92929ac4c10c8a6637ffb43951f3fff89c2cd2365"
|
||||||
|
"checksum glib-sys 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5bda542f3caee39a027638e9644ff89204101ad916fd7370b585ad2c5fc97e61"
|
||||||
|
"checksum gobject-sys 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "23e05a14290d3dc255223cba51db4b0f3da438d5250657996fa99b2a30faf43e"
|
||||||
|
"checksum lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bc5729f27f159ddd61f4df6228e827e86643d4d3e7c32183cb30a1c08f604a14"
|
||||||
|
"checksum libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)" = "bedcc7a809076656486ffe045abeeac163da1b558e963a31e29fbfbeba916917"
|
||||||
|
"checksum pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "676e8eb2b1b4c9043511a9b7bea0915320d7e502b0a079fb03f9635a5252b18c"
|
||||||
|
"checksum winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "f10e386af2b13e47c89e7236a7a14a086791a2b88ebad6df9bf42040195cf770"
|
||||||
|
"checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
|
||||||
|
"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
|
@ -0,0 +1,8 @@
|
|||||||
|
[package]
|
||||||
|
name = "lsys"
|
||||||
|
version = "0.1.0"
|
||||||
|
authors = ["purisame"]
|
||||||
|
edition = "2018"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
cairo-rs = { version = "^0", features = ["svg"] }
|
@ -0,0 +1,15 @@
|
|||||||
|
# L-systems in Rust
|
||||||
|
|
||||||
|
Renderings of various L-systems using Rust and Cairo.
|
||||||
|
|
||||||
|
## Sierpinski Triangle
|
||||||
|

|
||||||
|
|
||||||
|
## Sierpinski Arrowhead
|
||||||
|

|
||||||
|
|
||||||
|
## Koch Curve
|
||||||
|

|
||||||
|
|
||||||
|
## Dragon Curve
|
||||||
|

|
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 23 KiB |
After Width: | Height: | Size: 12 KiB |
After Width: | Height: | Size: 3.9 KiB |
@ -0,0 +1,119 @@
|
|||||||
|
extern crate cairo;
|
||||||
|
|
||||||
|
use cairo::{svg, Context};
|
||||||
|
use std::fs::File;
|
||||||
|
use std::io::Write;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
koch();
|
||||||
|
sierpinski();
|
||||||
|
arrowhead();
|
||||||
|
dragon();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn koch() {
|
||||||
|
let mut out = File::create("koch.svg").unwrap();
|
||||||
|
run(
|
||||||
|
"F",
|
||||||
|
&['F'],
|
||||||
|
|c: char| match c {
|
||||||
|
'F' => "F+F-F-F+F".chars().collect(),
|
||||||
|
other => vec![other],
|
||||||
|
},
|
||||||
|
std::f64::consts::PI / 2.,
|
||||||
|
4,
|
||||||
|
&mut out,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn sierpinski() {
|
||||||
|
let mut out = File::create("sierpinski.svg").unwrap();
|
||||||
|
run(
|
||||||
|
"F-G-G",
|
||||||
|
&['F', 'G'],
|
||||||
|
|c: char| match c {
|
||||||
|
'F' => "F-G+F+G-F".chars().collect(),
|
||||||
|
'G' => "GG".chars().collect(),
|
||||||
|
other => vec![other],
|
||||||
|
},
|
||||||
|
std::f64::consts::PI * 2. / 3.,
|
||||||
|
4,
|
||||||
|
&mut out,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn arrowhead() {
|
||||||
|
let mut out = File::create("arrowhead.svg").unwrap();
|
||||||
|
run(
|
||||||
|
"A",
|
||||||
|
&['A', 'B'],
|
||||||
|
|c: char| match c {
|
||||||
|
'A' => "B-A-B".chars().collect(),
|
||||||
|
'B' => "A+B+A".chars().collect(),
|
||||||
|
other => vec![other],
|
||||||
|
},
|
||||||
|
std::f64::consts::PI * 1. / 3.,
|
||||||
|
4,
|
||||||
|
&mut out,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn dragon() {
|
||||||
|
let mut out = File::create("dragon.svg").unwrap();
|
||||||
|
run(
|
||||||
|
"FX",
|
||||||
|
&['F'],
|
||||||
|
|c: char| match c {
|
||||||
|
'X' => "X+YF+".chars().collect(),
|
||||||
|
'Y' => "-FX-Y".chars().collect(),
|
||||||
|
other => vec![other],
|
||||||
|
},
|
||||||
|
std::f64::consts::PI / 2.,
|
||||||
|
10,
|
||||||
|
&mut out,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn run<F, W>(axiom: &str, variables: &[char], rules: F, angle: f64, iterations: usize, writer: W)
|
||||||
|
where
|
||||||
|
F: Fn(char) -> Vec<char> + Copy,
|
||||||
|
W: Write,
|
||||||
|
{
|
||||||
|
let surf = svg::Writer::new(1024.0, 1024.0, writer);
|
||||||
|
let ctx = Context::new(&surf);
|
||||||
|
ctx.scale(1024., 1024.);
|
||||||
|
|
||||||
|
ctx.set_line_width(0.001);
|
||||||
|
ctx.set_source_rgb(0., 0., 0.);
|
||||||
|
|
||||||
|
let mut state = axiom.to_string();
|
||||||
|
|
||||||
|
for _ in 0..iterations {
|
||||||
|
state = state.chars().map(rules).flatten().collect();
|
||||||
|
}
|
||||||
|
|
||||||
|
// let segment_count = state.chars().filter(|c| variables.contains(&c)).count();
|
||||||
|
|
||||||
|
|
||||||
|
ctx.move_to(0.0, 0.5);
|
||||||
|
for c in state.chars() {
|
||||||
|
match c {
|
||||||
|
'+' => {
|
||||||
|
ctx.rotate(-angle);
|
||||||
|
}
|
||||||
|
'-' => {
|
||||||
|
ctx.rotate(angle);
|
||||||
|
}
|
||||||
|
other => {
|
||||||
|
if variables.contains(&other) {
|
||||||
|
ctx.rel_line_to(0.01, 0.0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ctx.stroke();
|
||||||
|
|
||||||
|
// let mut fout = File::create("out.png").unwrap();
|
||||||
|
// surf.write_all(&mut fout).unwrap();
|
||||||
|
// println!("{}", axiom);
|
||||||
|
}
|
Loading…
Reference in new issue