Hilbert curve: Difference between revisions

Content added Content deleted
m (J: perhaps slightly clearer presentation)
(Ada version)
Line 224: Line 224:
{{out}}
{{out}}
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/Hilbert_curve.png Screenshot from Atari 8-bit computer]
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/Hilbert_curve.png Screenshot from Atari 8-bit computer]

=={{header|Ada}}==
{{libheader|APDF}}
<lang Ada>with PDF_Out; use PDF_Out;

procedure Hilbert_Curve_PDF is

Length : constant := 500.0;
Corner : constant Point := (50.0, 300.0);

type Rule_Type is (A, B, C, D);

PDF : PDF_Out.Pdf_Out_File;
First : Boolean;

procedure Hilbert (Order : in Natural;
Rule : in Rule_Type;
Length : in Real;
X, Y : in Real)
is
L : constant Real := Length / 4.0;
begin
if Order = 0 then
if First then
First := False;
PDF.Move (Corner + (X, Y));
else
PDF.Line (Corner + (X, Y));
end if;
else
case Rule is
when A =>
Hilbert (Order - 1, D, 2.0 * L, X - L, Y + L);
Hilbert (Order - 1, A, 2.0 * L, X - L, Y - L);
Hilbert (Order - 1, A, 2.0 * L, X + L, Y - L);
Hilbert (Order - 1, B, 2.0 * L, X + L, Y + L);
when B =>
Hilbert (Order - 1, C, 2.0 * L, X + L, Y - L);
Hilbert (Order - 1, B, 2.0 * L, X - L, Y - L);
Hilbert (Order - 1, B, 2.0 * L, X - L, Y + L);
Hilbert (Order - 1, A, 2.0 * L, X + L, Y + L);
when C =>
Hilbert (Order - 1, B, 2.0 * L, X + L, Y - L);
Hilbert (Order - 1, C, 2.0 * L, X + L, Y + L);
Hilbert (Order - 1, C, 2.0 * L, X - L, Y + L);
Hilbert (Order - 1, D, 2.0 * L, X - L, Y - L);
when D =>
Hilbert (Order - 1, A, 2.0 * L, X - L, Y + L);
Hilbert (Order - 1, D, 2.0 * L, X + L, Y + L);
Hilbert (Order - 1, D, 2.0 * L, X + L, Y - L);
Hilbert (Order - 1, C, 2.0 * L, X - L, Y - L);
end case;
end if;
end Hilbert;

procedure Hilbert (Order : Natural; Color : Color_Type) is
begin
First := True;
PDF.Stroking_Color (Color);
Hilbert (Order, A, Length, Length / 2.0, Length / 2.0);
PDF.Finish_Path (Close_Path => False,
Rendering => Stroke,
Rule => Nonzero_Winding_Number);
end Hilbert;

begin
PDF.Create ("hilbert.pdf");
PDF.Page_Setup (A4_Portrait);
PDF.Line_Width (2.0);

PDF.Color (Black);
PDF.Draw (Corner + (0.0, 0.0, Length, Length), Fill);

Hilbert (6, Color => (0.9, 0.1, 0.8));
Hilbert (5, Color => (0.0, 0.9, 0.0));

PDF.Close;
end Hilbert_Curve_PDF;</lang>


=={{header|ALGOL 68}}==
=={{header|ALGOL 68}}==