Sierpinski pentagon: Difference between revisions
Content deleted Content added
→{{header|Quackery}}: fast graphics |
|||
(8 intermediate revisions by 5 users not shown) | |||
Line 515:
}
}</syntaxhighlight>
=={{header|EasyLang}}==
{{Trans|Processing}}
[https://easylang.dev/show/#cod=pZHNrsIgEIX3PMVJ3GgbsSVpdNOHacroJemFBog/by+DqHXh3Vx2w/mYc2ZwXpNHj06sIMaJBi8mY+lidPxBI5UI4zBRAlrssFaoMbqAvUIFteE3s3cjZrJxODmLK24IRhM0zamBhBQAzLHUPRqu0/l1Z2K6lEfnMdhTdmoQIs3sER3U4VCQdK6o++z/QKts9ZZvLAdjv8g818IyJ6MpPIkcu0oNeOByp02I6B9SXYjFAv4Xnpv/Ef5T/rbhLdrlPFJI8UJVh7ZD18DlT2b0Dg== Run it]
<syntaxhighlight lang="easylang">
order = 5
#
clear
linewidth 0.2
scale = 1 / (2 + cos 72 * 2)
#
proc pentagon x y side depth . .
if depth = 0
move x y
for angle = 0 step 72 to 288
x += cos angle * side
y += sin angle * side
line x y
.
else
side *= scale
dist = side + side * cos 72 * 2
for angle = 0 step 72 to 288
x += cos angle * dist
y += sin angle * dist
pentagon x y side depth - 1
.
.
.
pentagon 25 15 50 order - 1
</syntaxhighlight>
=={{header|FreeBASIC}}==
{{trans|XPL0}}
<syntaxhighlight lang="vb">#define pi 4 * Atn(1)
#define yellow Rgb(255,255,0)
Dim As Byte orden = 5 'can also set this to 1, 2, 3, or 4
Dim Shared As Single deg72
deg72 = 72 * pi / 180 '72 degrees in radians
Dim As Integer HW = 640/2
Dim As Byte tam = 20
Dim As Integer radio = HW - 2*tam
Dim Shared As Single ScaleFactor
Sub DrawPentagon(posX As Integer, posY As Integer, largo As Single, fondo As Byte)
Dim As Byte i
Dim As Single angulo = 3 * deg72, dist
If fondo = 0 Then
Pset (posX, posY)
For i = 0 To 4
posX += Fix(largo * Cos(angulo))
posY -= Fix(largo * Sin(angulo))
Line - (posX, posY), yellow
angulo += Deg72
Next
Else
largo *= ScaleFactor
dist = largo * (1 + Cos(Deg72) * 2)
For i = 0 To 4
posX += Fix(dist * Cos(angulo))
posY -= Fix(dist * Sin(angulo))
DrawPentagon(posX, posY, largo, fondo-1)
angulo += deg72
Next
End If
End Sub
Screenres 640, 640, 32
ScaleFactor = 1 / (2 + Cos(Deg72) * 2)
Dim As Single largo
largo = radio * Sin(Pi/5) * 2
DrawPentagon (HW, 3*tam, largo, orden-1)
Windowtitle "Hit any key to end program"
Sleep</syntaxhighlight>
=={{header|Go}}==
Line 835 ⟶ 913:
Clicking Pentaflake you can see orders 1-6 of it in different colors.
</pre>
=={{header|jq}}==
'''Adapted from [[#Julia|Julia]]'''
'''Works with jq, the C implementation of jq'''
'''Works with gojq, the Go implementation of jq'''
The following program produces an SVG image.
To produce the .svg file, use a command such as:
<pre>
jq -nr -f sierpinski-pentagon.jq > sierpinski-pentagon.svg
</pre>
where "sierpinski-pentagon.jq" is a file containing the program shown
below.
The .svg file can conveniently be viewed as a graphic using a browser,
or an editor such as Emacs or Aquamacs.
<syntaxhighlight lang="jq">
### Generic functions
def addComplex(stream): reduce stream as [$x,$y] ([0,0]; .[0] += $x | .[1] += $y);
def lpad($len; $x): tostring | ($len - length) as $l | ($x * $l) + .;
# Input: an array
def multiply($x): map(. * $x);
# Round to approx $ndec places
def round($ndec): pow(10;$ndec) as $p | . * $p | round / $p;
def power($a; $b): reduce range(0;$b) as $i (1; . * $a);
def tau: 8 * atan2(1; 1);
def tobase($b):
def digit: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[.:.+1];
def mod: . % $b;
def div: ((. - mod) / $b);
def digits: recurse( select(. > 0) | div) | mod ;
# For jq it would be wise to protect against `infinite` as input, but using `isinfinite` confuses gojq
select( (tostring|test("^[0-9]+$")) and 2 <= $b and $b <= 36)
| if . == 0 then "0"
else [digits | digit] | reverse[1:] | add
end;
### Sierpinski Pentagons
def svgHead($width):
"<svg height=\"\($width)\" width=\"\($width)\" style=\"fill:blue\"",
"version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">";
def svgEnd: "</svg>";
# SVG height and width will be 2 * dim
def pentagon($dim):
def sides: 5;
def order: 5;
def scale: (3 - (order | sqrt)) / 2;
def cis: [cos, sin];
def orders:
[range(0; order) | ((1 - scale) * $dim) * power(scale ; .) ];
def vertices:
tau as $tau | [range(0; sides) | ( . * $tau / sides | cis)];
svgHead(2*$dim),
(orders as $orders
| vertices as $vertices
| range(1; 1 + power(sides; order)) as $i
| [ ($i|tobase(sides) | lpad(order; "0") | split("")[]) | $vertices[tonumber]] as $varr
| addComplex(range(0; $orders|length) as $i | $varr[$i] | multiply($orders[$i])) as $vector
| ($vertices | map( addComplex($vector, multiply($orders[-1] * (1-scale))))) as $vprod
| ($vprod | map( map(round(3)) | "\(.[0]) \(.[1])") | join(" ")) as $points
| "<polygon points=\"\($points)\" transform=\"translate(\($dim),\($dim)) rotate(-18)\" />"),
svgEnd ;
pentagon(250)
</syntaxhighlight>
{{output}}
See [[#Julia|Julia]].
=={{header|Julia}}==
Line 1,625 ⟶ 1,785:
(formerly Perl 6)
{{works with|rakudo|2018-10}}
[[File:Perl6 pentaflake.svg|300x300px|thumb|right|5th order pentaflake]]
<syntaxhighlight lang="raku" line>constant $sides = 5;
constant order = 5;
Line 1,646 ⟶ 1,807:
$fh.say: '</svg>';
$fh.close;</syntaxhighlight>
=={{header|Ruby}}==
Line 2,006 ⟶ 2,165:
{{libheader|DOME}}
Black backgound and slightly different palette to Go. Also pentagons are unfilled.
<syntaxhighlight lang="
import "dome" for Window
import "math" for Math
Line 2,069 ⟶ 2,228:
var Game = SierpinskiPentagon.new(640, 640)</syntaxhighlight>
{{out}}
[[File:Wren-Sierpinski_pentagon.png|400px]]
=={{header|XPL0}}==
{{trans|Wren}}
[[File:SierXPL0.gif|200px|thumb|right]]
<syntaxhighlight lang "XPL0">def Order = 5; \can also set this to 1, 2, 3, or 4
def Width=640, Height=640;
def Pi = 3.14159265358979323846;
def Deg72 = 72.*Pi/180.; \72 degrees in radians
def HW = Width/2;
def Margin = 20;
def Radius = HW - 2*Margin;
real ScaleFactor;
int ColorIndex;
proc DrawPentagon(X, Y, Side, Depth);
real X, Y, Side; int Depth;
real Angle, Dist;
int I;
[Angle:= 3. * Deg72;
if Depth = 0 then
[Move(fix(X), fix(Y));
for I:= 0 to 4 do
[X:= X + Cos(Angle) * Side;
Y:= Y - Sin(Angle) * Side;
Line(fix(X), fix(Y), ColorIndex+9);
Angle:= Angle + Deg72;
];
ColorIndex:= ColorIndex+1;
if ColorIndex >= 5 then ColorIndex:= 0;
]
else [Side:= Side * ScaleFactor;
Dist:= Side * (1. + Cos(Deg72) * 2.);
for I:= 0 to 4 do
[X:= X + Cos(Angle) * Dist;
Y:= Y - Sin(Angle) * Dist;
DrawPentagon(X, Y, Side, Depth-1);
Angle:= Angle + Deg72;
];
];
];
real Side;
[SetFB(Width, Height, 8);
ScaleFactor:= 1. / (2. + Cos(Deg72) * 2.);
ColorIndex:= 0;
Side:= float(Radius) * Sin(Pi/5.) * 2.;
DrawPentagon(float(HW), float(3*Margin), Side, Order-1);
]</syntaxhighlight>
=={{header|zkl}}==
{{trans|Raku}}
|