Pythagoras tree: Difference between revisions
Content added Content deleted
m (→{{header|Rust}}: inserted a img) |
(→{{header|Rust}}: refactoring) |
||
Line 1,959: | Line 1,959: | ||
</syntaxhighlight> |
</syntaxhighlight> |
||
=={{header|Rust}}== |
=={{header|Rust}}== |
||
⚫ | |||
[[File:Pythagoras tree.svg]] |
[[File:Pythagoras tree.svg]] |
||
⚫ | |||
'''[dependencies]'''<br> |
'''[dependencies]'''<br> |
||
svg = "0. |
svg = "0.12" |
||
<syntaxhighlight lang="rust">use svg::node::element::{Group, Polygon}; |
<syntaxhighlight lang="rust">use svg::node::element::{Group, Polygon}; |
||
fn main() { |
fn main() { |
||
let mut |
let mut base: Vec<[(f64, f64); 2]> = vec![[(-200., 0.), (200., 0.)]]; |
||
let doc = (0..12_u8).fold(svg::Document::new().set("stroke", "white"), |doc_a, lvl| { |
|||
let mut base: Vec<[(f64, f64); 2]> = vec![[(-200.0, 0.0), (200.0, 0.0)]]; |
|||
for lvl in 0..12u8 { |
|||
let rg = |step| lvl.wrapping_mul(step).wrapping_add(80 - step * 2); |
let rg = |step| lvl.wrapping_mul(step).wrapping_add(80 - step * 2); |
||
let |
let g = Group::new().set("fill", format!("#{:02X}{:02X}18", rg(20), rg(30))); // level color |
||
doc_a.add(std::mem::take(&mut base).into_iter().fold(g, |ga, [a, b]| { |
|||
let mut next_base = Vec::new(); |
|||
for [a, b] in base { |
|||
let v = (b.0 - a.0, b.1 - a.1); |
let v = (b.0 - a.0, b.1 - a.1); |
||
let c = |
let [c, d, w] = [a, b, v].map(|p| (p.0 + v.1, p.1 - v.0)); |
||
let |
let e = (c.0 + w.0 / 2., c.1 + w.1 / 2.); |
||
base.extend([[c, e], [e, d]]); |
|||
ga.add(Polygon::new().set("points", vec![a, c, e, d, c, d, b])) |
|||
⚫ | |||
next_base.extend([[c, e], [e, d]]); |
|||
}); |
|||
⚫ | |||
base = next_base; |
|||
⚫ | |||
doc = doc.add(group); |
|||
⚫ | |||
⚫ | |||
let file = "Pythagoras_tree.svg"; |
|||
⚫ | |||
Ok(_) => println!("{file} file written successfully!"), |
|||
Err(e) => println!("failed to write {file}: {e}"), |
|||
} |
|||
}</syntaxhighlight> |
}</syntaxhighlight> |
||