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}}== |