Sierpinski curve: Difference between revisions
Content added Content deleted
No edit summary |
|||
Line 591: | Line 591: | ||
) |
) |
||
</lang> |
</lang> |
||
=={{header|Nim}}== |
|||
{{trans|C++}} |
|||
We produce a SVG file using same algorithm as the one of C++ version. |
|||
<lang Nim>import math |
|||
type |
|||
SierpinskiCurve = object |
|||
x, y: float |
|||
angle: float |
|||
length: int |
|||
file: File |
|||
proc line(sc: var SierpinskiCurve) = |
|||
let theta = degToRad(sc.angle) |
|||
sc.x += sc.length.toFloat * cos(theta) |
|||
sc.y -= sc.length.toFloat * sin(theta) |
|||
sc.file.write " L", sc.x, ',', sc.y |
|||
proc execute(sc: var SierpinskiCurve; s: string) = |
|||
sc.file.write 'M', sc.x, ',', sc.y |
|||
for c in s: |
|||
case c |
|||
of 'F', 'G': sc.line() |
|||
of '+': sc.angle = floorMod(sc.angle + 45, 360) |
|||
of '-': sc.angle = floorMod(sc.angle - 45, 360) |
|||
else: discard |
|||
func rewrite(s: string): string = |
|||
for c in s: |
|||
if c == 'X': |
|||
result.add "XF+G+XF--F--XF+G+X" |
|||
else: |
|||
result.add c |
|||
proc write(sc: var SierpinskiCurve; size, length, order: int) = |
|||
sc.length = length |
|||
sc.x = length.toFloat / sqrt(2.0) |
|||
sc.y = 2 * sc.x |
|||
sc.angle = 45 |
|||
sc.file.write "<svg xmlns='http://www.w3.org/2000/svg' width='", size, "' height='", size, "'>\n" |
|||
sc.file.write "<rect width='100%' height='100%' fill='white'/>\n" |
|||
sc.file.write "<path stroke-width='1' stroke='black' fill='none' d='" |
|||
var s = "F--XF--F--XF" |
|||
for _ in 1..order: s = s.rewrite() |
|||
sc.execute(s) |
|||
sc.file.write "'/>\n</svg>\n" |
|||
let outfile = open("sierpinski_curve.svg", fmWrite) |
|||
var sc = SierpinskiCurve(file: outfile) |
|||
sc.write(545, 7, 5) |
|||
outfile.close()</lang> |
|||
=={{header|Mathematica}} / {{header|Wolfram Language}}== |
=={{header|Mathematica}} / {{header|Wolfram Language}}== |