Sierpinski pentagon: Difference between revisions

Content added Content deleted
m (Output is vertically centred, use polygon instead of path)
m (Output is vertically centred, use polygon instead of path)
Line 1,141: Line 1,141:
fn sierpinski_pentagon(mut document : svg::Document, mut x : f64, mut y : f64,
fn sierpinski_pentagon(mut document : svg::Document, mut x : f64, mut y : f64,
mut side : f64, order: usize) -> svg::Document {
mut side : f64, order: usize) -> svg::Document {
use svg::node::element::Path;
use svg::node::element::Polygon;
use svg::node::element::path::Data;
use std::f64::consts::PI;
use std::f64::consts::PI;


Line 1,150: Line 1,149:


if order == 1 {
if order == 1 {
let mut data = Data::new();
let mut points = Vec::new();
data = data.move_to((x, y));
points.push((x, y));
for _ in 0..5 {
for _ in 0..5 {
x += angle.cos() * side;
x += angle.cos() * side;
y -= angle.sin() * side;
y -= angle.sin() * side;
angle += degrees72;
angle += degrees72;
data = data.line_to((x, y));
points.push((x, y));
}
}
data = data.close();
let polygon = Polygon::new()
let path = Path::new()
.set("fill", "blue")
.set("fill", "blue")
.set("stroke", "black")
.set("stroke", "black")
.set("stroke-width", "1")
.set("stroke-width", "1")
.set("d", data);
.set("points", points);
document = document.add(path);
document = document.add(polygon);
} else {
} else {
side *= scale_factor;
side *= scale_factor;
Line 1,186: Line 1,184:
let radius = (size as f64)/2.0 - 2.0 * margin;
let radius = (size as f64)/2.0 - 2.0 * margin;
let side = radius * (0.2 * PI).sin() * 2.0;
let side = radius * (0.2 * PI).sin() * 2.0;
let height = side * ((0.2 * PI).sin() + (0.4 * PI).sin());
let x = (size as f64)/2.0;
let x = (size as f64)/2.0;
let y = 3.0 * margin;
let y = (size as f64 - height)/2.0;


let rect = Rectangle::new()
let rect = Rectangle::new()