Skip to content

Instantly share code, notes, and snippets.

@youz
Last active October 14, 2020 03:36
Show Gist options
  • Save youz/05e081611b0c1d9c79e3766d754f285a to your computer and use it in GitHub Desktop.
Save youz/05e081611b0c1d9c79e3766d754f285a to your computer and use it in GitHub Desktop.
Penrose tiling in SATySFi
Display the source blob
Display the rendered blob
Raw
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
@require: standalone
@require: gr
@require: list
let color-k = RGB(0.1, 0.2, 0.6)
let color-a = RGB(0.9, 1.0, 0.7)
let color-b = RGB(0.5, 0.7, 1.0)
% let color-k = RGB(0.0, 0.0, 0.0)
% let color-a = RGB(0.0, 0.0, 0.0)
% let color-b = RGB(0.3, 0.9, 0.6)
let linewidth = 0.05pt
let pi = acos (0. -. 1.)
let invphi = 2.0 /. (exp (log 5.0 /. 2.0) +. 1.0)
let div (x1, y1) (x2, y2) t =
let cx = x1 *' (1. -. t) +' x2 *' t in
let cy = y1 *' (1. -. t) +' y2 *' t in
(cx, cy)
% ref. https://tartarus.org/~simon/20110412-penrose/penrose.xhtml
type tt = A | B
type triangle = tt * point * point * point
let subdivide (t, p, q, r) =
let u = div p q invphi in
let v = div p r invphi in
match t with
| A -> [(B, r, u, p); (A, r, u, q)]
| B -> [(B, v, u, p); (A, v, u, q); (B, r, v, q)]
let-rec gen
| 0 ps = ps
| n ps = List.map subdivide ps |> List.concat |> gen (n - 1)
let draw-triangle transf (t, a, b, c) =
let p = Gr.polygon a [b; c] |> transf in
let c = match t with A -> color-a | B -> color-b in
[fill c p; stroke linewidth color-k p]
let-inline ctx \penrose-tiling size n =
let ox = size *' 0.5 in
let t = ox *' (tan (pi /. 5.0)) in
let p = (0pt, 0pt) in
let r = (size, 0pt) in
let t0 = [(B, p, (ox, t), r); (B, p, (ox, 0pt -' t), r)] in
let transf = Gr.rotate-path (0pt, 0pt) 36.0 in
let gs = gen n t0
|> List.map (draw-triangle transf)
|> List.concat in
inline-graphics size size 0pt (fun o -> List.map (shift-graphics o) gs)
let-block ctx +test size n =
let-rec f i acc =
if i == n then acc
else
let ib = (read-inline ctx { \penrose-tiling(size)(i); }) ++ inline-fil in
let bb = acc +++ (form-paragraph ctx ib) +++ clear-page in
f (i + 1) bb
in
f 0 block-nil
in
standalone '<
% +p{ \penrose-tiling(400pt)(8); }
+test(400pt)(8);
>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment