const (
a = 200,
b = 200,
n = 2.5,
)
func y(x) { b * (1 - abs(x/a)**n -> root(n)) -> int }
func pline(q) {
<<-"EOT";
<polyline points="#{q.join(' ')}"
style="fill:none; stroke:black; stroke-width:3" transform="translate(#{a}, #{b})" />
EOT
}
say <<-"EOT"
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg height="#{b*2}" width="#{a*2}" version="1.1" xmlns="http://www.w3.org/2000/svg">
EOT
var q = { |x| (x, y(x)) }.map(0..200 `by` 2)
[
pline(q),
pline(q »*« [ 1,-1]),
pline(q »*« [-1,-1]),
pline(q »*« [-1, 1]),
].each { .print }
say '</svg>'