Peripheral drift illusion: Difference between revisions
Content added Content deleted
m (promoted to full task (seven submissions and not a single query)) |
(Add Ada) |
||
Line 81: | Line 81: | ||
{{out}} |
{{out}} |
||
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/Peripheral_drift_illusion.png Screenshot from Atari 8-bit computer] |
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/Peripheral_drift_illusion.png Screenshot from Atari 8-bit computer] |
||
=={{header|Ada}}== |
|||
{{trans|Wren}} |
|||
{{libheader|APDF}} |
|||
<lang Ada>with PDF_Out; use PDF_Out; |
|||
procedure Drift is |
|||
X_Distance : constant := 30.0; |
|||
Y_Distance : constant := 30.0; |
|||
X_Length : constant := 20.0; |
|||
Y_Length : constant := 20.0; |
|||
Edge_Width : constant := 1.5; |
|||
Corner : constant Point := (220.0, 140.0); |
|||
type Edge_Kind is (Top, Right, Bottom, Left); |
|||
type Square_Kind is (Left_Top, Top_Right, Right_Bottom, Bottom_Left); |
|||
-- Signifies the white edges on the blue squares |
|||
LT : constant Square_Kind := Left_Top; |
|||
TR : constant Square_Kind := Top_Right; |
|||
RB : constant Square_Kind := Right_Bottom; |
|||
BL : constant Square_Kind := Bottom_Left; |
|||
type X_Index is range 0 .. 11; |
|||
type Y_Index is range 0 .. 11; |
|||
Squares : constant array (Y_Index, X_Index) of Square_Kind := |
|||
(11 => (LT, BL, BL, RB, RB, TR, TR, LT, LT, BL, BL, RB), |
|||
10 => (LT, LT, BL, BL, RB, RB, TR, TR, LT, LT, BL, BL), |
|||
09 => (TR, LT, LT, BL, BL, RB, RB, TR, TR, LT, LT, BL), |
|||
08 => (TR, TR, LT, LT, BL, BL, RB, RB, TR, TR, LT, LT), |
|||
07 => (RB, TR, TR, LT, LT, BL, BL, RB, RB, TR, TR, LT), |
|||
06 => (RB, RB, TR, TR, LT, LT, BL, BL, RB, RB, TR, TR), |
|||
05 => (BL, RB, RB, TR, TR, LT, LT, BL, BL, RB, RB, TR), |
|||
04 => (BL, BL, RB, RB, TR, TR, LT, LT, BL, BL, RB, RB), |
|||
03 => (LT, BL, BL, RB, RB, TR, TR, LT, LT, BL, BL, RB), |
|||
02 => (LT, LT, BL, BL, RB, RB, TR, TR, LT, LT, BL, BL), |
|||
01 => (TR, LT, LT, BL, BL, RB, RB, TR, TR, LT, LT, BL), |
|||
00 => (TR, TR, LT, LT, BL, BL, RB, RB, TR, TR, LT, LT)); |
|||
Light_Olive : constant Color_Type := (0.827, 0.816, 0.016); |
|||
Pale_Blue : constant Color_Type := (0.196, 0.314, 1.000); |
|||
White : constant Color_Type := (1.000, 1.000, 1.000); |
|||
Colors : constant array (Square_Kind, Edge_Kind) of Color_Type := |
|||
(Left_Top => (Top | Left => White, others => Black), |
|||
Top_Right => (Top | Right => White, others => Black), |
|||
Right_Bottom => (Right | Bottom => White, others => Black), |
|||
Bottom_Left => (Bottom | Left => White, others => Black)); |
|||
PDF : PDF_Out_File; |
|||
procedure Fill_Poly (P1, P2, P3, P4 : Point; Color : Color_Type) is |
|||
begin |
|||
PDF.Color (Color); |
|||
PDF.Move (Corner + P1); |
|||
PDF.Line (Corner + P2); |
|||
PDF.Line (Corner + P3); |
|||
PDF.Line (Corner + P4); |
|||
PDF.Finish_Path (Close_Path => True, |
|||
Rendering => Fill, |
|||
Rule => Nonzero_Winding_Number); |
|||
end Fill_Poly; |
|||
procedure Draw_Square (Pos : Point; Kind : Square_Kind) is |
|||
Inner_TL : constant Point := Pos + (0.0, Y_Length); |
|||
Inner_TR : constant Point := Pos + (X_Length, Y_Length); |
|||
Inner_BR : constant Point := Pos + (X_Length, 0.0); |
|||
Inner_BL : constant Point := Pos + (0.0, 0.0); |
|||
Outer_TL : constant Point := Inner_TL + (-Edge_Width, Edge_Width); |
|||
Outer_TR : constant Point := Inner_TR + (Edge_Width, Edge_Width); |
|||
Outer_BR : constant Point := Inner_BR + (Edge_Width, -Edge_Width); |
|||
Outer_BL : constant Point := Inner_BL + (-Edge_Width, -Edge_Width); |
|||
begin |
|||
Fill_Poly (Inner_TL, Inner_TR, Inner_BR, Inner_BL, Pale_Blue); |
|||
Fill_Poly (Inner_TL, Outer_TL, Outer_TR, Inner_TR, Colors (Kind, Top)); |
|||
Fill_Poly (Inner_TR, Outer_TR, Outer_BR, Inner_BR, Colors (Kind, Right)); |
|||
Fill_Poly (Inner_BR, Outer_BR, Outer_BL, Inner_BL, Colors (Kind, Bottom)); |
|||
Fill_Poly (Inner_BL, Outer_BL, Outer_TL, Inner_TL, Colors (Kind, Left)); |
|||
end Draw_Square; |
|||
procedure Draw_Squares is |
|||
begin |
|||
for X in Squares'Range (2) loop |
|||
for Y in Squares'Range (1) loop |
|||
Draw_Square (Pos => (X => Real (X) * X_Distance, |
|||
Y => Real (Y) * Y_Distance), |
|||
Kind => Squares (Y, X)); |
|||
end loop; |
|||
end loop; |
|||
end Draw_Squares; |
|||
begin |
|||
PDF.Create ("peripheral-drift-illusion.pdf"); |
|||
PDF.Page_Setup (A4_Landscape); |
|||
PDF.Color (Light_Olive); |
|||
PDF.Draw ((10.0, 10.0, 820.0, 575.0), Fill); |
|||
Draw_Squares; |
|||
PDF.Close; |
|||
end Drift;</lang> |
|||
=={{header|Julia}}== |
=={{header|Julia}}== |