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}}==
Creates a [https://static.miraheze.org/rosettacodewiki/1/18/Pythagoras_tree.svg '''svg file'''] (12 levels): <br>
[[File:Pythagoras tree.svg]]
[[File:Pythagoras tree.svg]]

Creates a [https://static.miraheze.org/rosettacodewiki/1/18/Pythagoras_tree.svg '''Pythagoras_tree.svg file (12 levels)''']


'''[dependencies]'''<br>
'''[dependencies]'''<br>
svg = "0.10.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 doc = svg::Document::new().set("stroke", "white");
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 mut group = Group::new().set("fill", format!("#{:02X}{:02X}18", rg(20), rg(30))); // level color
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 = (a.0 + v.1, a.1 - v.0);
let [c, d, w] = [a, b, v].map(|p| (p.0 + v.1, p.1 - v.0));
let d = (c.0 + v.0, c.1 + v.1);
let e = (c.0 + w.0 / 2., c.1 + w.1 / 2.);
let e = (c.0 + 0.5 * (v.0 + v.1), c.1 + 0.5 * (v.1 - v.0));
base.extend([[c, e], [e, d]]);
group = group.add(Polygon::new().set("points", vec![a, c, e, d, c, d, b]));
ga.add(Polygon::new().set("points", vec![a, c, e, d, c, d, b]))
}))
next_base.extend([[c, e], [e, d]]);
}
});
let (x, y) = (base.iter()).fold((0., 0.), |(xa, ya), [p, _]| (p.0.min(xa), p.1.min(ya)));
base = next_base;
svg::save("Pythagor_tree.svg", &doc.set("viewBox", (x, y, -x - x, -y))).unwrap();
doc = doc.add(group);
}
let (x0, y0) = (base.iter()).fold((0.0, 0.0), |(x0, y0), [(x, y), _]| (x.min(x0), y.min(y0)));
let file = "Pythagoras_tree.svg";
match svg::save(file, &doc.set("viewBox", (x0, y0, -x0 * 2.0, -y0))) {
Ok(_) => println!("{file} file written successfully!"),
Err(e) => println!("failed to write {file}: {e}"),
}
}</syntaxhighlight>
}</syntaxhighlight>