Koch curve: Difference between revisions

Content added Content deleted
(Added Prolog Solution)
(Added Rust solution)
Line 1,804: Line 1,804:


</lang>
</lang>

=={{header|Rust}}==
Output is a file in SVG format depicting a Koch snowflake.
<lang rust>// [dependencies]
// svg = "0.8.0"

use svg::node::element::Rectangle;
use svg::node::element::Path;
use svg::node::element::path::Data;

const SQRT3_2 : f64 = 0.86602540378444;

fn koch_curve(mut data: Data, x0 : f64, y0 : f64,
x1 : f64, y1 : f64, order : usize) -> Data {
if order == 0 {
data = data.line_to((x1, y1));
} else {
let dx = x1 - x0;
let dy = y1 - y0;
let x2 = x0 + dx/3.0;
let y2 = y0 + dy/3.0;
let x3 = x0 + dx/2.0 - dy * SQRT3_2/3.0;
let y3 = y0 + dy/2.0 + dx * SQRT3_2/3.0;
let x4 = x0 + 2.0 * dx/3.0;
let y4 = y0 + 2.0 * dy/3.0;
data = koch_curve(data, x0, y0, x2, y2, order - 1);
data = koch_curve(data, x2, y2, x3, y3, order - 1);
data = koch_curve(data, x3, y3, x4, y4, order - 1);
data = koch_curve(data, x4, y4, x1, y1, order - 1);
}
data
}

fn write_koch_snowflake(file : &str, size : usize,
order : usize) -> std::io::Result<()> {
let length = (size as f64) * SQRT3_2 * 0.95;
let x0 = ((size as f64) - length)/2.0;
let y0 = (size as f64)/2.0 - length * SQRT3_2/3.0;
let x1 = x0 + length/2.0;
let y1 = y0 + length * SQRT3_2;
let x2 = x0 + length;

let mut data = Data::new().move_to((x0, y0));
data = koch_curve(data, x0, y0, x1, y1, order);
data = koch_curve(data, x1, y1, x2, y0, order);
data = koch_curve(data, x2, y0, x0, y0, order);

let path = Path::new()
.set("fill", "none")
.set("stroke", "white")
.set("stroke-width", "1")
.set("d", data);

let rect = Rectangle::new()
.set("width", "100%")
.set("height", "100%")
.set("fill", "black");

let document = svg::Document::new()
.set("width", size)
.set("height", size)
.add(rect)
.add(path);

svg::save(file, &document)
}

fn main() {
write_koch_snowflake("koch_snowflake.svg", 600, 5).unwrap();
}</lang>


=={{header|Sidef}}==
=={{header|Sidef}}==