├── .Rbuildignore ├── .gitignore ├── DESCRIPTION ├── LICENSE.md ├── README.md ├── _site ├── day-1 │ ├── session-1 │ │ ├── index.html │ │ └── index_files │ │ │ └── figure-html │ │ │ ├── art-functions-1.png │ │ │ ├── art-functions-2.png │ │ │ ├── art-functions-3.png │ │ │ ├── canva-palettes-1.png │ │ │ ├── canva-palettes-2-1.png │ │ │ ├── canva-palettes-2-2.png │ │ │ ├── canva-palettes-2-3.png │ │ │ ├── canva-palettes-2.png │ │ │ ├── canva-palettes-3.png │ │ │ ├── compositionality-1.png │ │ │ ├── compositionality-2-1.png │ │ │ ├── compositionality-3-1.png │ │ │ ├── coord-polar-1.png │ │ │ ├── familiar-ggplot-1.png │ │ │ ├── palette-function-1.png │ │ │ ├── show-canva-palette-1.png │ │ │ ├── show-col-1.png │ │ │ ├── simple-composition-1.png │ │ │ ├── simple-composition-2.png │ │ │ ├── simple-composition-3.png │ │ │ ├── tweak-ggplot-1.png │ │ │ └── tweak-ggplot-more-1.png │ ├── session-2 │ │ ├── index.html │ │ └── index_files │ │ │ └── figure-html │ │ │ ├── base-simplex-1.png │ │ │ ├── base-worley-1.png │ │ │ ├── base-worley-distance-1.png │ │ │ ├── base-worley-mixed-1.png │ │ │ ├── curl-art-examples-1.png │ │ │ ├── curl-art-examples-2-1.png │ │ │ ├── curl-art-octaves-1.png │ │ │ ├── curl-art-octaves-2.png │ │ │ ├── curl-art-octaves-3.png │ │ │ ├── custom-fracture-1.png │ │ │ ├── custom-fracture-2.png │ │ │ ├── custom-fracture-3.png │ │ │ ├── custom-fracture-4.png │ │ │ ├── dplyr-art-example-1-1.png │ │ │ ├── dplyr-art-example-2-1.png │ │ │ ├── dplyr-art-example-3-1.png │ │ │ ├── dplyr-recreation-1.png │ │ │ ├── example-art-frequency-1.png │ │ │ ├── example-art-frequency-2.png │ │ │ ├── example-art-frequency-3.png │ │ │ ├── example-art-generator-1.png │ │ │ ├── example-art-generator-2.png │ │ │ ├── example-art-generator-3.png │ │ │ ├── example-art-palette-1.png │ │ │ ├── example-art-palette-2.png │ │ │ ├── example-art-palette-3.png │ │ │ ├── example-art-seed-1.png │ │ │ ├── example-art-seed-2.png │ │ │ ├── example-art-seed-3.png │ │ │ ├── fractal-art-checker-1.png │ │ │ ├── fractal-art-checker-2.png │ │ │ ├── fractal-art-checker-3.png │ │ │ ├── fractal-art-gated-1.png │ │ │ ├── fractal-art-gated-2.png │ │ │ ├── fractal-art-gated-3.png │ │ │ ├── fractal-art-octaves-1.png │ │ │ ├── fractal-art-octaves-2.png │ │ │ ├── fractal-art-octaves-3.png │ │ │ ├── fractal-art-ridged-gain-1.png │ │ │ ├── fractal-art-ridged-gain-2.png │ │ │ ├── fractal-art-ridged-gain-3.png │ │ │ ├── fractal-art-ridged-octaves-1.png │ │ │ ├── fractal-art-ridged-octaves-2.png │ │ │ ├── fractal-art-ridged-octaves-3.png │ │ │ ├── fractal-art-scope-1.png │ │ │ ├── fractal-art-scope-2.png │ │ │ ├── fractal-art-scope-3.png │ │ │ ├── fractal-art-spheres-1.png │ │ │ ├── fractal-art-spheres-2.png │ │ │ ├── fractal-art-spheres-3.png │ │ │ ├── fractal-art-worley-distance-1.png │ │ │ ├── fractal-art-worley-distance-2.png │ │ │ ├── fractal-art-worley-distance-3.png │ │ │ ├── fractal-art-worley-octaves-1.png │ │ │ ├── fractal-art-worley-octaves-2.png │ │ │ ├── fractal-art-worley-octaves-3.png │ │ │ ├── fracture-api-1.png │ │ │ ├── fracture-api-2.png │ │ │ ├── fracture-api-3.png │ │ │ ├── fracture-api-4.png │ │ │ ├── random-crosses-1.png │ │ │ ├── random-crosses-2.png │ │ │ ├── random-crosses-3.png │ │ │ ├── simple-curl-noise-1.png │ │ │ ├── simple-curl-noise-2.png │ │ │ ├── simple-perlin-art-1.png │ │ │ ├── simple-perlin-art-2.png │ │ │ ├── simple-perlin-art-3.png │ │ │ ├── smol-curl-1.png │ │ │ ├── smol-curl2-1.png │ │ │ ├── smol-grid-1.png │ │ │ ├── smol-simplex-1.png │ │ │ ├── smol-simplex-2.png │ │ │ └── smol-slope-1.png │ ├── session-3 │ │ ├── animated-perlin-heart-100.gif │ │ ├── animated-perlin-heart-123.gif │ │ ├── animated-perlin-heart-456.gif │ │ ├── animated-perlin-heart-789.gif │ │ ├── hand-drawn-hearts.jpg │ │ ├── index.html │ │ └── index_files │ │ │ └── figure-html │ │ │ ├── basic-circle-1.png │ │ │ ├── deeply-nested-polygon-layering-1.png │ │ │ ├── fast-polygon-layering-1.png │ │ │ ├── heart-polygon-1.png │ │ │ ├── layered-smudged-hexagon-1.png │ │ │ ├── perlin-heart-2-1.png │ │ │ ├── perlin-heart-texture-1.png │ │ │ ├── perlin-hearts-1.png │ │ │ ├── polygon-generation-1.png │ │ │ ├── polygon-generation-2.png │ │ │ ├── polygon-generation-3.png │ │ │ ├── polygon-insertion-1.png │ │ │ ├── polygon-insertion-2.png │ │ │ ├── polygon-insertion-3.png │ │ │ ├── polygon-layering-1.png │ │ │ ├── show-perlin-blob-frequency-1.png │ │ │ ├── show-perlin-blob-frequency-2.png │ │ │ ├── show-perlin-blob-frequency-3.png │ │ │ ├── show-perlin-blob-radius-1.png │ │ │ ├── show-perlin-blobs-1.png │ │ │ ├── show-perlin-blobs-2.png │ │ │ ├── show-perlin-blobs-3.png │ │ │ ├── show-perlin-hearts-1.png │ │ │ ├── show-perlin-hearts-2-1.png │ │ │ ├── show-perlin-hearts-2-2.png │ │ │ ├── show-perlin-hearts-2-3.png │ │ │ ├── show-perlin-hearts-2.png │ │ │ ├── show-perlin-hearts-3.png │ │ │ ├── smooth-path-1.png │ │ │ ├── smooth-path-textured-1.png │ │ │ ├── smooth-path-textured-2.png │ │ │ ├── smudged-hexagon-examples-1.png │ │ │ ├── smudged-hexagon-examples-2.png │ │ │ ├── smudged-hexagon-examples-3.png │ │ │ ├── splotch-1.png │ │ │ ├── splotch-2.png │ │ │ ├── splotch-3.png │ │ │ ├── splotch-4.png │ │ │ └── square-1.png │ └── session-4 │ │ ├── circles_3d.png │ │ ├── ice_3d.png │ │ ├── index.html │ │ └── index_files │ │ └── figure-html │ │ ├── abstract-ice-floes-1.png │ │ ├── abstract-ice-floes-2.png │ │ ├── abstract-ice-floes-3.png │ │ ├── basic-ice-floe-1.png │ │ ├── circle-addition-1.png │ │ ├── circle-render-1.png │ │ ├── circle-shadow-map-1.png │ │ ├── even-more-abstract-ice-floes-1.png │ │ ├── even-more-abstract-ice-floes-2.png │ │ ├── even-more-abstract-ice-floes-3.png │ │ ├── ice-floe-1.png │ │ ├── more-rayshade-art-1.png │ │ ├── more-rayshade-art-2.png │ │ ├── more-rayshade-art-3.png │ │ ├── rayshader-art-1.png │ │ ├── ridged-art-example-1.png │ │ └── show-circle-array-1.png ├── day-2 │ ├── session-1 │ │ ├── index.html │ │ └── index_files │ │ │ └── figure-html │ │ │ ├── an-unboxing-1.png │ │ │ ├── coarse-unboxing-art-1.png │ │ │ ├── coarse-unboxing-art-2.png │ │ │ ├── coarse-unboxing-art-3.png │ │ │ ├── first-rcpp-art-1.png │ │ │ ├── first-rcpp-art-2.png │ │ │ ├── first-rcpp-art-3.png │ │ │ ├── first-unboxing-art-1.png │ │ │ ├── first-unboxing-art-2.png │ │ │ ├── first-unboxing-art-3.png │ │ │ ├── image-plot-1.png │ │ │ ├── image-plot-2.png │ │ │ ├── image-plot-3.png │ │ │ ├── more-pretty-boxes-1.png │ │ │ ├── more-pretty-boxes-2.png │ │ │ ├── more-pretty-boxes-3.png │ │ │ ├── pretty-boxes-1.png │ │ │ ├── pretty-boxes-2.png │ │ │ ├── pretty-boxes-3.png │ │ │ ├── randomly-shaded-barnsley-fern-1.png │ │ │ ├── show-barnsley-fern-1.png │ │ │ ├── show-unboxing-components-1.png │ │ │ ├── show-unboxing-components-2.png │ │ │ ├── show-unboxing-components-3.png │ │ │ └── transform-shaded-barnsley-fern-1.png │ ├── session-2 │ │ ├── index.html │ │ ├── index_files │ │ │ └── figure-html │ │ │ │ ├── even-more-mosaica-1.png │ │ │ │ ├── even-more-mosaica-2.png │ │ │ │ ├── even-more-mosaica-3.png │ │ │ │ ├── first-truchet-1.png │ │ │ │ ├── geom-voronoise-1.png │ │ │ │ ├── mosaica-1.png │ │ │ │ ├── mosaica-extras-1.png │ │ │ │ ├── mosaica-extras-2.png │ │ │ │ ├── mosaica-extras-3.png │ │ │ │ ├── rectangle-subdivision-1.png │ │ │ │ ├── scatterplot-boxy-1.png │ │ │ │ ├── second-truchet-1.png │ │ │ │ ├── subdivision-extras-1.png │ │ │ │ ├── subdivision-extras-2.png │ │ │ │ ├── subdivision-extras-3.png │ │ │ │ ├── voronoi-baroque-shake-1.png │ │ │ │ ├── voronoi-baroque-shake-2.png │ │ │ │ ├── voronoi-baroque-shake-3.png │ │ │ │ ├── voronoi-baroque-sift-1.png │ │ │ │ ├── voronoi-baroque-sift-2.png │ │ │ │ ├── voronoi-baroque-sift-3.png │ │ │ │ ├── voronoi-boxy-1.png │ │ │ │ ├── voronoi-boxy-2-1.png │ │ │ │ ├── voronoi-boxy-3-1.png │ │ │ │ ├── voronoi-points-1.png │ │ │ │ ├── voronoi-segments-1.png │ │ │ │ ├── voronoi-tiles-1.png │ │ │ │ ├── voronoi-tiles-double-1.png │ │ │ │ ├── voronoi-tiles-max-size-1.png │ │ │ │ ├── voronoi-tiles-only-1.png │ │ │ │ ├── voronoi-tiles-round-corners-1.png │ │ │ │ └── voronoi-tiles-shrink-1.png │ │ └── wpa-land-use-survey-map.jpg │ ├── session-3 │ │ ├── dithered.png │ │ ├── index.html │ │ ├── index_files │ │ │ └── figure-html │ │ │ │ ├── blend-1.png │ │ │ │ ├── blend-2.png │ │ │ │ ├── blend-3.png │ │ │ │ ├── displace-1.png │ │ │ │ ├── displace-2.png │ │ │ │ ├── dither-1.png │ │ │ │ ├── dither-2.png │ │ │ │ ├── flametree-plot-1.png │ │ │ │ ├── flametree-plot-origin-1.png │ │ │ │ ├── halftone-dither-1.png │ │ │ │ ├── halftone-dither-2.png │ │ │ │ ├── halftone-dither-3.png │ │ │ │ ├── inner-glow-1.png │ │ │ │ ├── inner-glow-2.png │ │ │ │ ├── inner-glow-3.png │ │ │ │ ├── mask-1.png │ │ │ │ ├── mask-2.png │ │ │ │ ├── mask-components-1.png │ │ │ │ ├── mask-components-2.png │ │ │ │ ├── outer-glow-1.png │ │ │ │ ├── outer-glow-2.png │ │ │ │ ├── outer-glow-3.png │ │ │ │ ├── plain-hex-1.png │ │ │ │ └── polygons-only-1.png │ │ ├── quantised.png │ │ └── undithered.png │ └── session-4 │ │ ├── index.html │ │ └── index_files │ │ └── figure-html │ │ └── lily-pad-1.png ├── img │ ├── ascii-cross.png │ ├── banner-2.png │ ├── banner-3.png │ ├── banner.png │ ├── day-1-session-1.png │ ├── day-1-session-2.png │ ├── day-1-session-3.png │ ├── day-1-session-4.png │ ├── day-2-session-1.png │ ├── day-2-session-2.png │ ├── day-2-session-3.png │ ├── day-2-session-4.png │ ├── nebula_04_153_5000.jpg │ └── pollen_55_5739.jpg ├── index.html ├── robots.txt ├── search.json ├── site_libs │ ├── bootstrap │ │ ├── bootstrap-icons.css │ │ ├── bootstrap-icons.woff │ │ ├── bootstrap.min.css │ │ └── bootstrap.min.js │ ├── clipboard │ │ └── clipboard.min.js │ ├── quarto-html │ │ ├── anchor.min.js │ │ ├── popper.min.js │ │ ├── quarto-html.min.css │ │ ├── quarto-syntax-highlighting-dark.css │ │ ├── quarto.js │ │ ├── tabby.min.js │ │ ├── tippy.css │ │ └── tippy.umd.min.js │ ├── quarto-nav │ │ ├── headroom.min.js │ │ └── quarto-nav.js │ ├── quarto-search │ │ ├── autocomplete.umd.js │ │ ├── fuse.min.js │ │ └── quarto-search.js │ └── revealjs │ │ ├── dist │ │ ├── reset.css │ │ ├── reveal.css │ │ ├── reveal.esm.js │ │ ├── reveal.esm.js.map │ │ ├── reveal.js │ │ ├── reveal.js.map │ │ └── theme │ │ │ ├── fonts │ │ │ ├── league-gothic │ │ │ │ ├── LICENSE │ │ │ │ ├── league-gothic.css │ │ │ │ ├── league-gothic.eot │ │ │ │ ├── league-gothic.ttf │ │ │ │ └── league-gothic.woff │ │ │ └── source-sans-pro │ │ │ │ ├── LICENSE │ │ │ │ ├── source-sans-pro-italic.eot │ │ │ │ ├── source-sans-pro-italic.ttf │ │ │ │ ├── source-sans-pro-italic.woff │ │ │ │ ├── source-sans-pro-regular.eot │ │ │ │ ├── source-sans-pro-regular.ttf │ │ │ │ ├── source-sans-pro-regular.woff │ │ │ │ ├── source-sans-pro-semibold.eot │ │ │ │ ├── source-sans-pro-semibold.ttf │ │ │ │ ├── source-sans-pro-semibold.woff │ │ │ │ ├── source-sans-pro-semibolditalic.eot │ │ │ │ ├── source-sans-pro-semibolditalic.ttf │ │ │ │ ├── source-sans-pro-semibolditalic.woff │ │ │ │ └── source-sans-pro.css │ │ │ └── quarto.css │ │ └── plugin │ │ ├── highlight │ │ ├── highlight.esm.js │ │ ├── highlight.js │ │ ├── monokai.css │ │ ├── plugin.js │ │ └── zenburn.css │ │ ├── markdown │ │ ├── markdown.esm.js │ │ ├── markdown.js │ │ └── plugin.js │ │ ├── math │ │ ├── katex.js │ │ ├── math.esm.js │ │ ├── math.js │ │ ├── mathjax2.js │ │ ├── mathjax3.js │ │ └── plugin.js │ │ ├── notes │ │ ├── notes.esm.js │ │ ├── notes.js │ │ ├── plugin.js │ │ └── speaker-view.html │ │ ├── pdf-export │ │ ├── pdfexport.js │ │ └── plugin.yml │ │ ├── quarto-line-highlight │ │ ├── line-highlight.css │ │ ├── line-highlight.js │ │ └── plugin.yml │ │ ├── quarto-support │ │ ├── footer.css │ │ ├── plugin.yml │ │ └── support.js │ │ ├── reveal-menu │ │ ├── menu.css │ │ ├── menu.js │ │ ├── plugin.yml │ │ ├── quarto-menu.css │ │ └── quarto-menu.js │ │ ├── search │ │ ├── plugin.js │ │ ├── search.esm.js │ │ └── search.js │ │ └── zoom │ │ ├── plugin.js │ │ ├── zoom.esm.js │ │ └── zoom.js ├── sitemap.xml ├── slides │ ├── index.html │ └── index_files │ │ └── figure-revealjs │ │ ├── unnamed-chunk-6-1.png │ │ └── unnamed-chunk-6-2.png └── styles.css ├── art-from-code.Rproj ├── materials ├── README.md ├── barnsley-fern.R ├── circle-scape.R ├── curl-art-1.R ├── curl-art-2.R ├── dplyr-ambient.R ├── first-ambient-art.R ├── flametree-example.R ├── fractal-art.R ├── ggfx-blend.R ├── ggfx-displace.R ├── ggfx-dither.R ├── ggfx-glow.R ├── ggfx-mask.R ├── grow-multipolygon.R ├── grow-polygon.R ├── icescape-3d.R ├── make-noise-art.R ├── mosaica.R ├── palette-generators.R ├── perlin-blob.R ├── perlin-heart-animated.R ├── perlin-heart-grid-2.R ├── perlin-heart-grid.R ├── perlin-heart.R ├── polar-art.R ├── polar-styled-plots.R ├── pretty-boxes.R ├── shaded-icescape.R ├── shaded-ridge-art.R ├── smudged-hexagon.R ├── splotch.R ├── subdivision.R ├── textured-lines.R ├── truchet-example.R ├── unbox-base.R ├── unbox-fast-test.R ├── unbox-fast.cpp ├── unbox-grid.cpp ├── voronoi-baroque.R ├── voronoi-tiles.R └── voronoi-unbox.R ├── output ├── animated-perlin-heart-99.gif ├── curl-art-1.png ├── curl-art-2.png ├── noise-art.png ├── smudged-hexagon.png ├── splotch.png └── unboxer-base-5-1234.png ├── renv.lock └── site-source ├── .gitignore ├── _quarto.yml ├── darkish.scss ├── day-1 ├── session-1 │ ├── .gitignore │ └── index.qmd ├── session-2 │ ├── .gitignore │ └── index.qmd ├── session-3 │ ├── .gitignore │ ├── hand-drawn-hearts.jpg │ └── index.qmd └── session-4 │ ├── .gitignore │ └── index.qmd ├── day-2 ├── session-1 │ ├── .gitignore │ └── index.qmd ├── session-2 │ ├── .gitignore │ ├── index.qmd │ └── wpa-land-use-survey-map.jpg ├── session-3 │ ├── .gitignore │ ├── dithered.png │ ├── index.qmd │ ├── quantised.png │ └── undithered.png └── session-4 │ ├── .gitignore │ └── index.qmd ├── img ├── ascii-cross.png ├── ash_14_006.png ├── banner.png ├── day-1-session-1.png ├── day-1-session-2.png ├── day-1-session-3.png ├── day-1-session-4.png ├── day-2-session-1.png ├── day-2-session-2.png ├── day-2-session-3.png ├── day-2-session-4.png ├── image4.jpg ├── nebula_04_153_5000.jpg └── pollen_55_5739.jpg ├── index.qmd ├── plausible.html ├── slides └── index.qmd └── styles.css /.Rbuildignore: -------------------------------------------------------------------------------- 1 | ^renv$ 2 | ^renv\.lock$ 3 | ^.*\.Rproj$ 4 | ^\.Rproj\.user$ 5 | ^LICENSE\.md$ 6 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .Rproj.user 2 | .Rhistory 3 | .RData 4 | .Ruserdata 5 | -------------------------------------------------------------------------------- /DESCRIPTION: -------------------------------------------------------------------------------- 1 | Package: art-from-code 2 | Title: Art From Code 3 | Version: 0.0.0.9000 4 | person(given = "Danielle", 5 | family = "Navarro", 6 | role = c("aut", "cre"), 7 | email = "djnavarro@protonmail.com", 8 | comment = c(ORCID = "0000-0001-7648-6578")) 9 | Description: The "art from code" workshop for rstudio::conf(2022) is not a 10 | package. This file is included to make it easier to install required 11 | packages. 12 | License: CC BY 4.0 13 | Encoding: UTF-8 14 | Roxygen: list(markdown = TRUE) 15 | RoxygenNote: 7.1.2 16 | URL: https://github.com/rstudio-conf-2022/art-from-code 17 | BugReports: https://github.com/rstudio-conf-2022/art-from-code/issues 18 | Imports: 19 | ambient, 20 | deldir, 21 | dplyr, 22 | flametree, 23 | ggforce, 24 | ggfx, 25 | ggplot2, 26 | ggthemes, 27 | gifski, 28 | here, 29 | jasmines (>= 0.0.0.9001), 30 | purrr, 31 | rayshader, 32 | Rcpp, 33 | remotes, 34 | scales, 35 | sf, 36 | stringr, 37 | tibble, 38 | tictoc, 39 | tidyr, 40 | truchet (>= 0.0.0.9007), 41 | voronoise (>= 0.0.0.9000) 42 | Remotes: 43 | github::paezha/truchet, 44 | github::djnavarro/jasmines, 45 | github::djnavarro/voronoise 46 | -------------------------------------------------------------------------------- /_site/day-1/session-1/index_files/figure-html/art-functions-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-1/index_files/figure-html/art-functions-1.png -------------------------------------------------------------------------------- /_site/day-1/session-1/index_files/figure-html/art-functions-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-1/index_files/figure-html/art-functions-2.png -------------------------------------------------------------------------------- /_site/day-1/session-1/index_files/figure-html/art-functions-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-1/index_files/figure-html/art-functions-3.png -------------------------------------------------------------------------------- /_site/day-1/session-1/index_files/figure-html/canva-palettes-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-1/index_files/figure-html/canva-palettes-1.png -------------------------------------------------------------------------------- /_site/day-1/session-1/index_files/figure-html/canva-palettes-2-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-1/index_files/figure-html/canva-palettes-2-1.png -------------------------------------------------------------------------------- /_site/day-1/session-1/index_files/figure-html/canva-palettes-2-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-1/index_files/figure-html/canva-palettes-2-2.png -------------------------------------------------------------------------------- /_site/day-1/session-1/index_files/figure-html/canva-palettes-2-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-1/index_files/figure-html/canva-palettes-2-3.png -------------------------------------------------------------------------------- /_site/day-1/session-1/index_files/figure-html/canva-palettes-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-1/index_files/figure-html/canva-palettes-2.png -------------------------------------------------------------------------------- /_site/day-1/session-1/index_files/figure-html/canva-palettes-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-1/index_files/figure-html/canva-palettes-3.png -------------------------------------------------------------------------------- /_site/day-1/session-1/index_files/figure-html/compositionality-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-1/index_files/figure-html/compositionality-1.png -------------------------------------------------------------------------------- /_site/day-1/session-1/index_files/figure-html/compositionality-2-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-1/index_files/figure-html/compositionality-2-1.png -------------------------------------------------------------------------------- /_site/day-1/session-1/index_files/figure-html/compositionality-3-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-1/index_files/figure-html/compositionality-3-1.png -------------------------------------------------------------------------------- /_site/day-1/session-1/index_files/figure-html/coord-polar-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-1/index_files/figure-html/coord-polar-1.png -------------------------------------------------------------------------------- /_site/day-1/session-1/index_files/figure-html/familiar-ggplot-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-1/index_files/figure-html/familiar-ggplot-1.png -------------------------------------------------------------------------------- /_site/day-1/session-1/index_files/figure-html/palette-function-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-1/index_files/figure-html/palette-function-1.png -------------------------------------------------------------------------------- /_site/day-1/session-1/index_files/figure-html/show-canva-palette-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-1/index_files/figure-html/show-canva-palette-1.png -------------------------------------------------------------------------------- /_site/day-1/session-1/index_files/figure-html/show-col-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-1/index_files/figure-html/show-col-1.png -------------------------------------------------------------------------------- /_site/day-1/session-1/index_files/figure-html/simple-composition-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-1/index_files/figure-html/simple-composition-1.png -------------------------------------------------------------------------------- /_site/day-1/session-1/index_files/figure-html/simple-composition-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-1/index_files/figure-html/simple-composition-2.png -------------------------------------------------------------------------------- /_site/day-1/session-1/index_files/figure-html/simple-composition-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-1/index_files/figure-html/simple-composition-3.png -------------------------------------------------------------------------------- /_site/day-1/session-1/index_files/figure-html/tweak-ggplot-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-1/index_files/figure-html/tweak-ggplot-1.png -------------------------------------------------------------------------------- /_site/day-1/session-1/index_files/figure-html/tweak-ggplot-more-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-1/index_files/figure-html/tweak-ggplot-more-1.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/base-simplex-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/base-simplex-1.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/base-worley-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/base-worley-1.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/base-worley-distance-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/base-worley-distance-1.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/base-worley-mixed-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/base-worley-mixed-1.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/curl-art-examples-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/curl-art-examples-1.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/curl-art-examples-2-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/curl-art-examples-2-1.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/curl-art-octaves-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/curl-art-octaves-1.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/curl-art-octaves-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/curl-art-octaves-2.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/curl-art-octaves-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/curl-art-octaves-3.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/custom-fracture-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/custom-fracture-1.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/custom-fracture-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/custom-fracture-2.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/custom-fracture-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/custom-fracture-3.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/custom-fracture-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/custom-fracture-4.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/dplyr-art-example-1-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/dplyr-art-example-1-1.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/dplyr-art-example-2-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/dplyr-art-example-2-1.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/dplyr-art-example-3-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/dplyr-art-example-3-1.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/dplyr-recreation-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/dplyr-recreation-1.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/example-art-frequency-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/example-art-frequency-1.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/example-art-frequency-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/example-art-frequency-2.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/example-art-frequency-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/example-art-frequency-3.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/example-art-generator-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/example-art-generator-1.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/example-art-generator-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/example-art-generator-2.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/example-art-generator-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/example-art-generator-3.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/example-art-palette-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/example-art-palette-1.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/example-art-palette-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/example-art-palette-2.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/example-art-palette-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/example-art-palette-3.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/example-art-seed-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/example-art-seed-1.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/example-art-seed-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/example-art-seed-2.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/example-art-seed-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/example-art-seed-3.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/fractal-art-checker-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/fractal-art-checker-1.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/fractal-art-checker-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/fractal-art-checker-2.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/fractal-art-checker-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/fractal-art-checker-3.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/fractal-art-gated-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/fractal-art-gated-1.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/fractal-art-gated-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/fractal-art-gated-2.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/fractal-art-gated-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/fractal-art-gated-3.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/fractal-art-octaves-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/fractal-art-octaves-1.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/fractal-art-octaves-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/fractal-art-octaves-2.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/fractal-art-octaves-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/fractal-art-octaves-3.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/fractal-art-ridged-gain-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/fractal-art-ridged-gain-1.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/fractal-art-ridged-gain-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/fractal-art-ridged-gain-2.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/fractal-art-ridged-gain-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/fractal-art-ridged-gain-3.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/fractal-art-ridged-octaves-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/fractal-art-ridged-octaves-1.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/fractal-art-ridged-octaves-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/fractal-art-ridged-octaves-2.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/fractal-art-ridged-octaves-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/fractal-art-ridged-octaves-3.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/fractal-art-scope-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/fractal-art-scope-1.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/fractal-art-scope-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/fractal-art-scope-2.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/fractal-art-scope-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/fractal-art-scope-3.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/fractal-art-spheres-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/fractal-art-spheres-1.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/fractal-art-spheres-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/fractal-art-spheres-2.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/fractal-art-spheres-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/fractal-art-spheres-3.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/fractal-art-worley-distance-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/fractal-art-worley-distance-1.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/fractal-art-worley-distance-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/fractal-art-worley-distance-2.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/fractal-art-worley-distance-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/fractal-art-worley-distance-3.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/fractal-art-worley-octaves-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/fractal-art-worley-octaves-1.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/fractal-art-worley-octaves-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/fractal-art-worley-octaves-2.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/fractal-art-worley-octaves-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/fractal-art-worley-octaves-3.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/fracture-api-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/fracture-api-1.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/fracture-api-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/fracture-api-2.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/fracture-api-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/fracture-api-3.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/fracture-api-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/fracture-api-4.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/random-crosses-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/random-crosses-1.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/random-crosses-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/random-crosses-2.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/random-crosses-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/random-crosses-3.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/simple-curl-noise-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/simple-curl-noise-1.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/simple-curl-noise-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/simple-curl-noise-2.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/simple-perlin-art-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/simple-perlin-art-1.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/simple-perlin-art-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/simple-perlin-art-2.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/simple-perlin-art-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/simple-perlin-art-3.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/smol-curl-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/smol-curl-1.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/smol-curl2-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/smol-curl2-1.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/smol-grid-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/smol-grid-1.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/smol-simplex-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/smol-simplex-1.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/smol-simplex-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/smol-simplex-2.png -------------------------------------------------------------------------------- /_site/day-1/session-2/index_files/figure-html/smol-slope-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-2/index_files/figure-html/smol-slope-1.png -------------------------------------------------------------------------------- /_site/day-1/session-3/animated-perlin-heart-100.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-3/animated-perlin-heart-100.gif -------------------------------------------------------------------------------- /_site/day-1/session-3/animated-perlin-heart-123.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-3/animated-perlin-heart-123.gif -------------------------------------------------------------------------------- /_site/day-1/session-3/animated-perlin-heart-456.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-3/animated-perlin-heart-456.gif -------------------------------------------------------------------------------- /_site/day-1/session-3/animated-perlin-heart-789.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-3/animated-perlin-heart-789.gif -------------------------------------------------------------------------------- /_site/day-1/session-3/hand-drawn-hearts.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-3/hand-drawn-hearts.jpg -------------------------------------------------------------------------------- /_site/day-1/session-3/index_files/figure-html/basic-circle-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-3/index_files/figure-html/basic-circle-1.png -------------------------------------------------------------------------------- /_site/day-1/session-3/index_files/figure-html/deeply-nested-polygon-layering-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-3/index_files/figure-html/deeply-nested-polygon-layering-1.png -------------------------------------------------------------------------------- /_site/day-1/session-3/index_files/figure-html/fast-polygon-layering-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-3/index_files/figure-html/fast-polygon-layering-1.png -------------------------------------------------------------------------------- /_site/day-1/session-3/index_files/figure-html/heart-polygon-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-3/index_files/figure-html/heart-polygon-1.png -------------------------------------------------------------------------------- /_site/day-1/session-3/index_files/figure-html/layered-smudged-hexagon-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-3/index_files/figure-html/layered-smudged-hexagon-1.png -------------------------------------------------------------------------------- /_site/day-1/session-3/index_files/figure-html/perlin-heart-2-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-3/index_files/figure-html/perlin-heart-2-1.png -------------------------------------------------------------------------------- /_site/day-1/session-3/index_files/figure-html/perlin-heart-texture-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-3/index_files/figure-html/perlin-heart-texture-1.png -------------------------------------------------------------------------------- /_site/day-1/session-3/index_files/figure-html/perlin-hearts-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-3/index_files/figure-html/perlin-hearts-1.png -------------------------------------------------------------------------------- /_site/day-1/session-3/index_files/figure-html/polygon-generation-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-3/index_files/figure-html/polygon-generation-1.png -------------------------------------------------------------------------------- /_site/day-1/session-3/index_files/figure-html/polygon-generation-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-3/index_files/figure-html/polygon-generation-2.png -------------------------------------------------------------------------------- /_site/day-1/session-3/index_files/figure-html/polygon-generation-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-3/index_files/figure-html/polygon-generation-3.png -------------------------------------------------------------------------------- /_site/day-1/session-3/index_files/figure-html/polygon-insertion-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-3/index_files/figure-html/polygon-insertion-1.png -------------------------------------------------------------------------------- /_site/day-1/session-3/index_files/figure-html/polygon-insertion-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-3/index_files/figure-html/polygon-insertion-2.png -------------------------------------------------------------------------------- /_site/day-1/session-3/index_files/figure-html/polygon-insertion-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-3/index_files/figure-html/polygon-insertion-3.png -------------------------------------------------------------------------------- /_site/day-1/session-3/index_files/figure-html/polygon-layering-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-3/index_files/figure-html/polygon-layering-1.png -------------------------------------------------------------------------------- /_site/day-1/session-3/index_files/figure-html/show-perlin-blob-frequency-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-3/index_files/figure-html/show-perlin-blob-frequency-1.png -------------------------------------------------------------------------------- /_site/day-1/session-3/index_files/figure-html/show-perlin-blob-frequency-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-3/index_files/figure-html/show-perlin-blob-frequency-2.png -------------------------------------------------------------------------------- /_site/day-1/session-3/index_files/figure-html/show-perlin-blob-frequency-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-3/index_files/figure-html/show-perlin-blob-frequency-3.png -------------------------------------------------------------------------------- /_site/day-1/session-3/index_files/figure-html/show-perlin-blob-radius-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-3/index_files/figure-html/show-perlin-blob-radius-1.png -------------------------------------------------------------------------------- /_site/day-1/session-3/index_files/figure-html/show-perlin-blobs-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-3/index_files/figure-html/show-perlin-blobs-1.png -------------------------------------------------------------------------------- /_site/day-1/session-3/index_files/figure-html/show-perlin-blobs-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-3/index_files/figure-html/show-perlin-blobs-2.png -------------------------------------------------------------------------------- /_site/day-1/session-3/index_files/figure-html/show-perlin-blobs-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-3/index_files/figure-html/show-perlin-blobs-3.png -------------------------------------------------------------------------------- /_site/day-1/session-3/index_files/figure-html/show-perlin-hearts-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-3/index_files/figure-html/show-perlin-hearts-1.png -------------------------------------------------------------------------------- /_site/day-1/session-3/index_files/figure-html/show-perlin-hearts-2-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-3/index_files/figure-html/show-perlin-hearts-2-1.png -------------------------------------------------------------------------------- /_site/day-1/session-3/index_files/figure-html/show-perlin-hearts-2-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-3/index_files/figure-html/show-perlin-hearts-2-2.png -------------------------------------------------------------------------------- /_site/day-1/session-3/index_files/figure-html/show-perlin-hearts-2-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-3/index_files/figure-html/show-perlin-hearts-2-3.png -------------------------------------------------------------------------------- /_site/day-1/session-3/index_files/figure-html/show-perlin-hearts-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-3/index_files/figure-html/show-perlin-hearts-2.png -------------------------------------------------------------------------------- /_site/day-1/session-3/index_files/figure-html/show-perlin-hearts-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-3/index_files/figure-html/show-perlin-hearts-3.png -------------------------------------------------------------------------------- /_site/day-1/session-3/index_files/figure-html/smooth-path-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-3/index_files/figure-html/smooth-path-1.png -------------------------------------------------------------------------------- /_site/day-1/session-3/index_files/figure-html/smooth-path-textured-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-3/index_files/figure-html/smooth-path-textured-1.png -------------------------------------------------------------------------------- /_site/day-1/session-3/index_files/figure-html/smooth-path-textured-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-3/index_files/figure-html/smooth-path-textured-2.png -------------------------------------------------------------------------------- /_site/day-1/session-3/index_files/figure-html/smudged-hexagon-examples-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-3/index_files/figure-html/smudged-hexagon-examples-1.png -------------------------------------------------------------------------------- /_site/day-1/session-3/index_files/figure-html/smudged-hexagon-examples-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-3/index_files/figure-html/smudged-hexagon-examples-2.png -------------------------------------------------------------------------------- /_site/day-1/session-3/index_files/figure-html/smudged-hexagon-examples-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-3/index_files/figure-html/smudged-hexagon-examples-3.png -------------------------------------------------------------------------------- /_site/day-1/session-3/index_files/figure-html/splotch-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-3/index_files/figure-html/splotch-1.png -------------------------------------------------------------------------------- /_site/day-1/session-3/index_files/figure-html/splotch-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-3/index_files/figure-html/splotch-2.png -------------------------------------------------------------------------------- /_site/day-1/session-3/index_files/figure-html/splotch-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-3/index_files/figure-html/splotch-3.png -------------------------------------------------------------------------------- /_site/day-1/session-3/index_files/figure-html/splotch-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-3/index_files/figure-html/splotch-4.png -------------------------------------------------------------------------------- /_site/day-1/session-3/index_files/figure-html/square-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-3/index_files/figure-html/square-1.png -------------------------------------------------------------------------------- /_site/day-1/session-4/circles_3d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-4/circles_3d.png -------------------------------------------------------------------------------- /_site/day-1/session-4/ice_3d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-4/ice_3d.png -------------------------------------------------------------------------------- /_site/day-1/session-4/index_files/figure-html/abstract-ice-floes-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-4/index_files/figure-html/abstract-ice-floes-1.png -------------------------------------------------------------------------------- /_site/day-1/session-4/index_files/figure-html/abstract-ice-floes-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-4/index_files/figure-html/abstract-ice-floes-2.png -------------------------------------------------------------------------------- /_site/day-1/session-4/index_files/figure-html/abstract-ice-floes-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-4/index_files/figure-html/abstract-ice-floes-3.png -------------------------------------------------------------------------------- /_site/day-1/session-4/index_files/figure-html/basic-ice-floe-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-4/index_files/figure-html/basic-ice-floe-1.png -------------------------------------------------------------------------------- /_site/day-1/session-4/index_files/figure-html/circle-addition-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-4/index_files/figure-html/circle-addition-1.png -------------------------------------------------------------------------------- /_site/day-1/session-4/index_files/figure-html/circle-render-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-4/index_files/figure-html/circle-render-1.png -------------------------------------------------------------------------------- /_site/day-1/session-4/index_files/figure-html/circle-shadow-map-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-4/index_files/figure-html/circle-shadow-map-1.png -------------------------------------------------------------------------------- /_site/day-1/session-4/index_files/figure-html/even-more-abstract-ice-floes-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-4/index_files/figure-html/even-more-abstract-ice-floes-1.png -------------------------------------------------------------------------------- /_site/day-1/session-4/index_files/figure-html/even-more-abstract-ice-floes-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-4/index_files/figure-html/even-more-abstract-ice-floes-2.png -------------------------------------------------------------------------------- /_site/day-1/session-4/index_files/figure-html/even-more-abstract-ice-floes-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-4/index_files/figure-html/even-more-abstract-ice-floes-3.png -------------------------------------------------------------------------------- /_site/day-1/session-4/index_files/figure-html/ice-floe-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-4/index_files/figure-html/ice-floe-1.png -------------------------------------------------------------------------------- /_site/day-1/session-4/index_files/figure-html/more-rayshade-art-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-4/index_files/figure-html/more-rayshade-art-1.png -------------------------------------------------------------------------------- /_site/day-1/session-4/index_files/figure-html/more-rayshade-art-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-4/index_files/figure-html/more-rayshade-art-2.png -------------------------------------------------------------------------------- /_site/day-1/session-4/index_files/figure-html/more-rayshade-art-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-4/index_files/figure-html/more-rayshade-art-3.png -------------------------------------------------------------------------------- /_site/day-1/session-4/index_files/figure-html/rayshader-art-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-4/index_files/figure-html/rayshader-art-1.png -------------------------------------------------------------------------------- /_site/day-1/session-4/index_files/figure-html/ridged-art-example-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-4/index_files/figure-html/ridged-art-example-1.png -------------------------------------------------------------------------------- /_site/day-1/session-4/index_files/figure-html/show-circle-array-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-1/session-4/index_files/figure-html/show-circle-array-1.png -------------------------------------------------------------------------------- /_site/day-2/session-1/index_files/figure-html/an-unboxing-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-1/index_files/figure-html/an-unboxing-1.png -------------------------------------------------------------------------------- /_site/day-2/session-1/index_files/figure-html/coarse-unboxing-art-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-1/index_files/figure-html/coarse-unboxing-art-1.png -------------------------------------------------------------------------------- /_site/day-2/session-1/index_files/figure-html/coarse-unboxing-art-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-1/index_files/figure-html/coarse-unboxing-art-2.png -------------------------------------------------------------------------------- /_site/day-2/session-1/index_files/figure-html/coarse-unboxing-art-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-1/index_files/figure-html/coarse-unboxing-art-3.png -------------------------------------------------------------------------------- /_site/day-2/session-1/index_files/figure-html/first-rcpp-art-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-1/index_files/figure-html/first-rcpp-art-1.png -------------------------------------------------------------------------------- /_site/day-2/session-1/index_files/figure-html/first-rcpp-art-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-1/index_files/figure-html/first-rcpp-art-2.png -------------------------------------------------------------------------------- /_site/day-2/session-1/index_files/figure-html/first-rcpp-art-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-1/index_files/figure-html/first-rcpp-art-3.png -------------------------------------------------------------------------------- /_site/day-2/session-1/index_files/figure-html/first-unboxing-art-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-1/index_files/figure-html/first-unboxing-art-1.png -------------------------------------------------------------------------------- /_site/day-2/session-1/index_files/figure-html/first-unboxing-art-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-1/index_files/figure-html/first-unboxing-art-2.png -------------------------------------------------------------------------------- /_site/day-2/session-1/index_files/figure-html/first-unboxing-art-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-1/index_files/figure-html/first-unboxing-art-3.png -------------------------------------------------------------------------------- /_site/day-2/session-1/index_files/figure-html/image-plot-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-1/index_files/figure-html/image-plot-1.png -------------------------------------------------------------------------------- /_site/day-2/session-1/index_files/figure-html/image-plot-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-1/index_files/figure-html/image-plot-2.png -------------------------------------------------------------------------------- /_site/day-2/session-1/index_files/figure-html/image-plot-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-1/index_files/figure-html/image-plot-3.png -------------------------------------------------------------------------------- /_site/day-2/session-1/index_files/figure-html/more-pretty-boxes-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-1/index_files/figure-html/more-pretty-boxes-1.png -------------------------------------------------------------------------------- /_site/day-2/session-1/index_files/figure-html/more-pretty-boxes-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-1/index_files/figure-html/more-pretty-boxes-2.png -------------------------------------------------------------------------------- /_site/day-2/session-1/index_files/figure-html/more-pretty-boxes-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-1/index_files/figure-html/more-pretty-boxes-3.png -------------------------------------------------------------------------------- /_site/day-2/session-1/index_files/figure-html/pretty-boxes-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-1/index_files/figure-html/pretty-boxes-1.png -------------------------------------------------------------------------------- /_site/day-2/session-1/index_files/figure-html/pretty-boxes-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-1/index_files/figure-html/pretty-boxes-2.png -------------------------------------------------------------------------------- /_site/day-2/session-1/index_files/figure-html/pretty-boxes-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-1/index_files/figure-html/pretty-boxes-3.png -------------------------------------------------------------------------------- /_site/day-2/session-1/index_files/figure-html/randomly-shaded-barnsley-fern-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-1/index_files/figure-html/randomly-shaded-barnsley-fern-1.png -------------------------------------------------------------------------------- /_site/day-2/session-1/index_files/figure-html/show-barnsley-fern-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-1/index_files/figure-html/show-barnsley-fern-1.png -------------------------------------------------------------------------------- /_site/day-2/session-1/index_files/figure-html/show-unboxing-components-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-1/index_files/figure-html/show-unboxing-components-1.png -------------------------------------------------------------------------------- /_site/day-2/session-1/index_files/figure-html/show-unboxing-components-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-1/index_files/figure-html/show-unboxing-components-2.png -------------------------------------------------------------------------------- /_site/day-2/session-1/index_files/figure-html/show-unboxing-components-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-1/index_files/figure-html/show-unboxing-components-3.png -------------------------------------------------------------------------------- /_site/day-2/session-1/index_files/figure-html/transform-shaded-barnsley-fern-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-1/index_files/figure-html/transform-shaded-barnsley-fern-1.png -------------------------------------------------------------------------------- /_site/day-2/session-2/index_files/figure-html/even-more-mosaica-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-2/index_files/figure-html/even-more-mosaica-1.png -------------------------------------------------------------------------------- /_site/day-2/session-2/index_files/figure-html/even-more-mosaica-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-2/index_files/figure-html/even-more-mosaica-2.png -------------------------------------------------------------------------------- /_site/day-2/session-2/index_files/figure-html/even-more-mosaica-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-2/index_files/figure-html/even-more-mosaica-3.png -------------------------------------------------------------------------------- /_site/day-2/session-2/index_files/figure-html/first-truchet-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-2/index_files/figure-html/first-truchet-1.png -------------------------------------------------------------------------------- /_site/day-2/session-2/index_files/figure-html/geom-voronoise-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-2/index_files/figure-html/geom-voronoise-1.png -------------------------------------------------------------------------------- /_site/day-2/session-2/index_files/figure-html/mosaica-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-2/index_files/figure-html/mosaica-1.png -------------------------------------------------------------------------------- /_site/day-2/session-2/index_files/figure-html/mosaica-extras-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-2/index_files/figure-html/mosaica-extras-1.png -------------------------------------------------------------------------------- /_site/day-2/session-2/index_files/figure-html/mosaica-extras-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-2/index_files/figure-html/mosaica-extras-2.png -------------------------------------------------------------------------------- /_site/day-2/session-2/index_files/figure-html/mosaica-extras-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-2/index_files/figure-html/mosaica-extras-3.png -------------------------------------------------------------------------------- /_site/day-2/session-2/index_files/figure-html/rectangle-subdivision-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-2/index_files/figure-html/rectangle-subdivision-1.png -------------------------------------------------------------------------------- /_site/day-2/session-2/index_files/figure-html/scatterplot-boxy-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-2/index_files/figure-html/scatterplot-boxy-1.png -------------------------------------------------------------------------------- /_site/day-2/session-2/index_files/figure-html/second-truchet-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-2/index_files/figure-html/second-truchet-1.png -------------------------------------------------------------------------------- /_site/day-2/session-2/index_files/figure-html/subdivision-extras-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-2/index_files/figure-html/subdivision-extras-1.png -------------------------------------------------------------------------------- /_site/day-2/session-2/index_files/figure-html/subdivision-extras-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-2/index_files/figure-html/subdivision-extras-2.png -------------------------------------------------------------------------------- /_site/day-2/session-2/index_files/figure-html/subdivision-extras-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-2/index_files/figure-html/subdivision-extras-3.png -------------------------------------------------------------------------------- /_site/day-2/session-2/index_files/figure-html/voronoi-baroque-shake-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-2/index_files/figure-html/voronoi-baroque-shake-1.png -------------------------------------------------------------------------------- /_site/day-2/session-2/index_files/figure-html/voronoi-baroque-shake-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-2/index_files/figure-html/voronoi-baroque-shake-2.png -------------------------------------------------------------------------------- /_site/day-2/session-2/index_files/figure-html/voronoi-baroque-shake-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-2/index_files/figure-html/voronoi-baroque-shake-3.png -------------------------------------------------------------------------------- /_site/day-2/session-2/index_files/figure-html/voronoi-baroque-sift-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-2/index_files/figure-html/voronoi-baroque-sift-1.png -------------------------------------------------------------------------------- /_site/day-2/session-2/index_files/figure-html/voronoi-baroque-sift-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-2/index_files/figure-html/voronoi-baroque-sift-2.png -------------------------------------------------------------------------------- /_site/day-2/session-2/index_files/figure-html/voronoi-baroque-sift-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-2/index_files/figure-html/voronoi-baroque-sift-3.png -------------------------------------------------------------------------------- /_site/day-2/session-2/index_files/figure-html/voronoi-boxy-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-2/index_files/figure-html/voronoi-boxy-1.png -------------------------------------------------------------------------------- /_site/day-2/session-2/index_files/figure-html/voronoi-boxy-2-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-2/index_files/figure-html/voronoi-boxy-2-1.png -------------------------------------------------------------------------------- /_site/day-2/session-2/index_files/figure-html/voronoi-boxy-3-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-2/index_files/figure-html/voronoi-boxy-3-1.png -------------------------------------------------------------------------------- /_site/day-2/session-2/index_files/figure-html/voronoi-points-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-2/index_files/figure-html/voronoi-points-1.png -------------------------------------------------------------------------------- /_site/day-2/session-2/index_files/figure-html/voronoi-segments-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-2/index_files/figure-html/voronoi-segments-1.png -------------------------------------------------------------------------------- /_site/day-2/session-2/index_files/figure-html/voronoi-tiles-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-2/index_files/figure-html/voronoi-tiles-1.png -------------------------------------------------------------------------------- /_site/day-2/session-2/index_files/figure-html/voronoi-tiles-double-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-2/index_files/figure-html/voronoi-tiles-double-1.png -------------------------------------------------------------------------------- /_site/day-2/session-2/index_files/figure-html/voronoi-tiles-max-size-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-2/index_files/figure-html/voronoi-tiles-max-size-1.png -------------------------------------------------------------------------------- /_site/day-2/session-2/index_files/figure-html/voronoi-tiles-only-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-2/index_files/figure-html/voronoi-tiles-only-1.png -------------------------------------------------------------------------------- /_site/day-2/session-2/index_files/figure-html/voronoi-tiles-round-corners-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-2/index_files/figure-html/voronoi-tiles-round-corners-1.png -------------------------------------------------------------------------------- /_site/day-2/session-2/index_files/figure-html/voronoi-tiles-shrink-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-2/index_files/figure-html/voronoi-tiles-shrink-1.png -------------------------------------------------------------------------------- /_site/day-2/session-2/wpa-land-use-survey-map.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-2/wpa-land-use-survey-map.jpg -------------------------------------------------------------------------------- /_site/day-2/session-3/dithered.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-3/dithered.png -------------------------------------------------------------------------------- /_site/day-2/session-3/index_files/figure-html/blend-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-3/index_files/figure-html/blend-1.png -------------------------------------------------------------------------------- /_site/day-2/session-3/index_files/figure-html/blend-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-3/index_files/figure-html/blend-2.png -------------------------------------------------------------------------------- /_site/day-2/session-3/index_files/figure-html/blend-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-3/index_files/figure-html/blend-3.png -------------------------------------------------------------------------------- /_site/day-2/session-3/index_files/figure-html/displace-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-3/index_files/figure-html/displace-1.png -------------------------------------------------------------------------------- /_site/day-2/session-3/index_files/figure-html/displace-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-3/index_files/figure-html/displace-2.png -------------------------------------------------------------------------------- /_site/day-2/session-3/index_files/figure-html/dither-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-3/index_files/figure-html/dither-1.png -------------------------------------------------------------------------------- /_site/day-2/session-3/index_files/figure-html/dither-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-3/index_files/figure-html/dither-2.png -------------------------------------------------------------------------------- /_site/day-2/session-3/index_files/figure-html/flametree-plot-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-3/index_files/figure-html/flametree-plot-1.png -------------------------------------------------------------------------------- /_site/day-2/session-3/index_files/figure-html/flametree-plot-origin-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-3/index_files/figure-html/flametree-plot-origin-1.png -------------------------------------------------------------------------------- /_site/day-2/session-3/index_files/figure-html/halftone-dither-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-3/index_files/figure-html/halftone-dither-1.png -------------------------------------------------------------------------------- /_site/day-2/session-3/index_files/figure-html/halftone-dither-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-3/index_files/figure-html/halftone-dither-2.png -------------------------------------------------------------------------------- /_site/day-2/session-3/index_files/figure-html/halftone-dither-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-3/index_files/figure-html/halftone-dither-3.png -------------------------------------------------------------------------------- /_site/day-2/session-3/index_files/figure-html/inner-glow-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-3/index_files/figure-html/inner-glow-1.png -------------------------------------------------------------------------------- /_site/day-2/session-3/index_files/figure-html/inner-glow-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-3/index_files/figure-html/inner-glow-2.png -------------------------------------------------------------------------------- /_site/day-2/session-3/index_files/figure-html/inner-glow-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-3/index_files/figure-html/inner-glow-3.png -------------------------------------------------------------------------------- /_site/day-2/session-3/index_files/figure-html/mask-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-3/index_files/figure-html/mask-1.png -------------------------------------------------------------------------------- /_site/day-2/session-3/index_files/figure-html/mask-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-3/index_files/figure-html/mask-2.png -------------------------------------------------------------------------------- /_site/day-2/session-3/index_files/figure-html/mask-components-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-3/index_files/figure-html/mask-components-1.png -------------------------------------------------------------------------------- /_site/day-2/session-3/index_files/figure-html/mask-components-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-3/index_files/figure-html/mask-components-2.png -------------------------------------------------------------------------------- /_site/day-2/session-3/index_files/figure-html/outer-glow-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-3/index_files/figure-html/outer-glow-1.png -------------------------------------------------------------------------------- /_site/day-2/session-3/index_files/figure-html/outer-glow-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-3/index_files/figure-html/outer-glow-2.png -------------------------------------------------------------------------------- /_site/day-2/session-3/index_files/figure-html/outer-glow-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-3/index_files/figure-html/outer-glow-3.png -------------------------------------------------------------------------------- /_site/day-2/session-3/index_files/figure-html/plain-hex-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-3/index_files/figure-html/plain-hex-1.png -------------------------------------------------------------------------------- /_site/day-2/session-3/index_files/figure-html/polygons-only-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-3/index_files/figure-html/polygons-only-1.png -------------------------------------------------------------------------------- /_site/day-2/session-3/quantised.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-3/quantised.png -------------------------------------------------------------------------------- /_site/day-2/session-3/undithered.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-3/undithered.png -------------------------------------------------------------------------------- /_site/day-2/session-4/index_files/figure-html/lily-pad-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/day-2/session-4/index_files/figure-html/lily-pad-1.png -------------------------------------------------------------------------------- /_site/img/ascii-cross.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/img/ascii-cross.png -------------------------------------------------------------------------------- /_site/img/banner-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/img/banner-2.png -------------------------------------------------------------------------------- /_site/img/banner-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/img/banner-3.png -------------------------------------------------------------------------------- /_site/img/banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/img/banner.png -------------------------------------------------------------------------------- /_site/img/day-1-session-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/img/day-1-session-1.png -------------------------------------------------------------------------------- /_site/img/day-1-session-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/img/day-1-session-2.png -------------------------------------------------------------------------------- /_site/img/day-1-session-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/img/day-1-session-3.png -------------------------------------------------------------------------------- /_site/img/day-1-session-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/img/day-1-session-4.png -------------------------------------------------------------------------------- /_site/img/day-2-session-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/img/day-2-session-1.png -------------------------------------------------------------------------------- /_site/img/day-2-session-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/img/day-2-session-2.png -------------------------------------------------------------------------------- /_site/img/day-2-session-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/img/day-2-session-3.png -------------------------------------------------------------------------------- /_site/img/day-2-session-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/img/day-2-session-4.png -------------------------------------------------------------------------------- /_site/img/nebula_04_153_5000.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/img/nebula_04_153_5000.jpg -------------------------------------------------------------------------------- /_site/img/pollen_55_5739.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/img/pollen_55_5739.jpg -------------------------------------------------------------------------------- /_site/robots.txt: -------------------------------------------------------------------------------- 1 | Sitemap: https://art-from-code.netlify.app/sitemap.xml 2 | -------------------------------------------------------------------------------- /_site/site_libs/bootstrap/bootstrap-icons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/site_libs/bootstrap/bootstrap-icons.woff -------------------------------------------------------------------------------- /_site/site_libs/quarto-html/quarto-html.min.css: -------------------------------------------------------------------------------- 1 | /*# sourceMappingURL=0a6b880beb84f9b6f36107a76f82c5b1.css.map */ 2 | -------------------------------------------------------------------------------- /_site/site_libs/quarto-html/tippy.css: -------------------------------------------------------------------------------- 1 | .tippy-box[data-animation=fade][data-state=hidden]{opacity:0}[data-tippy-root]{max-width:calc(100vw - 10px)}.tippy-box{position:relative;background-color:#333;color:#fff;border-radius:4px;font-size:14px;line-height:1.4;white-space:normal;outline:0;transition-property:transform,visibility,opacity}.tippy-box[data-placement^=top]>.tippy-arrow{bottom:0}.tippy-box[data-placement^=top]>.tippy-arrow:before{bottom:-7px;left:0;border-width:8px 8px 0;border-top-color:initial;transform-origin:center top}.tippy-box[data-placement^=bottom]>.tippy-arrow{top:0}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{top:-7px;left:0;border-width:0 8px 8px;border-bottom-color:initial;transform-origin:center bottom}.tippy-box[data-placement^=left]>.tippy-arrow{right:0}.tippy-box[data-placement^=left]>.tippy-arrow:before{border-width:8px 0 8px 8px;border-left-color:initial;right:-7px;transform-origin:center left}.tippy-box[data-placement^=right]>.tippy-arrow{left:0}.tippy-box[data-placement^=right]>.tippy-arrow:before{left:-7px;border-width:8px 8px 8px 0;border-right-color:initial;transform-origin:center right}.tippy-box[data-inertia][data-state=visible]{transition-timing-function:cubic-bezier(.54,1.5,.38,1.11)}.tippy-arrow{width:16px;height:16px;color:#333}.tippy-arrow:before{content:"";position:absolute;border-color:transparent;border-style:solid}.tippy-content{position:relative;padding:5px 9px;z-index:1} -------------------------------------------------------------------------------- /_site/site_libs/revealjs/dist/reset.css: -------------------------------------------------------------------------------- 1 | /* http://meyerweb.com/eric/tools/css/reset/ 2 | v4.0 | 20180602 3 | License: none (public domain) 4 | */ 5 | 6 | html, body, div, span, applet, object, iframe, 7 | h1, h2, h3, h4, h5, h6, p, blockquote, pre, 8 | a, abbr, acronym, address, big, cite, code, 9 | del, dfn, em, img, ins, kbd, q, s, samp, 10 | small, strike, strong, sub, sup, tt, var, 11 | b, u, i, center, 12 | dl, dt, dd, ol, ul, li, 13 | fieldset, form, label, legend, 14 | table, caption, tbody, tfoot, thead, tr, th, td, 15 | article, aside, canvas, details, embed, 16 | figure, figcaption, footer, header, hgroup, 17 | main, menu, nav, output, ruby, section, summary, 18 | time, mark, audio, video { 19 | margin: 0; 20 | padding: 0; 21 | border: 0; 22 | font-size: 100%; 23 | font: inherit; 24 | vertical-align: baseline; 25 | } 26 | /* HTML5 display-role reset for older browsers */ 27 | article, aside, details, figcaption, figure, 28 | footer, header, hgroup, main, menu, nav, section { 29 | display: block; 30 | } -------------------------------------------------------------------------------- /_site/site_libs/revealjs/dist/theme/fonts/league-gothic/LICENSE: -------------------------------------------------------------------------------- 1 | SIL Open Font License (OFL) 2 | http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL 3 | -------------------------------------------------------------------------------- /_site/site_libs/revealjs/dist/theme/fonts/league-gothic/league-gothic.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'League Gothic'; 3 | src: url('./league-gothic.eot'); 4 | src: url('./league-gothic.eot?#iefix') format('embedded-opentype'), 5 | url('./league-gothic.woff') format('woff'), 6 | url('./league-gothic.ttf') format('truetype'); 7 | 8 | font-weight: normal; 9 | font-style: normal; 10 | } 11 | -------------------------------------------------------------------------------- /_site/site_libs/revealjs/dist/theme/fonts/league-gothic/league-gothic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/site_libs/revealjs/dist/theme/fonts/league-gothic/league-gothic.eot -------------------------------------------------------------------------------- /_site/site_libs/revealjs/dist/theme/fonts/league-gothic/league-gothic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/site_libs/revealjs/dist/theme/fonts/league-gothic/league-gothic.ttf -------------------------------------------------------------------------------- /_site/site_libs/revealjs/dist/theme/fonts/league-gothic/league-gothic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/site_libs/revealjs/dist/theme/fonts/league-gothic/league-gothic.woff -------------------------------------------------------------------------------- /_site/site_libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-italic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/site_libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-italic.eot -------------------------------------------------------------------------------- /_site/site_libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/site_libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-italic.ttf -------------------------------------------------------------------------------- /_site/site_libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/site_libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-italic.woff -------------------------------------------------------------------------------- /_site/site_libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/site_libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-regular.eot -------------------------------------------------------------------------------- /_site/site_libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/site_libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-regular.ttf -------------------------------------------------------------------------------- /_site/site_libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/site_libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-regular.woff -------------------------------------------------------------------------------- /_site/site_libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibold.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/site_libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibold.eot -------------------------------------------------------------------------------- /_site/site_libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/site_libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibold.ttf -------------------------------------------------------------------------------- /_site/site_libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/site_libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibold.woff -------------------------------------------------------------------------------- /_site/site_libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibolditalic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/site_libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibolditalic.eot -------------------------------------------------------------------------------- /_site/site_libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibolditalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/site_libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibolditalic.ttf -------------------------------------------------------------------------------- /_site/site_libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibolditalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/site_libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibolditalic.woff -------------------------------------------------------------------------------- /_site/site_libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Source Sans Pro'; 3 | src: url('./source-sans-pro-regular.eot'); 4 | src: url('./source-sans-pro-regular.eot?#iefix') format('embedded-opentype'), 5 | url('./source-sans-pro-regular.woff') format('woff'), 6 | url('./source-sans-pro-regular.ttf') format('truetype'); 7 | font-weight: normal; 8 | font-style: normal; 9 | } 10 | 11 | @font-face { 12 | font-family: 'Source Sans Pro'; 13 | src: url('./source-sans-pro-italic.eot'); 14 | src: url('./source-sans-pro-italic.eot?#iefix') format('embedded-opentype'), 15 | url('./source-sans-pro-italic.woff') format('woff'), 16 | url('./source-sans-pro-italic.ttf') format('truetype'); 17 | font-weight: normal; 18 | font-style: italic; 19 | } 20 | 21 | @font-face { 22 | font-family: 'Source Sans Pro'; 23 | src: url('./source-sans-pro-semibold.eot'); 24 | src: url('./source-sans-pro-semibold.eot?#iefix') format('embedded-opentype'), 25 | url('./source-sans-pro-semibold.woff') format('woff'), 26 | url('./source-sans-pro-semibold.ttf') format('truetype'); 27 | font-weight: 600; 28 | font-style: normal; 29 | } 30 | 31 | @font-face { 32 | font-family: 'Source Sans Pro'; 33 | src: url('./source-sans-pro-semibolditalic.eot'); 34 | src: url('./source-sans-pro-semibolditalic.eot?#iefix') format('embedded-opentype'), 35 | url('./source-sans-pro-semibolditalic.woff') format('woff'), 36 | url('./source-sans-pro-semibolditalic.ttf') format('truetype'); 37 | font-weight: 600; 38 | font-style: italic; 39 | } 40 | -------------------------------------------------------------------------------- /_site/site_libs/revealjs/plugin/highlight/monokai.css: -------------------------------------------------------------------------------- 1 | /* 2 | Monokai style - ported by Luigi Maselli - http://grigio.org 3 | */ 4 | 5 | .hljs { 6 | display: block; 7 | overflow-x: auto; 8 | padding: 0.5em; 9 | background: #272822; 10 | color: #ddd; 11 | } 12 | 13 | .hljs-tag, 14 | .hljs-keyword, 15 | .hljs-selector-tag, 16 | .hljs-literal, 17 | .hljs-strong, 18 | .hljs-name { 19 | color: #f92672; 20 | } 21 | 22 | .hljs-code { 23 | color: #66d9ef; 24 | } 25 | 26 | .hljs-class .hljs-title { 27 | color: white; 28 | } 29 | 30 | .hljs-attribute, 31 | .hljs-symbol, 32 | .hljs-regexp, 33 | .hljs-link { 34 | color: #bf79db; 35 | } 36 | 37 | .hljs-string, 38 | .hljs-bullet, 39 | .hljs-subst, 40 | .hljs-title, 41 | .hljs-section, 42 | .hljs-emphasis, 43 | .hljs-type, 44 | .hljs-built_in, 45 | .hljs-builtin-name, 46 | .hljs-selector-attr, 47 | .hljs-selector-pseudo, 48 | .hljs-addition, 49 | .hljs-variable, 50 | .hljs-template-tag, 51 | .hljs-template-variable { 52 | color: #a6e22e; 53 | } 54 | 55 | .hljs-comment, 56 | .hljs-quote, 57 | .hljs-deletion, 58 | .hljs-meta { 59 | color: #75715e; 60 | } 61 | 62 | .hljs-keyword, 63 | .hljs-selector-tag, 64 | .hljs-literal, 65 | .hljs-doctag, 66 | .hljs-title, 67 | .hljs-section, 68 | .hljs-type, 69 | .hljs-selector-id { 70 | font-weight: bold; 71 | } 72 | -------------------------------------------------------------------------------- /_site/site_libs/revealjs/plugin/highlight/zenburn.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Zenburn style from voldmar.ru (c) Vladimir Epifanov 4 | based on dark.css by Ivan Sagalaev 5 | 6 | */ 7 | 8 | .hljs { 9 | display: block; 10 | overflow-x: auto; 11 | padding: 0.5em; 12 | background: #3f3f3f; 13 | color: #dcdcdc; 14 | } 15 | 16 | .hljs-keyword, 17 | .hljs-selector-tag, 18 | .hljs-tag { 19 | color: #e3ceab; 20 | } 21 | 22 | .hljs-template-tag { 23 | color: #dcdcdc; 24 | } 25 | 26 | .hljs-number { 27 | color: #8cd0d3; 28 | } 29 | 30 | .hljs-variable, 31 | .hljs-template-variable, 32 | .hljs-attribute { 33 | color: #efdcbc; 34 | } 35 | 36 | .hljs-literal { 37 | color: #efefaf; 38 | } 39 | 40 | .hljs-subst { 41 | color: #8f8f8f; 42 | } 43 | 44 | .hljs-title, 45 | .hljs-name, 46 | .hljs-selector-id, 47 | .hljs-selector-class, 48 | .hljs-section, 49 | .hljs-type { 50 | color: #efef8f; 51 | } 52 | 53 | .hljs-symbol, 54 | .hljs-bullet, 55 | .hljs-link { 56 | color: #dca3a3; 57 | } 58 | 59 | .hljs-deletion, 60 | .hljs-string, 61 | .hljs-built_in, 62 | .hljs-builtin-name { 63 | color: #cc9393; 64 | } 65 | 66 | .hljs-addition, 67 | .hljs-comment, 68 | .hljs-quote, 69 | .hljs-meta { 70 | color: #7f9f7f; 71 | } 72 | 73 | 74 | .hljs-emphasis { 75 | font-style: italic; 76 | } 77 | 78 | .hljs-strong { 79 | font-weight: bold; 80 | } 81 | -------------------------------------------------------------------------------- /_site/site_libs/revealjs/plugin/math/katex.js: -------------------------------------------------------------------------------- 1 | /** 2 | * A plugin which enables rendering of math equations inside 3 | * of reveal.js slides. Essentially a thin wrapper for KaTeX. 4 | * 5 | * @author Hakim El Hattab 6 | * @author Gerhard Burger 7 | */ 8 | export const KaTeX = () => { 9 | let deck; 10 | 11 | let defaultOptions = { 12 | version: 'latest', 13 | delimiters: [ 14 | {left: '$$', right: '$$', display: true}, // Note: $$ has to come before $ 15 | {left: '$', right: '$', display: false}, 16 | {left: '\\(', right: '\\)', display: false}, 17 | {left: '\\[', right: '\\]', display: true} 18 | ], 19 | ignoredTags: ['script', 'noscript', 'style', 'textarea', 'pre'] 20 | } 21 | 22 | const loadCss = src => { 23 | let link = document.createElement('link'); 24 | link.rel = 'stylesheet'; 25 | link.href = src; 26 | document.head.appendChild(link); 27 | }; 28 | 29 | /** 30 | * Loads a JavaScript file and returns a Promise for when it is loaded 31 | * Credits: https://aaronsmith.online/easily-load-an-external-script-using-javascript/ 32 | */ 33 | const loadScript = src => { 34 | return new Promise((resolve, reject) => { 35 | const script = document.createElement('script') 36 | script.type = 'text/javascript' 37 | script.onload = resolve 38 | script.onerror = reject 39 | script.src = src 40 | document.head.append(script) 41 | }) 42 | }; 43 | 44 | async function loadScripts(urls) { 45 | for(const url of urls) { 46 | await loadScript(url); 47 | } 48 | } 49 | 50 | return { 51 | id: 'katex', 52 | 53 | init: function (reveal) { 54 | 55 | deck = reveal; 56 | 57 | let revealOptions = deck.getConfig().katex || {}; 58 | 59 | let options = {...defaultOptions, ...revealOptions}; 60 | const {local, version, extensions, ...katexOptions} = options; 61 | 62 | let baseUrl = options.local || 'https://cdn.jsdelivr.net/npm/katex'; 63 | let versionString = options.local ? '' : '@' + options.version; 64 | 65 | let cssUrl = baseUrl + versionString + '/dist/katex.min.css'; 66 | let katexUrl = baseUrl + versionString + '/dist/katex.min.js'; 67 | let mhchemUrl = baseUrl + versionString + '/dist/contrib/mhchem.min.js' 68 | let karUrl = baseUrl + versionString + '/dist/contrib/auto-render.min.js'; 69 | 70 | let katexScripts = [katexUrl]; 71 | if(options.extensions && options.extensions.includes("mhchem")) { 72 | katexScripts.push(mhchemUrl); 73 | } 74 | katexScripts.push(karUrl); 75 | 76 | const renderMath = () => { 77 | renderMathInElement(reveal.getSlidesElement(), katexOptions); 78 | deck.layout(); 79 | } 80 | 81 | loadCss(cssUrl); 82 | 83 | // For some reason dynamically loading with defer attribute doesn't result in the expected behavior, the below code does 84 | loadScripts(katexScripts).then(() => { 85 | if( deck.isReady() ) { 86 | renderMath(); 87 | } 88 | else { 89 | deck.on( 'ready', renderMath.bind( this ) ); 90 | } 91 | }); 92 | 93 | } 94 | } 95 | 96 | }; 97 | -------------------------------------------------------------------------------- /_site/site_libs/revealjs/plugin/math/mathjax2.js: -------------------------------------------------------------------------------- 1 | /** 2 | * A plugin which enables rendering of math equations inside 3 | * of reveal.js slides. Essentially a thin wrapper for MathJax. 4 | * 5 | * @author Hakim El Hattab 6 | */ 7 | export const MathJax2 = () => { 8 | 9 | // The reveal.js instance this plugin is attached to 10 | let deck; 11 | 12 | let defaultOptions = { 13 | messageStyle: 'none', 14 | tex2jax: { 15 | inlineMath: [ [ '$', '$' ], [ '\\(', '\\)' ] ], 16 | skipTags: [ 'script', 'noscript', 'style', 'textarea', 'pre' ] 17 | }, 18 | skipStartupTypeset: true 19 | }; 20 | 21 | function loadScript( url, callback ) { 22 | 23 | let head = document.querySelector( 'head' ); 24 | let script = document.createElement( 'script' ); 25 | script.type = 'text/javascript'; 26 | script.src = url; 27 | 28 | // Wrapper for callback to make sure it only fires once 29 | let finish = () => { 30 | if( typeof callback === 'function' ) { 31 | callback.call(); 32 | callback = null; 33 | } 34 | } 35 | 36 | script.onload = finish; 37 | 38 | // IE 39 | script.onreadystatechange = () => { 40 | if ( this.readyState === 'loaded' ) { 41 | finish(); 42 | } 43 | } 44 | 45 | // Normal browsers 46 | head.appendChild( script ); 47 | 48 | } 49 | 50 | return { 51 | id: 'mathjax2', 52 | 53 | init: function( reveal ) { 54 | 55 | deck = reveal; 56 | 57 | let revealOptions = deck.getConfig().mathjax2 || deck.getConfig().math || {}; 58 | 59 | let options = { ...defaultOptions, ...revealOptions }; 60 | let mathjax = options.mathjax || 'https://cdn.jsdelivr.net/npm/mathjax@2/MathJax.js'; 61 | let config = options.config || 'TeX-AMS_HTML-full'; 62 | let url = mathjax + '?config=' + config; 63 | 64 | options.tex2jax = { ...defaultOptions.tex2jax, ...revealOptions.tex2jax }; 65 | 66 | options.mathjax = options.config = null; 67 | 68 | loadScript( url, function() { 69 | 70 | MathJax.Hub.Config( options ); 71 | 72 | // Typeset followed by an immediate reveal.js layout since 73 | // the typesetting process could affect slide height 74 | MathJax.Hub.Queue( [ 'Typeset', MathJax.Hub, deck.getRevealElement() ] ); 75 | MathJax.Hub.Queue( deck.layout ); 76 | 77 | // Reprocess equations in slides when they turn visible 78 | deck.on( 'slidechanged', function( event ) { 79 | 80 | MathJax.Hub.Queue( [ 'Typeset', MathJax.Hub, event.currentSlide ] ); 81 | 82 | } ); 83 | 84 | } ); 85 | 86 | } 87 | } 88 | 89 | }; 90 | -------------------------------------------------------------------------------- /_site/site_libs/revealjs/plugin/math/mathjax3.js: -------------------------------------------------------------------------------- 1 | /** 2 | * A plugin which enables rendering of math equations inside 3 | * of reveal.js slides. Essentially a thin wrapper for MathJax 3 4 | * 5 | * @author Hakim El Hattab 6 | * @author Gerhard Burger 7 | */ 8 | export const MathJax3 = () => { 9 | 10 | // The reveal.js instance this plugin is attached to 11 | let deck; 12 | 13 | let defaultOptions = { 14 | tex: { 15 | inlineMath: [ [ '$', '$' ], [ '\\(', '\\)' ] ] 16 | }, 17 | options: { 18 | skipHtmlTags: [ 'script', 'noscript', 'style', 'textarea', 'pre' ] 19 | }, 20 | startup: { 21 | ready: () => { 22 | MathJax.startup.defaultReady(); 23 | MathJax.startup.promise.then(() => { 24 | Reveal.layout(); 25 | }); 26 | } 27 | } 28 | }; 29 | 30 | function loadScript( url, callback ) { 31 | 32 | let script = document.createElement( 'script' ); 33 | script.type = "text/javascript" 34 | script.id = "MathJax-script" 35 | script.src = url; 36 | script.async = true 37 | 38 | // Wrapper for callback to make sure it only fires once 39 | script.onload = () => { 40 | if (typeof callback === 'function') { 41 | callback.call(); 42 | callback = null; 43 | } 44 | }; 45 | 46 | document.head.appendChild( script ); 47 | 48 | } 49 | 50 | return { 51 | id: 'mathjax3', 52 | init: function(reveal) { 53 | 54 | deck = reveal; 55 | 56 | let revealOptions = deck.getConfig().mathjax3 || {}; 57 | let options = {...defaultOptions, ...revealOptions}; 58 | options.tex = {...defaultOptions.tex, ...revealOptions.tex} 59 | options.options = {...options.options, ...defaultOptions.options} 60 | options.startup = {...defaultOptions.startup, ...revealOptions.startup} 61 | 62 | let url = options.mathjax || 'https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js'; 63 | options.mathjax = null; 64 | 65 | window.MathJax = options; 66 | 67 | loadScript( url, function() { 68 | // Reprocess equations in slides when they turn visible 69 | Reveal.addEventListener( 'slidechanged', function( event ) { 70 | MathJax.typeset(); 71 | } ); 72 | } ); 73 | 74 | } 75 | } 76 | 77 | }; 78 | -------------------------------------------------------------------------------- /_site/site_libs/revealjs/plugin/math/plugin.js: -------------------------------------------------------------------------------- 1 | import {KaTeX} from "./katex"; 2 | import {MathJax2} from "./mathjax2"; 3 | import {MathJax3} from "./mathjax3"; 4 | 5 | const defaultTypesetter = MathJax2; 6 | 7 | /*! 8 | * This plugin is a wrapper for the MathJax2, 9 | * MathJax3 and KaTeX typesetter plugins. 10 | */ 11 | export default Plugin = Object.assign( defaultTypesetter(), { 12 | KaTeX, 13 | MathJax2, 14 | MathJax3 15 | } ); -------------------------------------------------------------------------------- /_site/site_libs/revealjs/plugin/pdf-export/pdfexport.js: -------------------------------------------------------------------------------- 1 | var PdfExport = ( function( _Reveal ){ 2 | 3 | var Reveal = _Reveal; 4 | var setStylesheet = null; 5 | var installAltKeyBindings = null; 6 | 7 | function getRevealJsPath(){ 8 | var regex = /\b[^/]+\/reveal.css$/i; 9 | var script = Array.from( document.querySelectorAll( 'link' ) ).find( function( e ){ 10 | return e.attributes.href && e.attributes.href.value.search( regex ) >= 0; 11 | }); 12 | if( !script ){ 13 | console.error( 'reveal.css could not be found in included elements. Did you rename this file?' ); 14 | return ''; 15 | } 16 | return script.attributes.href.value.replace( regex, '' ); 17 | } 18 | 19 | function setStylesheet3( pdfExport ){ 20 | var link = document.querySelector( '#print' ); 21 | if( !link ){ 22 | link = document.createElement( 'link' ); 23 | link.rel = 'stylesheet'; 24 | link.id = 'print'; 25 | document.querySelector( 'head' ).appendChild( link ); 26 | } 27 | var style = 'paper'; 28 | if( pdfExport ){ 29 | style = 'pdf'; 30 | } 31 | link.href = getRevealJsPath() + 'css/print/' + style + '.css'; 32 | } 33 | 34 | function setStylesheet4( pdfExport ){ 35 | } 36 | 37 | function installAltKeyBindings3(){ 38 | } 39 | 40 | function installAltKeyBindings4(){ 41 | if( isPrintingPDF() ){ 42 | var config = Reveal.getConfig(); 43 | var shortcut = config.pdfExportShortcut || 'E'; 44 | window.addEventListener( 'keydown', function( e ){ 45 | if( e.target.nodeName.toUpperCase() == 'BODY' 46 | && ( e.key.toUpperCase() == shortcut.toUpperCase() || e.keyCode == shortcut.toUpperCase().charCodeAt( 0 ) ) ){ 47 | e.preventDefault(); 48 | togglePdfExport(); 49 | return false; 50 | } 51 | }, true ); 52 | } 53 | } 54 | 55 | function isPrintingPDF(){ 56 | return ( /print-pdf/gi ).test( window.location.search ); 57 | } 58 | 59 | function togglePdfExport(){ 60 | var url_doc = new URL( document.URL ); 61 | var query_doc = new URLSearchParams( url_doc.searchParams ); 62 | if( isPrintingPDF() ){ 63 | query_doc.delete( 'print-pdf' ); 64 | }else{ 65 | query_doc.set( 'print-pdf', '' ); 66 | } 67 | url_doc.search = ( query_doc.toString() ? '?' + query_doc.toString() : '' ); 68 | window.location.href = url_doc.toString(); 69 | } 70 | 71 | function installKeyBindings(){ 72 | var config = Reveal.getConfig(); 73 | var shortcut = config.pdfExportShortcut || 'E'; 74 | Reveal.addKeyBinding({ 75 | keyCode: shortcut.toUpperCase().charCodeAt( 0 ), 76 | key: shortcut.toUpperCase(), 77 | description: 'PDF export mode' 78 | }, togglePdfExport ); 79 | installAltKeyBindings(); 80 | } 81 | 82 | function install(){ 83 | installKeyBindings(); 84 | setStylesheet( isPrintingPDF() ); 85 | } 86 | 87 | var Plugin = { 88 | } 89 | 90 | if( Reveal && Reveal.VERSION && Reveal.VERSION.length && Reveal.VERSION[ 0 ] == '3' ){ 91 | // reveal 3.x 92 | setStylesheet = setStylesheet3; 93 | installAltKeyBindings = installAltKeyBindings3; 94 | install(); 95 | }else{ 96 | // must be reveal 4.x 97 | setStylesheet = setStylesheet4; 98 | installAltKeyBindings = installAltKeyBindings4; 99 | Plugin.id = 'pdf-export'; 100 | Plugin.init = function( _Reveal ){ 101 | Reveal = _Reveal; 102 | install(); 103 | }; 104 | } 105 | 106 | return Plugin; 107 | 108 | })( Reveal ); 109 | -------------------------------------------------------------------------------- /_site/site_libs/revealjs/plugin/pdf-export/plugin.yml: -------------------------------------------------------------------------------- 1 | name: PdfExport 2 | script: pdfexport.js 3 | -------------------------------------------------------------------------------- /_site/site_libs/revealjs/plugin/quarto-line-highlight/line-highlight.css: -------------------------------------------------------------------------------- 1 | .reveal 2 | div.sourceCode 3 | pre 4 | code.has-line-highlights 5 | > span:not(.highlight-line) { 6 | opacity: 0.4; 7 | } 8 | 9 | .reveal pre.numberSource { 10 | padding-left: 0; 11 | } 12 | 13 | .reveal pre.numberSource code > span { 14 | left: -2.1em; 15 | } 16 | 17 | pre.numberSource code > span > a:first-child::before { 18 | left: -0.7em; 19 | } 20 | 21 | .reveal pre > code:not(:first-child).fragment { 22 | position: absolute; 23 | top: 0; 24 | left: 0; 25 | width: 100%; 26 | box-sizing: border-box; 27 | } 28 | 29 | .reveal div.sourceCode pre code { 30 | min-height: 100%; 31 | } 32 | -------------------------------------------------------------------------------- /_site/site_libs/revealjs/plugin/quarto-line-highlight/plugin.yml: -------------------------------------------------------------------------------- 1 | # adapted from https://github.com/hakimel/reveal.js/tree/master/plugin/highlight 2 | name: QuartoLineHighlight 3 | script: line-highlight.js 4 | stylesheet: line-highlight.css 5 | -------------------------------------------------------------------------------- /_site/site_libs/revealjs/plugin/quarto-support/footer.css: -------------------------------------------------------------------------------- 1 | .reveal .slide-logo { 2 | display: block; 3 | position: fixed; 4 | bottom: 0; 5 | right: 12px; 6 | max-height: 2.2rem; 7 | height: 100%; 8 | width: auto; 9 | } 10 | 11 | .reveal .footer { 12 | display: block; 13 | position: fixed; 14 | bottom: 18px; 15 | width: 100%; 16 | margin: 0 auto; 17 | text-align: center; 18 | font-size: 18px; 19 | z-index: 2; 20 | } 21 | 22 | .reveal .footer > * { 23 | margin-top: 0; 24 | margin-bottom: 0; 25 | } 26 | 27 | .reveal .slide .footer { 28 | display: none; 29 | } 30 | 31 | .reveal .slide-number { 32 | bottom: 10px; 33 | right: 10px; 34 | font-size: 16px; 35 | background-color: transparent; 36 | } 37 | 38 | .reveal.has-logo .slide-number { 39 | bottom: initial; 40 | top: 8px; 41 | right: 8px; 42 | } 43 | 44 | .reveal .slide-number .slide-number-delimiter { 45 | margin: 0; 46 | } 47 | 48 | .reveal .slide-menu-button { 49 | left: 8px; 50 | bottom: 8px; 51 | } 52 | 53 | .reveal .slide-chalkboard-buttons { 54 | position: fixed; 55 | left: 12px; 56 | bottom: 8px; 57 | z-index: 30; 58 | font-size: 24px; 59 | } 60 | 61 | .reveal .slide-chalkboard-buttons.slide-menu-offset { 62 | left: 54px; 63 | } 64 | 65 | .reveal .slide-chalkboard-buttons > span { 66 | margin-right: 14px; 67 | cursor: pointer; 68 | } 69 | 70 | @media screen and (max-width: 800px) { 71 | .reveal .slide-logo { 72 | max-height: 1.1rem; 73 | bottom: -2px; 74 | right: 10px; 75 | } 76 | .reveal .footer { 77 | font-size: 14px; 78 | bottom: 12px; 79 | } 80 | .reveal .slide-number { 81 | font-size: 12px; 82 | bottom: 7px; 83 | } 84 | .reveal .slide-menu-button .fas::before { 85 | height: 1.3rem; 86 | width: 1.3rem; 87 | vertical-align: -0.125em; 88 | background-size: 1.3rem 1.3rem; 89 | } 90 | 91 | .reveal .slide-chalkboard-buttons .fas::before { 92 | height: 0.95rem; 93 | width: 0.95rem; 94 | background-size: 0.95rem 0.95rem; 95 | vertical-align: -0em; 96 | } 97 | 98 | .reveal .slide-chalkboard-buttons.slide-menu-offset { 99 | left: 36px; 100 | } 101 | .reveal .slide-chalkboard-buttons > span { 102 | margin-right: 9px; 103 | } 104 | } 105 | 106 | html.print-pdf .reveal .slide-menu-button, 107 | html.print-pdf .reveal .slide-chalkboard-buttons { 108 | display: none; 109 | } 110 | -------------------------------------------------------------------------------- /_site/site_libs/revealjs/plugin/quarto-support/plugin.yml: -------------------------------------------------------------------------------- 1 | name: QuartoSupport 2 | script: support.js 3 | stylesheet: footer.css 4 | config: 5 | smaller: false 6 | -------------------------------------------------------------------------------- /_site/site_libs/revealjs/plugin/reveal-menu/plugin.yml: -------------------------------------------------------------------------------- 1 | name: RevealMenu 2 | script: [menu.js, quarto-menu.js] 3 | stylesheet: [menu.css, quarto-menu.css] 4 | config: 5 | menu: 6 | side: "left" 7 | useTextContentForMissingTitles: true 8 | markers: false 9 | loadIcons: false 10 | -------------------------------------------------------------------------------- /_site/site_libs/revealjs/plugin/reveal-menu/quarto-menu.js: -------------------------------------------------------------------------------- 1 | window.revealMenuToolHandler = function (handler) { 2 | return function (event) { 3 | event.preventDefault(); 4 | handler(); 5 | Reveal.getPlugin("menu").closeMenu(); 6 | }; 7 | }; 8 | 9 | window.RevealMenuToolHandlers = { 10 | fullscreen: revealMenuToolHandler(function () { 11 | const element = document.documentElement; 12 | const requestMethod = 13 | element.requestFullscreen || 14 | element.webkitRequestFullscreen || 15 | element.webkitRequestFullScreen || 16 | element.mozRequestFullScreen || 17 | element.msRequestFullscreen; 18 | if (requestMethod) { 19 | requestMethod.apply(element); 20 | } 21 | }), 22 | speakerMode: revealMenuToolHandler(function () { 23 | Reveal.getPlugin("notes").open(); 24 | }), 25 | keyboardHelp: revealMenuToolHandler(function () { 26 | Reveal.toggleHelp(true); 27 | }), 28 | overview: revealMenuToolHandler(function () { 29 | Reveal.toggleOverview(true); 30 | }), 31 | toggleChalkboard: revealMenuToolHandler(function () { 32 | RevealChalkboard.toggleChalkboard(); 33 | }), 34 | toggleNotesCanvas: revealMenuToolHandler(function () { 35 | RevealChalkboard.toggleNotesCanvas(); 36 | }), 37 | downloadDrawings: revealMenuToolHandler(function () { 38 | RevealChalkboard.download(); 39 | }), 40 | }; 41 | -------------------------------------------------------------------------------- /_site/site_libs/revealjs/plugin/zoom/zoom.esm.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * reveal.js Zoom plugin 3 | */ 4 | var e={id:"zoom",init:function(e){e.getRevealElement().addEventListener("mousedown",(function(o){var n=/Linux/.test(window.navigator.platform)?"ctrl":"alt",i=(e.getConfig().zoomKey?e.getConfig().zoomKey:n)+"Key",d=e.getConfig().zoomLevel?e.getConfig().zoomLevel:2;o[i]&&!e.isOverview()&&(o.preventDefault(),t.to({x:o.clientX,y:o.clientY,scale:d,pan:!1}))}))}},t=function(){var e=1,o=0,n=0,i=-1,d=-1,s="WebkitTransform"in document.body.style||"MozTransform"in document.body.style||"msTransform"in document.body.style||"OTransform"in document.body.style||"transform"in document.body.style;function r(t,o){var n=y();if(t.width=t.width||1,t.height=t.height||1,t.x-=(window.innerWidth-t.width*o)/2,t.y-=(window.innerHeight-t.height*o)/2,s)if(1===o)document.body.style.transform="",document.body.style.OTransform="",document.body.style.msTransform="",document.body.style.MozTransform="",document.body.style.WebkitTransform="";else{var i=n.x+"px "+n.y+"px",d="translate("+-t.x+"px,"+-t.y+"px) scale("+o+")";document.body.style.transformOrigin=i,document.body.style.OTransformOrigin=i,document.body.style.msTransformOrigin=i,document.body.style.MozTransformOrigin=i,document.body.style.WebkitTransformOrigin=i,document.body.style.transform=d,document.body.style.OTransform=d,document.body.style.msTransform=d,document.body.style.MozTransform=d,document.body.style.WebkitTransform=d}else 1===o?(document.body.style.position="",document.body.style.left="",document.body.style.top="",document.body.style.width="",document.body.style.height="",document.body.style.zoom=""):(document.body.style.position="relative",document.body.style.left=-(n.x+t.x)/o+"px",document.body.style.top=-(n.y+t.y)/o+"px",document.body.style.width=100*o+"%",document.body.style.height=100*o+"%",document.body.style.zoom=o);e=o,document.documentElement.classList&&(1!==e?document.documentElement.classList.add("zoomed"):document.documentElement.classList.remove("zoomed"))}function m(){var t=.12*window.innerWidth,i=.12*window.innerHeight,d=y();nwindow.innerHeight-i&&window.scroll(d.x,d.y+(1-(window.innerHeight-n)/i)*(14/e)),owindow.innerWidth-t&&window.scroll(d.x+(1-(window.innerWidth-o)/t)*(14/e),d.y)}function y(){return{x:void 0!==window.scrollX?window.scrollX:window.pageXOffset,y:void 0!==window.scrollY?window.scrollY:window.pageYOffset}}return s&&(document.body.style.transition="transform 0.8s ease",document.body.style.OTransition="-o-transform 0.8s ease",document.body.style.msTransition="-ms-transform 0.8s ease",document.body.style.MozTransition="-moz-transform 0.8s ease",document.body.style.WebkitTransition="-webkit-transform 0.8s ease"),document.addEventListener("keyup",(function(o){1!==e&&27===o.keyCode&&t.out()})),document.addEventListener("mousemove",(function(t){1!==e&&(o=t.clientX,n=t.clientY)})),{to:function(o){if(1!==e)t.out();else{if(o.x=o.x||0,o.y=o.y||0,o.element){var n=o.element.getBoundingClientRect();o.x=n.left-20,o.y=n.top-20,o.width=n.width+40,o.height=n.height+40}void 0!==o.width&&void 0!==o.height&&(o.scale=Math.max(Math.min(window.innerWidth/o.width,window.innerHeight/o.height),1)),o.scale>1&&(o.x*=o.scale,o.y*=o.scale,r(o,o.scale),!1!==o.pan&&(i=setTimeout((function(){d=setInterval(m,1e3/60)}),800)))}},out:function(){clearTimeout(i),clearInterval(d),r({x:0,y:0},1),e=1},magnify:function(e){this.to(e)},reset:function(){this.out()},zoomLevel:function(){return e}}}();export default function(){return e} 5 | -------------------------------------------------------------------------------- /_site/site_libs/revealjs/plugin/zoom/zoom.js: -------------------------------------------------------------------------------- 1 | !function(e,o){"object"==typeof exports&&"undefined"!=typeof module?module.exports=o():"function"==typeof define&&define.amd?define(o):(e="undefined"!=typeof globalThis?globalThis:e||self).RevealZoom=o()}(this,(function(){"use strict"; 2 | /*! 3 | * reveal.js Zoom plugin 4 | */var e={id:"zoom",init:function(e){e.getRevealElement().addEventListener("mousedown",(function(t){var n=/Linux/.test(window.navigator.platform)?"ctrl":"alt",i=(e.getConfig().zoomKey?e.getConfig().zoomKey:n)+"Key",d=e.getConfig().zoomLevel?e.getConfig().zoomLevel:2;t[i]&&!e.isOverview()&&(t.preventDefault(),o.to({x:t.clientX,y:t.clientY,scale:d,pan:!1}))}))}},o=function(){var e=1,t=0,n=0,i=-1,d=-1,s="WebkitTransform"in document.body.style||"MozTransform"in document.body.style||"msTransform"in document.body.style||"OTransform"in document.body.style||"transform"in document.body.style;function r(o,t){var n=l();if(o.width=o.width||1,o.height=o.height||1,o.x-=(window.innerWidth-o.width*t)/2,o.y-=(window.innerHeight-o.height*t)/2,s)if(1===t)document.body.style.transform="",document.body.style.OTransform="",document.body.style.msTransform="",document.body.style.MozTransform="",document.body.style.WebkitTransform="";else{var i=n.x+"px "+n.y+"px",d="translate("+-o.x+"px,"+-o.y+"px) scale("+t+")";document.body.style.transformOrigin=i,document.body.style.OTransformOrigin=i,document.body.style.msTransformOrigin=i,document.body.style.MozTransformOrigin=i,document.body.style.WebkitTransformOrigin=i,document.body.style.transform=d,document.body.style.OTransform=d,document.body.style.msTransform=d,document.body.style.MozTransform=d,document.body.style.WebkitTransform=d}else 1===t?(document.body.style.position="",document.body.style.left="",document.body.style.top="",document.body.style.width="",document.body.style.height="",document.body.style.zoom=""):(document.body.style.position="relative",document.body.style.left=-(n.x+o.x)/t+"px",document.body.style.top=-(n.y+o.y)/t+"px",document.body.style.width=100*t+"%",document.body.style.height=100*t+"%",document.body.style.zoom=t);e=t,document.documentElement.classList&&(1!==e?document.documentElement.classList.add("zoomed"):document.documentElement.classList.remove("zoomed"))}function m(){var o=.12*window.innerWidth,i=.12*window.innerHeight,d=l();nwindow.innerHeight-i&&window.scroll(d.x,d.y+(1-(window.innerHeight-n)/i)*(14/e)),twindow.innerWidth-o&&window.scroll(d.x+(1-(window.innerWidth-t)/o)*(14/e),d.y)}function l(){return{x:void 0!==window.scrollX?window.scrollX:window.pageXOffset,y:void 0!==window.scrollY?window.scrollY:window.pageYOffset}}return s&&(document.body.style.transition="transform 0.8s ease",document.body.style.OTransition="-o-transform 0.8s ease",document.body.style.msTransition="-ms-transform 0.8s ease",document.body.style.MozTransition="-moz-transform 0.8s ease",document.body.style.WebkitTransition="-webkit-transform 0.8s ease"),document.addEventListener("keyup",(function(t){1!==e&&27===t.keyCode&&o.out()})),document.addEventListener("mousemove",(function(o){1!==e&&(t=o.clientX,n=o.clientY)})),{to:function(t){if(1!==e)o.out();else{if(t.x=t.x||0,t.y=t.y||0,t.element){var n=t.element.getBoundingClientRect();t.x=n.left-20,t.y=n.top-20,t.width=n.width+40,t.height=n.height+40}void 0!==t.width&&void 0!==t.height&&(t.scale=Math.max(Math.min(window.innerWidth/t.width,window.innerHeight/t.height),1)),t.scale>1&&(t.x*=t.scale,t.y*=t.scale,r(t,t.scale),!1!==t.pan&&(i=setTimeout((function(){d=setInterval(m,1e3/60)}),800)))}},out:function(){clearTimeout(i),clearInterval(d),r({x:0,y:0},1),e=1},magnify:function(e){this.to(e)},reset:function(){this.out()},zoomLevel:function(){return e}}}();return function(){return e}})); 5 | -------------------------------------------------------------------------------- /_site/sitemap.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | https://art-from-code.netlify.app/index.html 5 | 2022-11-18T08:52:33.061Z 6 | 7 | 8 | https://art-from-code.netlify.app/day-1/session-1/index.html 9 | 2022-07-27T16:34:27.795Z 10 | 11 | 12 | https://art-from-code.netlify.app/day-1/session-2/index.html 13 | 2022-07-27T16:34:39.280Z 14 | 15 | 16 | https://art-from-code.netlify.app/day-1/session-3/index.html 17 | 2022-07-27T16:34:47.424Z 18 | 19 | 20 | https://art-from-code.netlify.app/day-1/session-4/index.html 21 | 2022-07-27T16:34:53.278Z 22 | 23 | 24 | https://art-from-code.netlify.app/day-2/session-1/index.html 25 | 2022-07-27T16:35:09.357Z 26 | 27 | 28 | https://art-from-code.netlify.app/day-2/session-2/index.html 29 | 2022-07-27T16:35:16.579Z 30 | 31 | 32 | https://art-from-code.netlify.app/day-2/session-3/index.html 33 | 2022-07-27T16:35:40.071Z 34 | 35 | 36 | https://art-from-code.netlify.app/day-2/session-4/index.html 37 | 2022-07-27T16:35:44.847Z 38 | 39 | 40 | https://art-from-code.netlify.app/slides/index.html 41 | 2022-11-18T08:53:15.893Z 42 | 43 | 44 | -------------------------------------------------------------------------------- /_site/slides/index_files/figure-revealjs/unnamed-chunk-6-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/slides/index_files/figure-revealjs/unnamed-chunk-6-1.png -------------------------------------------------------------------------------- /_site/slides/index_files/figure-revealjs/unnamed-chunk-6-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/_site/slides/index_files/figure-revealjs/unnamed-chunk-6-2.png -------------------------------------------------------------------------------- /_site/styles.css: -------------------------------------------------------------------------------- 1 | /* css styles */ 2 | 3 | .navbar-dark, .navbar-light, .navbar { 4 | background-color: #000000; 5 | } 6 | -------------------------------------------------------------------------------- /art-from-code.Rproj: -------------------------------------------------------------------------------- 1 | Version: 1.0 2 | 3 | RestoreWorkspace: Default 4 | SaveWorkspace: Default 5 | AlwaysSaveHistory: Default 6 | 7 | EnableCodeIndexing: Yes 8 | UseSpacesForTab: Yes 9 | NumSpacesForTab: 2 10 | Encoding: UTF-8 11 | 12 | RnwWeave: Sweave 13 | LaTeX: pdfLaTeX 14 | 15 | BuildType: Package 16 | PackageUseDevtools: Yes 17 | PackageInstallArgs: --no-multiarch --with-keep.source 18 | -------------------------------------------------------------------------------- /materials/README.md: -------------------------------------------------------------------------------- 1 | Add materials for your workshop in this folder. You can then remove this README, and rename this folder if you prefer. -------------------------------------------------------------------------------- /materials/barnsley-fern.R: -------------------------------------------------------------------------------- 1 | 2 | library(ggplot2) 3 | library(tibble) 4 | library(purrr) 5 | library(dplyr) 6 | 7 | fern_transform <- function(coord, ind) { 8 | 9 | # coefficients for the stem function f_1 10 | if(ind == 1) { 11 | mat <- matrix(c(0, 0, 0, .16), 2, 2) # matrix to multiply 12 | off <- c(0, 0) # offset vector to add 13 | } 14 | 15 | # coefficients for the small leaflet function f_2 16 | if(ind == 2) { 17 | mat <- matrix(c(.85, -.04, .04, .85), 2, 2) 18 | off <- c(0, 1.6) 19 | } 20 | # coefficients for the right-side function f_3 21 | if(ind == 3) { 22 | mat <- matrix(c(.2, .23, -.26, .22), 2, 2) 23 | off <- c(0, 1.6) 24 | } 25 | 26 | # coefficients for the left-side function f_4 27 | if(ind == 4) { 28 | mat <- matrix(c(-.15, .26, .28, .24), 2, 2) 29 | off <- c(0, .44) 30 | } 31 | 32 | # return the affine transformed coords 33 | coord <- mat %*% coord + off 34 | return(coord) 35 | } 36 | 37 | fern_chaos <- function(iterations = 10000, seed = NULL) { 38 | if(!is.null(seed)) set.seed(seed) 39 | 40 | # which transformation to apply at each iteration 41 | transform_index <- sample( 42 | x = 1:4, 43 | size = iterations, 44 | replace= TRUE, 45 | prob = c(.01, .85, .07, .07) 46 | ) 47 | 48 | # initialise chaos game at the origin 49 | start <- matrix(c(0, 0)) 50 | 51 | # helper function to collapse accumulated output 52 | bind_to_column_matrix <- function(lst) { 53 | do.call(cbind, lst) 54 | } 55 | 56 | # iterate until done! 57 | coord_matrix <- transform_index |> 58 | accumulate(fern_transform, .init = start) |> 59 | bind_to_column_matrix() 60 | 61 | # tidy the output, add extra columns, and return 62 | coord_df <- t(coord_matrix) |> 63 | as.data.frame() 64 | names(coord_df) <- c("x", "y") 65 | coord_df <- coord_df |> 66 | as_tibble() |> 67 | mutate( 68 | transform = c(0, transform_index), 69 | iteration = row_number() - 1 70 | ) 71 | return(coord_df) 72 | } 73 | 74 | fern_dat <- fern_chaos(seed = 1) 75 | 76 | pic <- ggplot(fern_dat, aes(x, y, colour = factor(transform))) + 77 | geom_point(size = 1, stroke = 0) + 78 | coord_equal() + 79 | theme_void() + 80 | guides(colour = guide_legend( 81 | title = "transformation", 82 | override.aes = list(size = 5)) 83 | ) 84 | 85 | plot(pic) -------------------------------------------------------------------------------- /materials/circle-scape.R: -------------------------------------------------------------------------------- 1 | library(rayshader) 2 | library(tibble) 3 | library(ambient) 4 | library(dplyr) 5 | library(ggplot2) 6 | library(ggthemes) 7 | library(tictoc) 8 | library(dplyr) 9 | 10 | is_within_circle <- function(x_coord, y_coord, x_center, y_center, radius) { 11 | (x_coord - x_center)^2 + (y_coord - y_center)^2 < radius^2 12 | } 13 | 14 | additive_circles <- function(n = 5, pixels = 1000, seed = NULL) { 15 | 16 | if(!is.null(seed)) set.seed(seed) 17 | 18 | # setup canvas 19 | art <- long_grid( 20 | x = seq(0, 1, length.out = pixels), 21 | y = seq(0, 1, length.out = pixels) 22 | ) 23 | art$paint <- 0 24 | 25 | for(i in 1:n) { 26 | 27 | # sample a random circle 28 | x_center <- runif(1, min = .3, max = .7) 29 | y_center <- runif(1, min = .3, max = .7) 30 | radius <- runif(1, min = .05, max = .25) 31 | 32 | # add +1 to all points inside the circle 33 | art <- art |> 34 | mutate( 35 | paint = paint + is_within_circle( 36 | x, y, x_center, y_center, radius 37 | ) 38 | ) 39 | } 40 | 41 | # normalise paint to [0, 1] range and return 42 | art$paint <- normalise(art$paint) 43 | return(art) 44 | } 45 | 46 | circle_art <- additive_circles(seed = 99) 47 | 48 | circle_array <- circle_art |> 49 | as.array(value = paint) 50 | 51 | circle_shadow <- ray_shade( 52 | heightmap = circle_array, 53 | sunaltitude = 15, 54 | sunangle = 135, 55 | zscale = .01, 56 | multicore = TRUE 57 | ) 58 | 59 | circle_scape <- circle_array |> 60 | height_shade() |> 61 | add_shadow( 62 | shadowmap = circle_shadow, 63 | max_darken = .1 64 | ) 65 | 66 | tic() 67 | plot_map(circle_scape, rotate = 270) 68 | toc() 69 | -------------------------------------------------------------------------------- /materials/curl-art-1.R: -------------------------------------------------------------------------------- 1 | library(dplyr) 2 | library(purrr) 3 | library(tibble) 4 | library(ggplot2) 5 | library(ggthemes) 6 | library(ambient) 7 | library(here) 8 | library(tictoc) 9 | 10 | curl_data <- function( 11 | data, 12 | iterations = 50, 13 | step_size = .001, 14 | ... 15 | ) { 16 | 17 | update <- function(current_state, iteration, ...) { 18 | curl <- curl_noise( 19 | x = current_state$x, 20 | y = current_state$y, 21 | generator = fracture, 22 | ... 23 | ) 24 | next_state <- current_state |> 25 | mutate( 26 | x = x + curl$x * step_size, 27 | y = y + curl$y * step_size, 28 | time = time + 1 29 | ) 30 | return(next_state) 31 | } 32 | 33 | data |> 34 | mutate(id = row_number(), time = 1) |> 35 | accumulate(1:iterations, update, .init = _, ...) |> 36 | bind_rows() 37 | } 38 | 39 | curl_art <- function(...) { 40 | curl_data(...) |> 41 | ggplot(aes(x, y, group = id)) + 42 | geom_path() + 43 | theme_void() + 44 | coord_equal() 45 | } 46 | 47 | smol_grid <- long_grid(x = 1:20, y = 1:20) 48 | 49 | pic <- smol_grid |> 50 | mutate(x = normalise(x), y = normalise(y)) |> 51 | curl_art(noise = gen_simplex, fractal = fbm, octaves = 4, freq_init = .5) 52 | 53 | tic() 54 | ggsave( 55 | filename = here("output", "curl-art-1.png"), 56 | plot = pic, 57 | width = 2000, 58 | height = 2000, 59 | units = "px", 60 | dpi = 300, 61 | bg = "white" 62 | ) 63 | toc() 64 | 65 | -------------------------------------------------------------------------------- /materials/curl-art-2.R: -------------------------------------------------------------------------------- 1 | library(dplyr) 2 | library(purrr) 3 | library(tibble) 4 | library(ggplot2) 5 | library(ggthemes) 6 | library(ambient) 7 | library(here) 8 | library(tictoc) 9 | 10 | curl_data <- function( 11 | data, 12 | iterations = 50, 13 | step_size = .001, 14 | ... 15 | ) { 16 | 17 | update <- function(current_state, iteration, ...) { 18 | curl <- curl_noise( 19 | x = current_state$x, 20 | y = current_state$y, 21 | generator = fracture, 22 | ... 23 | ) 24 | next_state <- current_state |> 25 | mutate( 26 | x = x + curl$x * step_size, 27 | y = y + curl$y * step_size, 28 | time = time + 1 29 | ) 30 | return(next_state) 31 | } 32 | 33 | data |> 34 | mutate(id = row_number(), time = 1) |> 35 | accumulate(1:iterations, update, .init = _, ...) |> 36 | bind_rows() 37 | } 38 | 39 | curl_art <- function(...) { 40 | curl_data(...) |> 41 | ggplot(aes(x, y, group = id)) + 42 | geom_path() + 43 | theme_void() + 44 | coord_equal() 45 | } 46 | 47 | custom_curl_data <- function(data) { 48 | curl_data( 49 | data = data, 50 | iterations = 80, 51 | octaves = 10, 52 | fractal = ridged, 53 | noise = gen_cubic, 54 | freq_init = 1, 55 | frequency = ~ . * 1.2, 56 | gain_init = 1, 57 | gain = ~ . * .9, 58 | seed = 1 59 | ) 60 | } 61 | 62 | circle <- function(n = 100) { 63 | tibble( 64 | theta = 2 * pi * (1:n) / n, 65 | x = cos(theta), 66 | y = sin(theta) 67 | ) 68 | } 69 | 70 | dat1 <- circle(5000) |> 71 | custom_curl_data() 72 | 73 | dat2 <- circle(5000) |> 74 | mutate(x = x * .99, y = y * .99) |> 75 | custom_curl_data() 76 | 77 | pic <- ggplot(mapping = aes(x, y, group = time)) + 78 | geom_polygon(data = dat1, fill = "#ffffff10") + 79 | geom_polygon(data = dat2, fill = "#22222205") + 80 | theme_void() + 81 | coord_equal() 82 | 83 | tic() 84 | ggsave( 85 | filename = here("output", "curl-art-2.png"), 86 | plot = pic, 87 | width = 2000, 88 | height = 2000, 89 | units = "px", 90 | dpi = 300, 91 | bg = "white" 92 | ) 93 | toc() 94 | -------------------------------------------------------------------------------- /materials/dplyr-ambient.R: -------------------------------------------------------------------------------- 1 | library(dplyr) 2 | library(purrr) 3 | library(tibble) 4 | library(ggplot2) 5 | library(ggthemes) 6 | library(ambient) 7 | library(here) 8 | 9 | sample_canva <- function(seed = NULL) { 10 | if(!is.null(seed)) set.seed(seed) 11 | sample(ggthemes::canva_palettes, 1)[[1]] 12 | } 13 | 14 | blank_canvas <- long_grid( 15 | x = seq(from = 0, to = 1, length.out = 2000), 16 | y = seq(from = 0, to = 1, length.out = 2000) 17 | ) 18 | 19 | plot_painted_canvas <- function(canvas, palette = NULL) { 20 | if(is.null(palette)) { 21 | palette <- c("#e5ddc8","#01949a","#004369","#db1f48") 22 | } 23 | canvas |> 24 | ggplot(aes(x, y, fill = paint)) + 25 | geom_raster(show.legend = FALSE) + 26 | theme_void() + 27 | coord_equal() + 28 | scale_x_continuous(expand = c(0, 0)) + 29 | scale_y_continuous(expand = c(0, 0)) + 30 | scale_fill_gradientn(colours = palette) 31 | } 32 | 33 | # your code here! add to the blank canvas :) 34 | blank_canvas 35 | 36 | 37 | -------------------------------------------------------------------------------- /materials/first-ambient-art.R: -------------------------------------------------------------------------------- 1 | library(dplyr) 2 | library(purrr) 3 | library(tibble) 4 | library(ggplot2) 5 | library(ggthemes) 6 | library(ambient) 7 | 8 | sample_canva <- function(seed = NULL) { 9 | if(!is.null(seed)) set.seed(seed) 10 | sample(ggthemes::canva_palettes, 1)[[1]] 11 | } 12 | 13 | x_coords <- seq(from = 0, to = 1, length.out = 800) 14 | y_coords <- seq(from = 0, to = 1, length.out = 800) 15 | canvas <- long_grid(x = x_coords, y = y_coords) 16 | 17 | freq_spatial <- 10 18 | seed_spatial <- 100 19 | seed_palette <- 101 20 | 21 | dat <- canvas |> 22 | mutate( 23 | paint = gen_perlin( 24 | x = x, 25 | y = y, 26 | frequency = freq_spatial, 27 | seed = seed_spatial 28 | ) 29 | ) 30 | 31 | pic <- dat |> 32 | ggplot(aes(x, y, fill = paint)) + 33 | geom_raster(show.legend = FALSE) + 34 | theme_void() + 35 | coord_equal() + 36 | scale_x_continuous(expand = c(0, 0)) + 37 | scale_y_continuous(expand = c(0, 0)) + 38 | scale_fill_gradientn( 39 | colours = sample_canva(seed_palette) 40 | ) 41 | 42 | plot(pic) 43 | -------------------------------------------------------------------------------- /materials/flametree-example.R: -------------------------------------------------------------------------------- 1 | library(dplyr) 2 | library(tibble) 3 | library(ggplot2) 4 | library(ggforce) 5 | library(flametree) 6 | 7 | tree <- flametree_grow( 8 | seed = 1, 9 | time = 9, 10 | angle = c(-15, 15, 30) 11 | ) 12 | 13 | leaf <- tree |> filter(id_leaf == TRUE) 14 | 15 | base <- ggplot() + 16 | scale_size_identity() + 17 | theme_void() + 18 | coord_equal() 19 | 20 | leaves <- geom_point( 21 | mapping = aes(coord_x, coord_y), 22 | data = leaf, 23 | size = 1.3, 24 | stroke = 0, 25 | colour = "#e38b75" 26 | ) 27 | 28 | trunk <- geom_bezier( 29 | mapping = aes(coord_x, coord_y, group = id_pathtree, size = seg_wid), 30 | data = tree, 31 | lineend = "round", 32 | colour = "#555555", 33 | show.legend = FALSE 34 | ) 35 | 36 | plot(base + trunk + leaves) 37 | -------------------------------------------------------------------------------- /materials/fractal-art.R: -------------------------------------------------------------------------------- 1 | library(dplyr) 2 | library(purrr) 3 | library(tibble) 4 | library(ggplot2) 5 | library(ggthemes) 6 | library(ambient) 7 | library(here) 8 | 9 | sample_canva <- function(seed = NULL) { 10 | if(!is.null(seed)) set.seed(seed) 11 | sample(ggthemes::canva_palettes, 1)[[1]] 12 | } 13 | 14 | blank_canvas <- long_grid( 15 | x = seq(from = 0, to = 1, length.out = 2000), 16 | y = seq(from = 0, to = 1, length.out = 2000) 17 | ) 18 | 19 | plot_painted_canvas <- function(canvas, palette = NULL) { 20 | if(is.null(palette)) { 21 | palette <- c("#e5ddc8","#01949a","#004369","#db1f48") 22 | } 23 | canvas |> 24 | ggplot(aes(x, y, fill = paint)) + 25 | geom_raster(show.legend = FALSE) + 26 | theme_void() + 27 | coord_equal() + 28 | scale_x_continuous(expand = c(0, 0)) + 29 | scale_y_continuous(expand = c(0, 0)) + 30 | scale_fill_gradientn(colours = palette) 31 | } 32 | 33 | fractal_art <- function(fractal, generator, palette = NULL, ...) { 34 | blank_canvas |> 35 | mutate( 36 | paint = fracture( 37 | noise = generator, 38 | fractal = fractal, 39 | x = x, 40 | y = y, 41 | ... 42 | ) 43 | ) |> 44 | plot_painted_canvas(palette = palette) 45 | } 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /materials/ggfx-blend.R: -------------------------------------------------------------------------------- 1 | library(dplyr) 2 | library(tibble) 3 | library(ggplot2) 4 | library(ggforce) 5 | library(flametree) 6 | library(ggfx) 7 | 8 | tree <- flametree_grow( 9 | seed = 1, 10 | time = 9, 11 | angle = c(-15, 15, 30) 12 | ) 13 | 14 | leaf <- tree |> filter(id_leaf == TRUE) 15 | 16 | leaves <- geom_point( 17 | data = leaf, 18 | mapping = aes(coord_x, coord_y, colour = seg_col), 19 | colour = "white", 20 | size = 2, 21 | stroke = 0 22 | ) 23 | 24 | trunk <- geom_bezier( 25 | data = tree, 26 | mapping = aes( 27 | x = coord_x, 28 | y = coord_y, 29 | size = seg_wid, 30 | group = id_pathtree 31 | ), 32 | colour = "white", 33 | lineend = "round" 34 | ) 35 | 36 | polygon_layer <- function(x, y, fill = "white", alpha = .5) { 37 | geom_polygon(aes(x, y), fill = fill, alpha = alpha) 38 | } 39 | 40 | triangle <- polygon_layer( 41 | x = c(-4, 2, 2), 42 | y = c(0, 0, 6), 43 | fill = "white", 44 | alpha = 1 45 | ) 46 | 47 | base <- ggplot() + 48 | theme_void() + 49 | theme(panel.background = element_rect( 50 | fill = "black", colour = "black" 51 | )) + 52 | coord_equal(xlim = c(-3, 1), ylim = c(1, 5)) + 53 | scale_x_continuous(expand = c(0, 0)) + 54 | scale_y_continuous(expand = c(0, 0)) + 55 | scale_size_identity(guide = guide_none()) 56 | 57 | plot( 58 | base + 59 | as_group(trunk, leaves, id = "tree") + 60 | with_blend(triangle, "tree", blend_type = "xor") 61 | ) 62 | -------------------------------------------------------------------------------- /materials/ggfx-displace.R: -------------------------------------------------------------------------------- 1 | 2 | library(ggplot2) 3 | library(ggfx) 4 | 5 | polygon_layer <- function(x, y, fill = "white", alpha = .5) { 6 | geom_polygon(aes(x, y), fill = fill, alpha = alpha) 7 | } 8 | poly1 <- polygon_layer(x = c(1, 0, 0), y = c(0, 0, 1)) 9 | poly2 <- polygon_layer(x = c(0, 1, 1), y = c(0, 0, 1)) 10 | poly3 <- polygon_layer(x = c(.3, 1, 1), y = c(0, 0, .7)) 11 | poly4 <- polygon_layer(x = c(0, 0, .7), y = c(.3, 1, 1)) 12 | 13 | base <- ggplot() + 14 | coord_equal(xlim = c(0, 1), ylim = c(0, 1)) + 15 | theme_void() + 16 | theme(panel.background = element_rect(fill = "#333333")) 17 | 18 | text <- geom_text( 19 | mapping = aes(0.5, 0.5, label = "ART"), 20 | size = 60, 21 | colour = "black", 22 | fontface = "bold" 23 | ) 24 | 25 | plot( 26 | base + 27 | as_group(poly1, poly2, poly3, poly4, id = "polygons", include = TRUE) + 28 | as_reference("polygons", id = "displacement_map") + 29 | with_displacement( 30 | text, 31 | x_map = ch_alpha("displacement_map"), 32 | y_map = ch_alpha("displacement_map"), 33 | x_scale = 150, 34 | y_scale = -150 35 | ) 36 | ) 37 | -------------------------------------------------------------------------------- /materials/ggfx-dither.R: -------------------------------------------------------------------------------- 1 | library(dplyr) 2 | library(tibble) 3 | library(ggplot2) 4 | library(ggfx) 5 | 6 | set.seed(1) 7 | polar <- tibble( 8 | arc_start = runif(200), 9 | arc_end = arc_start + runif(200, min = -.2, max = .2), 10 | radius = runif(200), 11 | shade = runif(200), 12 | size = runif(200) 13 | ) 14 | 15 | base <- ggplot( 16 | data = polar, 17 | mapping = aes( 18 | x = arc_start, 19 | y = radius, 20 | xend = arc_end, 21 | yend = radius, 22 | colour = shade, 23 | size = size 24 | ) 25 | ) + 26 | coord_polar(clip = "off") + 27 | scale_y_continuous(limits = c(0, 1), oob = scales::oob_keep) + 28 | scale_x_continuous(limits = c(0, 1), oob = scales::oob_keep) + 29 | scale_colour_viridis_c(option = "magma") + 30 | guides(colour = guide_none(), size = guide_none()) + 31 | scale_size(range = c(0, 10)) + 32 | theme_void() + 33 | theme(panel.background = element_rect(fill = "#aaaaaa")) 34 | 35 | plot(base + with_halftone_dither(geom_segment())) 36 | -------------------------------------------------------------------------------- /materials/ggfx-glow.R: -------------------------------------------------------------------------------- 1 | library(dplyr) 2 | library(tibble) 3 | library(ggplot2) 4 | library(ggforce) 5 | library(flametree) 6 | library(ggfx) 7 | 8 | tree <- flametree_grow( 9 | seed = 1, 10 | time = 9, 11 | angle = c(-15, 15, 30) 12 | ) 13 | 14 | leaf <- tree |> filter(id_leaf == TRUE) 15 | 16 | base <- ggplot() + 17 | scale_size_identity() + 18 | theme_void() + 19 | coord_equal() 20 | 21 | leaves <- geom_point( 22 | mapping = aes(coord_x, coord_y), 23 | data = leaf, 24 | size = 1.3, 25 | stroke = 0, 26 | colour = "#e38b75" 27 | ) 28 | 29 | trunk <- geom_bezier( 30 | mapping = aes(coord_x, coord_y, group = id_pathtree, size = seg_wid), 31 | data = tree, 32 | lineend = "round", 33 | colour = "#555555", 34 | show.legend = FALSE 35 | ) 36 | 37 | plot( 38 | base + 39 | trunk + 40 | with_outer_glow(leaves, colour = "#555555", sigma = 5, expand = 3) 41 | ) 42 | -------------------------------------------------------------------------------- /materials/ggfx-mask.R: -------------------------------------------------------------------------------- 1 | 2 | library(dplyr) 3 | library(tibble) 4 | library(ggplot2) 5 | library(ggfx) 6 | library(ambient) 7 | 8 | texture <- geom_raster( 9 | mapping = aes(x, y, fill = paint), 10 | data = long_grid( 11 | x = seq(from = -1, to = 1, length.out = 1000), 12 | y = seq(from = -1, to = 1, length.out = 1000) 13 | ) |> 14 | mutate( 15 | lf_noise = gen_simplex(x, y, frequency = 2, seed = 1234), 16 | mf_noise = gen_simplex(x, y, frequency = 20, seed = 1234), 17 | hf_noise = gen_simplex(x, y, frequency = 99, seed = 1234), 18 | paint = lf_noise + mf_noise + hf_noise 19 | ) 20 | ) 21 | 22 | hex <- tibble(x = sin((0:6)/6 * 2 * pi), y = cos((0:6)/6 * 2 * pi)) 23 | mask <- geom_polygon(aes(x, y), hex, fill = "white") 24 | 25 | base <- ggplot() + 26 | theme_void() + 27 | coord_equal() + 28 | scale_x_continuous(expand = c(0, 0)) + 29 | scale_y_continuous(expand = c(0, 0)) + 30 | scale_fill_gradientn( 31 | colours = c("#222222","#e83e8c"), 32 | guide = guide_none() 33 | ) 34 | 35 | border <- geom_path(aes(x, y), hex, colour = "white", size = 15) 36 | 37 | text <- geom_text( 38 | mapping = aes(x, y, label = text), 39 | dat = tibble(x = 0, y = 0, text = "ART"), 40 | size = 36, 41 | colour = "white", 42 | fontface = "bold" 43 | ) 44 | 45 | plot( 46 | base + 47 | as_group(texture, text, border, id = "content") + 48 | as_reference(mask, id = "mask") + 49 | with_mask("content", "mask") 50 | ) -------------------------------------------------------------------------------- /materials/grow-multipolygon.R: -------------------------------------------------------------------------------- 1 | library(dplyr) 2 | library(purrr) 3 | library(tidyr) 4 | library(tibble) 5 | library(ggplot2) 6 | library(ambient) 7 | library(tictoc) 8 | library(ggthemes) 9 | library(gifski) 10 | 11 | square <- tibble( 12 | x = c(0, 1, 1, 0, 0), 13 | y = c(0, 0, 1, 1, 0), 14 | seg_len = c(1, 1, 1, 1, 0) 15 | ) 16 | 17 | show_polygon <- function(polygon, show_vertices = TRUE, colour = "black", ...) { 18 | 19 | pic <- ggplot(polygon, aes(x, y)) + 20 | geom_polygon(fill = NA, colour = colour, show.legend = FALSE, ...) + 21 | coord_equal() + 22 | theme_void() 23 | 24 | if(show_vertices == TRUE) { 25 | pic <- pic + geom_point(size = 2, colour = colour) 26 | } 27 | return(pic) 28 | } 29 | 30 | sample_edge <- function(polygon) { 31 | sample(nrow(polygon), 1, prob = polygon$seg_len) 32 | } 33 | 34 | edge_length <- function(x1, y1, x2, y2) { 35 | sqrt((x1 - x2)^2 + (y1 - y2)^2) 36 | } 37 | 38 | edge_noise <- function(size) { 39 | runif(1, min = -size/2, max = size/2) 40 | } 41 | 42 | insert_edge <- function(polygon, noise) { 43 | 44 | # sample and edge and remember its length 45 | ind <- sample_edge(polygon) 46 | len <- polygon$seg_len[ind] 47 | 48 | # one endpoint of the old edge 49 | last_x <- polygon$x[ind] 50 | last_y <- polygon$y[ind] 51 | 52 | # the other endpoint of the old edge 53 | next_x <- polygon$x[ind + 1] 54 | next_y <- polygon$y[ind + 1] 55 | 56 | # location of the new point to be inserted: noise 57 | # is scaled proportional to the length of the old edge 58 | new_x <- (last_x + next_x) / 2 + edge_noise(len * noise) 59 | new_y <- (last_y + next_y) / 2 + edge_noise(len * noise) 60 | 61 | # the new row for insertion into the tibble, 62 | # containing coords and length of the 'new' edge 63 | new_row <- tibble( 64 | x = new_x, 65 | y = new_y, 66 | seg_len = edge_length(new_x, new_y, next_x, next_y) 67 | ) 68 | 69 | # update the length of the 'old' edge 70 | polygon$seg_len[ind] <- edge_length( 71 | last_x, last_y, new_x, new_y 72 | ) 73 | 74 | # insert a row into the tibble 75 | bind_rows( 76 | polygon[1:ind, ], 77 | new_row, 78 | polygon[-(1:ind), ] 79 | ) 80 | } 81 | 82 | grow_polygon <- function(polygon, iterations, noise, seed = NULL) { 83 | if(!is.null(seed)) set.seed(seed) 84 | for(i in 1:iterations) polygon <- insert_edge(polygon, noise) 85 | return(polygon) 86 | } 87 | 88 | grow_multipolygon <- function(base_shape, n, seed = NULL, ...) { 89 | if(!is.null(seed)) set.seed(seed) 90 | polygons <- list() 91 | for(i in 1:n) { 92 | polygons[[i]] <- grow_polygon(base_shape, ...) 93 | } 94 | polygons <- bind_rows(polygons, .id = "id") 95 | polygons 96 | } 97 | 98 | show_multipolygon <- function(polygon, fill, alpha = .02, ...) { 99 | ggplot(polygon, aes(x, y, group = id)) + 100 | geom_polygon(colour = NA, alpha = alpha, fill = fill, ...) + 101 | coord_equal() + 102 | theme_void() 103 | } 104 | 105 | # simplified version of the one in the workshop 106 | tic() 107 | dat <- square |> 108 | grow_polygon(iterations = 100, noise = .5, seed = 2) |> 109 | grow_multipolygon(n = 10, iterations = 300, noise = 1, seed = 2) 110 | pic <- show_multipolygon(dat, fill = "#d43790", alpha = .2) 111 | plot(pic) 112 | toc() 113 | -------------------------------------------------------------------------------- /materials/grow-polygon.R: -------------------------------------------------------------------------------- 1 | library(dplyr) 2 | library(purrr) 3 | library(tidyr) 4 | library(tibble) 5 | library(ggplot2) 6 | library(ambient) 7 | library(tictoc) 8 | library(ggthemes) 9 | library(gifski) 10 | 11 | square <- tibble( 12 | x = c(0, 1, 1, 0, 0), 13 | y = c(0, 0, 1, 1, 0), 14 | seg_len = c(1, 1, 1, 1, 0) 15 | ) 16 | 17 | show_polygon <- function(polygon, show_vertices = TRUE, colour = "black", ...) { 18 | 19 | pic <- ggplot(polygon, aes(x, y)) + 20 | geom_polygon(fill = NA, colour = colour, show.legend = FALSE, ...) + 21 | coord_equal() + 22 | theme_void() 23 | 24 | if(show_vertices == TRUE) { 25 | pic <- pic + geom_point(size = 2, colour = colour) 26 | } 27 | return(pic) 28 | } 29 | 30 | sample_edge <- function(polygon) { 31 | sample(nrow(polygon), 1, prob = polygon$seg_len) 32 | } 33 | 34 | edge_length <- function(x1, y1, x2, y2) { 35 | sqrt((x1 - x2)^2 + (y1 - y2)^2) 36 | } 37 | 38 | edge_noise <- function(size) { 39 | runif(1, min = -size/2, max = size/2) 40 | } 41 | 42 | insert_edge <- function(polygon, noise) { 43 | 44 | # sample and edge and remember its length 45 | ind <- sample_edge(polygon) 46 | len <- polygon$seg_len[ind] 47 | 48 | # one endpoint of the old edge 49 | last_x <- polygon$x[ind] 50 | last_y <- polygon$y[ind] 51 | 52 | # the other endpoint of the old edge 53 | next_x <- polygon$x[ind + 1] 54 | next_y <- polygon$y[ind + 1] 55 | 56 | # location of the new point to be inserted: noise 57 | # is scaled proportional to the length of the old edge 58 | new_x <- (last_x + next_x) / 2 + edge_noise(len * noise) 59 | new_y <- (last_y + next_y) / 2 + edge_noise(len * noise) 60 | 61 | # the new row for insertion into the tibble, 62 | # containing coords and length of the 'new' edge 63 | new_row <- tibble( 64 | x = new_x, 65 | y = new_y, 66 | seg_len = edge_length(new_x, new_y, next_x, next_y) 67 | ) 68 | 69 | # update the length of the 'old' edge 70 | polygon$seg_len[ind] <- edge_length( 71 | last_x, last_y, new_x, new_y 72 | ) 73 | 74 | # insert a row into the tibble 75 | bind_rows( 76 | polygon[1:ind, ], 77 | new_row, 78 | polygon[-(1:ind), ] 79 | ) 80 | } 81 | 82 | grow_polygon <- function(polygon, iterations, noise, seed = NULL) { 83 | if(!is.null(seed)) set.seed(seed) 84 | for(i in 1:iterations) polygon <- insert_edge(polygon, noise) 85 | return(polygon) 86 | } 87 | 88 | 89 | 90 | # modify this code 91 | pic <- square |> 92 | grow_polygon(iterations = 1000, noise = .5, seed = 2) |> 93 | show_polygon(show_vertices = FALSE) 94 | 95 | plot(pic) 96 | 97 | 98 | 99 | -------------------------------------------------------------------------------- /materials/icescape-3d.R: -------------------------------------------------------------------------------- 1 | 2 | library(rayshader) 3 | library(tibble) 4 | library(ambient) 5 | library(dplyr) 6 | library(ggplot2) 7 | library(ggthemes) 8 | library(dplyr) 9 | library(tictoc) 10 | library(here) 11 | 12 | sample_canva2 <- function(seed = NULL, n = 4) { 13 | 14 | if(!is.null(seed)) set.seed(seed) 15 | sample(ggthemes::canva_palettes, 1)[[1]] |> 16 | (\(x) colorRampPalette(x)(n))() 17 | } 18 | 19 | transform_to_curl_space <- function(x, y, frequency = 1, octaves = 10) { 20 | curl_noise( 21 | generator = fracture, 22 | noise = gen_simplex, 23 | fractal = fbm, 24 | octaves = octaves, 25 | frequency = frequency, 26 | x = x, 27 | y = y 28 | ) 29 | } 30 | 31 | 32 | define_worley_cells <- function(x, y, frequency = 3, octaves = 6) { 33 | fracture( 34 | noise = gen_worley, 35 | fractal = billow, 36 | octaves = octaves, 37 | frequency = frequency, 38 | value = "cell", 39 | x = x, 40 | y = y 41 | ) |> 42 | rank() |> 43 | normalise() 44 | } 45 | 46 | 47 | simplex_noise <- function(x, y, frequency = .1, octaves = 10) { 48 | fracture( 49 | noise = gen_simplex, 50 | fractal = ridged, 51 | octaves = octaves, 52 | frequency = frequency, 53 | x = x, 54 | y = y 55 | ) |> 56 | normalise() 57 | } 58 | 59 | 60 | ice_floe <- function(seed) { 61 | 62 | set.seed(seed) 63 | 64 | grid <- long_grid( 65 | x = seq(0, 1, length.out = 2000), 66 | y = seq(0, 1, length.out = 2000) 67 | ) 68 | 69 | coords <- transform_to_curl_space(grid$x, grid$y) 70 | 71 | grid |> 72 | mutate( 73 | cells = define_worley_cells(coords$x, coords$y), 74 | paint = simplex_noise(x + cells, y + cells), 75 | paint = normalise(paint) 76 | ) |> 77 | as.array(value = paint) 78 | } 79 | 80 | icescape_3d <- function(seed) { 81 | 82 | ice_height <- matrix(0, 2500, 2500) 83 | ice_height[251:2250, 251:2250] <- ice_floe(seed) 84 | 85 | ice_scape <- height_shade( 86 | heightmap = ice_height, 87 | texture = sample_canva2(seed, 256) 88 | ) |> 89 | add_shadow( 90 | shadowmap = ray_shade( 91 | heightmap = ice_height, 92 | sunaltitude = 30, 93 | sunangle = 90, 94 | multicore = TRUE, 95 | zscale = .005 96 | ), 97 | max_darken = .05 98 | ) 99 | 100 | plot_3d( 101 | hillshade = ice_scape, 102 | heightmap = ice_height, 103 | theta = 45, 104 | phi = 30, 105 | zoom = .75, 106 | zscale = .001, 107 | background = "#222222", 108 | shadow = FALSE, 109 | soliddepth = .5, 110 | solidcolor = "#222222", 111 | windowsize = c(2500, 1500) 112 | ) 113 | 114 | render_snapshot( 115 | filename = here("output", paste0("icescape_3d_", seed, ".png")), 116 | clear = TRUE 117 | ) 118 | } 119 | 120 | tic() 121 | icescape_3d(123) 122 | toc() 123 | 124 | -------------------------------------------------------------------------------- /materials/make-noise-art.R: -------------------------------------------------------------------------------- 1 | library(dplyr) 2 | library(purrr) 3 | library(tibble) 4 | library(ggplot2) 5 | library(ggthemes) 6 | library(ambient) 7 | library(here) 8 | 9 | sample_canva <- function(seed = NULL) { 10 | if(!is.null(seed)) set.seed(seed) 11 | sample(ggthemes::canva_palettes, 1)[[1]] 12 | } 13 | 14 | make_noise_art <- function( 15 | generator = gen_perlin, 16 | frequency = 10, 17 | seed = 1234, 18 | pixels = 2000, 19 | palette = c("#e5ddc8", "#01949a", "#004369", "#db1f48"), 20 | ... 21 | ) { 22 | 23 | # define the grid 24 | canvas <- long_grid( 25 | x = seq(from = 0, to = 1, length.out = pixels), 26 | y = seq(from = 0, to = 1, length.out = pixels) 27 | ) 28 | 29 | # use the generator to add paint 30 | canvas <- canvas |> 31 | mutate( 32 | paint = generator( 33 | x, y, 34 | frequency = frequency, 35 | seed = seed, 36 | ... 37 | ) 38 | ) 39 | 40 | # use ggplot2 to draw the picture 41 | art <- canvas |> 42 | ggplot(aes(x, y, fill = paint)) + 43 | geom_raster(show.legend = FALSE) + 44 | theme_void() + 45 | coord_equal() + 46 | scale_x_continuous(expand = c(0, 0)) + 47 | scale_y_continuous(expand = c(0, 0)) + 48 | scale_fill_gradientn(colours = palette) 49 | 50 | return(art) 51 | } 52 | 53 | # call make_noise_art with idiosyncratic parameters 54 | art <- make_noise_art( 55 | generator = gen_worley, 56 | seed = 1000, 57 | palette = sample_canva(100), 58 | value = "distance", 59 | pixels = 1000 60 | ) 61 | 62 | # save the plot to file with a generic file name 63 | ggsave( 64 | filename = here("output", "noise-art.png"), 65 | plot = art, 66 | width = 1000, 67 | height = 1000, 68 | units = "px", 69 | dpi = 300 70 | ) 71 | 72 | -------------------------------------------------------------------------------- /materials/palette-generators.R: -------------------------------------------------------------------------------- 1 | library(ggthemes) 2 | 3 | # the original function from the first session 4 | sample_canva <- function(seed = NULL) { 5 | if(!is.null(seed)) set.seed(seed) 6 | sample(ggthemes::canva_palettes, 1)[[1]] 7 | } 8 | 9 | # the extended function used in later sessions 10 | sample_canva2 <- function(seed = NULL, n = 4) { 11 | if(!is.null(seed)) set.seed(seed) 12 | sample(ggthemes::canva_palettes, 1)[[1]] |> 13 | (\(x) colorRampPalette(x)(n))() 14 | } 15 | -------------------------------------------------------------------------------- /materials/perlin-blob.R: -------------------------------------------------------------------------------- 1 | library(dplyr) 2 | library(purrr) 3 | library(tidyr) 4 | library(tibble) 5 | library(ggplot2) 6 | library(ambient) 7 | library(tictoc) 8 | library(ggthemes) 9 | library(gifski) 10 | 11 | show_polygon <- function(polygon, show_vertices = TRUE, ...) { 12 | 13 | pic <- ggplot(polygon, aes(x, y)) + 14 | geom_polygon(colour = "black", fill = NA, show.legend = FALSE, ...) + 15 | coord_equal() + 16 | theme_void() 17 | 18 | if(show_vertices == TRUE) { 19 | pic <- pic + geom_point(colour = "black", size = 2) 20 | } 21 | return(pic) 22 | } 23 | 24 | normalise_radius <- function(x, min, max) { 25 | normalise(x, from = c(-0.5, 0.5), to = c(min, max)) 26 | } 27 | 28 | perlin_blob <- function(n = 100, 29 | freq_init = 0.3, 30 | octaves = 2, 31 | r_min = 0.5, 32 | r_max = 1) { 33 | tibble( 34 | angle = seq(0, 2*pi, length.out = n), 35 | x_base = cos(angle), 36 | y_base = sin(angle), 37 | radius = fracture( 38 | x = x_base, 39 | y = y_base, 40 | freq_init = freq_init, 41 | noise = gen_perlin, 42 | fractal = fbm, 43 | octaves = octaves 44 | ) |> 45 | normalise_radius(r_min, r_max), 46 | x = radius * x_base, 47 | y = radius * y_base 48 | ) 49 | } 50 | 51 | set.seed(3); 52 | pic <- perlin_blob(freq_init = .4) |> show_polygon(FALSE) 53 | plot(pic) -------------------------------------------------------------------------------- /materials/perlin-heart-grid-2.R: -------------------------------------------------------------------------------- 1 | library(dplyr) 2 | library(purrr) 3 | library(tidyr) 4 | library(tibble) 5 | library(ggplot2) 6 | library(ambient) 7 | library(tictoc) 8 | library(ggthemes) 9 | library(gifski) 10 | 11 | sample_canva <- function(seed = NULL) { 12 | if(!is.null(seed)) set.seed(seed) 13 | sample(ggthemes::canva_palettes, 1)[[1]] 14 | } 15 | 16 | show_polygon <- function(polygon, show_vertices = TRUE, ...) { 17 | 18 | pic <- ggplot(polygon, aes(x, y)) + 19 | geom_polygon(colour = "black", fill = NA, show.legend = FALSE, ...) + 20 | coord_equal() + 21 | theme_void() 22 | 23 | if(show_vertices == TRUE) { 24 | pic <- pic + geom_point(colour = "black", size = 2) 25 | } 26 | return(pic) 27 | } 28 | 29 | heart_x <- function(angle) { 30 | x <- (16 * sin(angle) ^ 3) / 17 31 | return(x - mean(x)) 32 | } 33 | 34 | heart_y <- function(angle) { 35 | y <- (13 * cos(angle) - 5 * cos(2 * angle) - 2 * cos(3 * angle) - 36 | cos(4 * angle)) / 17 37 | return(y - mean(y)) 38 | } 39 | 40 | normalise_radius <- function(x, min, max) { 41 | normalise(x, from = c(-0.5, 0.5), to = c(min, max)) 42 | } 43 | 44 | perlin_heart2 <- function(n = 100, 45 | freq_init = 0.3, 46 | octaves = 2, 47 | r_min = 0.5, 48 | r_max = 1, 49 | w_min = 0, 50 | w_max = 4, 51 | rot = 0, 52 | x_shift = 0, 53 | y_shift = 0, 54 | id = NA, 55 | seed = NULL) { 56 | if(!is.null(seed)) set.seed(seed) 57 | tibble( 58 | angle = seq(0, 2*pi, length.out = n), 59 | 60 | radius = fracture( 61 | x = cos(angle), 62 | y = sin(angle), 63 | freq_init = freq_init, 64 | noise = gen_perlin, 65 | fractal = fbm, 66 | octaves = octaves 67 | ) |> 68 | normalise_radius(r_min, r_max), 69 | 70 | x = radius * heart_x(angle) + x_shift, 71 | y = radius * heart_y(angle) + y_shift, 72 | 73 | width = fracture( 74 | x = cos(angle + rot), 75 | y = sin(angle + rot), 76 | freq_init = freq_init, 77 | noise = gen_perlin, 78 | fractal = fbm, 79 | octaves = octaves 80 | ) |> 81 | normalise(to = c(w_min, w_max)), 82 | 83 | id = id 84 | ) 85 | } 86 | 87 | perlin_heart_grid2 <- function(nx = 4, ny = 2, seed = NULL) { 88 | if(!is.null(seed)) set.seed(seed) 89 | 90 | heart_settings <- expand_grid( 91 | r_min = .3, 92 | r_max = .4, 93 | w_min = .01, 94 | w_max = 6, 95 | x_shift = 1:nx, 96 | y_shift = 1:ny 97 | ) |> 98 | mutate( 99 | n = 200, 100 | x_shift = x_shift + runif(n(), -.1, .1), 101 | y_shift = y_shift + runif(n(), -.1, .1), 102 | rot = runif(n(), -.1, .1), 103 | id = row_number() 104 | ) 105 | 106 | heart_data <- pmap_dfr(heart_settings, perlin_heart2) 107 | 108 | heart_data |> 109 | ggplot(aes(x, y, group = id, colour = sample(id), size = width)) + 110 | geom_path(show.legend = FALSE) + 111 | theme_void() + 112 | scale_size_identity() + 113 | scale_colour_gradientn(colours = sample_canva(seed)) + 114 | scale_x_continuous(expand = c(0, 0)) + 115 | scale_y_continuous(expand = c(0, 0)) + 116 | coord_fixed(xlim = c(0, nx + 1), ylim = c(0, ny + 1)) 117 | } 118 | 119 | pic <- perlin_heart_grid2(seed = 666) 120 | plot(pic) -------------------------------------------------------------------------------- /materials/perlin-heart-grid.R: -------------------------------------------------------------------------------- 1 | library(dplyr) 2 | library(purrr) 3 | library(tidyr) 4 | library(tibble) 5 | library(ggplot2) 6 | library(ambient) 7 | library(tictoc) 8 | library(ggthemes) 9 | library(gifski) 10 | 11 | sample_canva <- function(seed = NULL) { 12 | if(!is.null(seed)) set.seed(seed) 13 | sample(ggthemes::canva_palettes, 1)[[1]] 14 | } 15 | 16 | show_polygon <- function(polygon, show_vertices = TRUE, ...) { 17 | 18 | pic <- ggplot(polygon, aes(x, y)) + 19 | geom_polygon(colour = "black", fill = NA, show.legend = FALSE, ...) + 20 | coord_equal() + 21 | theme_void() 22 | 23 | if(show_vertices == TRUE) { 24 | pic <- pic + geom_point(colour = "black", size = 2) 25 | } 26 | return(pic) 27 | } 28 | 29 | heart_x <- function(angle) { 30 | x <- (16 * sin(angle) ^ 3) / 17 31 | return(x - mean(x)) 32 | } 33 | 34 | heart_y <- function(angle) { 35 | y <- (13 * cos(angle) - 5 * cos(2 * angle) - 2 * cos(3 * angle) - 36 | cos(4 * angle)) / 17 37 | return(y - mean(y)) 38 | } 39 | 40 | normalise_radius <- function(x, min, max) { 41 | normalise(x, from = c(-0.5, 0.5), to = c(min, max)) 42 | } 43 | 44 | perlin_heart <- function(n = 100, 45 | freq_init = 0.3, 46 | octaves = 2, 47 | r_min = 0.5, 48 | r_max = 1, 49 | x_shift = 0, 50 | y_shift = 0, 51 | id = NA, 52 | seed = NULL) { 53 | if(!is.null(seed)) set.seed(seed) 54 | tibble( 55 | angle = seq(0, 2*pi, length.out = n), 56 | x_base = cos(angle), 57 | y_base = sin(angle), 58 | radius = fracture( 59 | x = x_base, 60 | y = y_base, 61 | freq_init = freq_init, 62 | noise = gen_perlin, 63 | fractal = fbm, 64 | octaves = octaves 65 | ) |> 66 | normalise_radius(r_min, r_max), 67 | x = radius * heart_x(angle) + x_shift, 68 | y = radius * heart_y(angle) + y_shift, 69 | id = id 70 | ) 71 | } 72 | 73 | perlin_heart_grid <- function(nx = 10, ny = 6, seed = NULL) { 74 | if(!is.null(seed)) set.seed(seed) 75 | 76 | heart_settings <- expand_grid( 77 | r_min = .3, 78 | r_max = .4, 79 | x_shift = 1:nx, 80 | y_shift = 1:ny 81 | ) |> 82 | mutate(id = row_number()) 83 | 84 | heart_data <- pmap_dfr(heart_settings, perlin_heart) 85 | 86 | heart_data |> 87 | ggplot(aes(x, y, group = id, fill = sample(id))) + 88 | geom_polygon(size = 0, show.legend = FALSE) + 89 | theme_void() + 90 | scale_fill_gradientn(colours = sample_canva(seed)) + 91 | coord_equal(xlim = c(0, nx + 1), ylim = c(0, ny + 1)) 92 | } 93 | 94 | pic <- perlin_heart_grid(seed = 451) 95 | plot(pic) -------------------------------------------------------------------------------- /materials/perlin-heart.R: -------------------------------------------------------------------------------- 1 | library(dplyr) 2 | library(purrr) 3 | library(tidyr) 4 | library(tibble) 5 | library(ggplot2) 6 | library(ambient) 7 | library(tictoc) 8 | library(ggthemes) 9 | library(gifski) 10 | 11 | show_polygon <- function(polygon, show_vertices = TRUE, ...) { 12 | 13 | pic <- ggplot(polygon, aes(x, y)) + 14 | geom_polygon(colour = "black", fill = NA, show.legend = FALSE, ...) + 15 | coord_equal() + 16 | theme_void() 17 | 18 | if(show_vertices == TRUE) { 19 | pic <- pic + geom_point(colour = "black", size = 2) 20 | } 21 | return(pic) 22 | } 23 | 24 | heart_x <- function(angle) { 25 | x <- (16 * sin(angle) ^ 3) / 17 26 | return(x - mean(x)) 27 | } 28 | 29 | heart_y <- function(angle) { 30 | y <- (13 * cos(angle) - 5 * cos(2 * angle) - 2 * cos(3 * angle) - 31 | cos(4 * angle)) / 17 32 | return(y - mean(y)) 33 | } 34 | 35 | normalise_radius <- function(x, min, max) { 36 | normalise(x, from = c(-0.5, 0.5), to = c(min, max)) 37 | } 38 | 39 | perlin_heart <- function(n = 100, 40 | freq_init = 0.3, 41 | octaves = 2, 42 | r_min = 0.5, 43 | r_max = 1, 44 | x_shift = 0, 45 | y_shift = 0, 46 | id = NA, 47 | seed = NULL) { 48 | if(!is.null(seed)) set.seed(seed) 49 | tibble( 50 | angle = seq(0, 2*pi, length.out = n), 51 | x_base = cos(angle), 52 | y_base = sin(angle), 53 | radius = fracture( 54 | x = x_base, 55 | y = y_base, 56 | freq_init = freq_init, 57 | noise = gen_perlin, 58 | fractal = fbm, 59 | octaves = octaves 60 | ) |> 61 | normalise_radius(r_min, r_max), 62 | x = radius * heart_x(angle) + x_shift, 63 | y = radius * heart_y(angle) + y_shift, 64 | id = id 65 | ) 66 | } 67 | 68 | set.seed(3); 69 | pic <- perlin_heart(freq_init = .4) |> show_polygon(FALSE) 70 | plot(pic) -------------------------------------------------------------------------------- /materials/polar-art.R: -------------------------------------------------------------------------------- 1 | library(ggplot2) 2 | library(tibble) 3 | 4 | polar_art <- function(seed, n, palette) { 5 | 6 | # set the state of the random number generator 7 | set.seed(seed) 8 | 9 | # data frame containing random values for 10 | # aesthetics we might want to use in the art 11 | dat <- tibble( 12 | x0 = runif(n), 13 | y0 = runif(n), 14 | x1 = x0 + runif(n, min = -.2, max = .2), 15 | y1 = y0 + runif(n, min = -.2, max = .2), 16 | shade = runif(n), 17 | size = runif(n) 18 | ) 19 | 20 | # plot segments in various colours, using 21 | # polar coordinates and a gradient palette 22 | dat |> 23 | ggplot(aes( 24 | x = x0, 25 | y = y0, 26 | xend = x1, 27 | yend = y1, 28 | colour = shade, 29 | size = size 30 | )) + 31 | geom_segment(show.legend = FALSE) + 32 | coord_polar() + 33 | scale_y_continuous(expand = c(0, 0)) + 34 | scale_x_continuous(expand = c(0, 0)) + 35 | scale_colour_gradientn(colours = palette) + 36 | scale_size(range = c(0, 10)) + 37 | theme_void() 38 | } 39 | 40 | polar_art( 41 | seed = 2, 42 | n = 50, 43 | palette = c("red", "black", "white") 44 | ) 45 | -------------------------------------------------------------------------------- /materials/polar-styled-plots.R: -------------------------------------------------------------------------------- 1 | library(ggplot2) 2 | library(tibble) 3 | library(dplyr) 4 | 5 | sample_canva <- function(seed = NULL) { 6 | if(!is.null(seed)) set.seed(seed) 7 | sample(ggthemes::canva_palettes, 1)[[1]] 8 | } 9 | 10 | sample_data <- function(seed = NULL, n = 100){ 11 | if(!is.null(seed)) set.seed(seed) 12 | dat <- tibble( 13 | x0 = runif(n), 14 | y0 = runif(n), 15 | x1 = x0 + runif(n, min = -.2, max = .2), 16 | y1 = y0 + runif(n, min = -.2, max = .2), 17 | shade = runif(n), 18 | size = runif(n), 19 | shape = factor(sample(0:22, size = n, replace = TRUE)) 20 | ) 21 | } 22 | 23 | polar_styled_plot <- function(data = NULL, palette) { 24 | ggplot( 25 | data = data, 26 | mapping = aes( 27 | x = x0, 28 | y = y0, 29 | xend = x1, 30 | yend = y1, 31 | colour = shade, 32 | size = size 33 | )) + 34 | coord_polar(clip = "off") + 35 | scale_y_continuous( 36 | expand = c(0, 0), 37 | limits = c(0, 1), 38 | oob = scales::oob_keep 39 | ) + 40 | scale_x_continuous( 41 | expand = c(0, 0), 42 | limits = c(0, 1), 43 | oob = scales::oob_keep 44 | ) + 45 | scale_colour_gradientn(colours = palette) + 46 | scale_size(range = c(0, 10)) + 47 | theme_void() + 48 | guides( 49 | colour = guide_none(), 50 | size = guide_none(), 51 | fill = guide_none(), 52 | shape = guide_none() 53 | ) 54 | } 55 | 56 | -------------------------------------------------------------------------------- /materials/pretty-boxes.R: -------------------------------------------------------------------------------- 1 | 2 | library(tictoc) 3 | library(Rcpp) 4 | library(here) 5 | 6 | sourceCpp(file = here("materials", "unbox-grid.cpp")) 7 | 8 | sample_canva2 <- function(seed = NULL, n = 4) { 9 | if(!is.null(seed)) set.seed(seed) 10 | sample(ggthemes::canva_palettes, 1)[[1]] |> 11 | (\(x) colorRampPalette(x)(n))() 12 | } 13 | 14 | pretty_boxes <- function( 15 | seed, 16 | iterations = 100000000, 17 | layers = 5, 18 | pixels = 4000, 19 | background = "black", 20 | border = 4, 21 | trim = .001 22 | ) { 23 | 24 | set.seed(seed) 25 | 26 | mat <- unboxer_grid( 27 | iterations = iterations, 28 | layers = layers, 29 | pixels = pixels, 30 | border = border 31 | ) 32 | 33 | shades <- c(background, sample_canva2(seed, n = 1023)) 34 | 35 | zlim <- quantile(mat, c(trim, 1 - trim)) 36 | mat[mat < zlim[1]] <- zlim[1] 37 | mat[mat > zlim[2]] <- zlim[2] 38 | 39 | op <- par(mar = c(0, 0, 0, 0)) 40 | image( 41 | z = mat, 42 | axes = FALSE, 43 | asp = 1, 44 | useRaster = TRUE, 45 | col = shades 46 | ) 47 | par(op) 48 | } 49 | 50 | tic() 51 | pretty_boxes(100, iterations = 10000000) 52 | toc() 53 | 54 | -------------------------------------------------------------------------------- /materials/shaded-icescape.R: -------------------------------------------------------------------------------- 1 | 2 | library(rayshader) 3 | library(tibble) 4 | library(ambient) 5 | library(dplyr) 6 | library(ggplot2) 7 | library(ggthemes) 8 | library(dplyr) 9 | library(tictoc) 10 | library(here) 11 | 12 | sample_canva2 <- function(seed = NULL, n = 4) { 13 | 14 | if(!is.null(seed)) set.seed(seed) 15 | sample(ggthemes::canva_palettes, 1)[[1]] |> 16 | (\(x) colorRampPalette(x)(n))() 17 | } 18 | 19 | transform_to_curl_space <- function(x, y, frequency = 1, octaves = 10) { 20 | curl_noise( 21 | generator = fracture, 22 | noise = gen_simplex, 23 | fractal = fbm, 24 | octaves = octaves, 25 | frequency = frequency, 26 | x = x, 27 | y = y 28 | ) 29 | } 30 | 31 | 32 | define_worley_cells <- function(x, y, frequency = 3, octaves = 6) { 33 | fracture( 34 | noise = gen_worley, 35 | fractal = billow, 36 | octaves = octaves, 37 | frequency = frequency, 38 | value = "cell", 39 | x = x, 40 | y = y 41 | ) |> 42 | rank() |> 43 | normalise() 44 | } 45 | 46 | 47 | simplex_noise <- function(x, y, frequency = .1, octaves = 10) { 48 | fracture( 49 | noise = gen_simplex, 50 | fractal = ridged, 51 | octaves = octaves, 52 | frequency = frequency, 53 | x = x, 54 | y = y 55 | ) |> 56 | normalise() 57 | } 58 | 59 | 60 | ice_floe <- function(seed) { 61 | 62 | set.seed(seed) 63 | 64 | grid <- long_grid( 65 | x = seq(0, 1, length.out = 2000), 66 | y = seq(0, 1, length.out = 2000) 67 | ) 68 | 69 | coords <- transform_to_curl_space(grid$x, grid$y) 70 | 71 | grid |> 72 | mutate( 73 | cells = define_worley_cells(coords$x, coords$y), 74 | paint = simplex_noise(x + cells, y + cells), 75 | paint = normalise(paint) 76 | ) |> 77 | as.array(value = paint) 78 | } 79 | 80 | shaded_ice_floe <- function(seed) { 81 | 82 | art <- ice_floe(seed) 83 | 84 | height_shade( 85 | heightmap = art, 86 | texture = sample_canva2(seed, 256) 87 | ) |> 88 | add_shadow( 89 | shadowmap = ray_shade( 90 | heightmap = art, 91 | sunaltitude = 30, 92 | sunangle = 90, 93 | multicore = TRUE, 94 | zscale = .005 95 | ), 96 | max_darken = .05 97 | ) |> 98 | plot_map() 99 | } 100 | 101 | tic() 102 | shaded_ice_floe(123) 103 | toc() 104 | -------------------------------------------------------------------------------- /materials/shaded-ridge-art.R: -------------------------------------------------------------------------------- 1 | library(rayshader) 2 | library(tibble) 3 | library(ambient) 4 | library(dplyr) 5 | library(ggplot2) 6 | library(ggthemes) 7 | library(tictoc) 8 | library(dplyr) 9 | 10 | sample_canva2 <- function(seed = NULL, n = 4) { 11 | if(!is.null(seed)) set.seed(seed) 12 | sample(ggthemes::canva_palettes, 1)[[1]] |> 13 | (\(x) colorRampPalette(x)(n))() 14 | } 15 | 16 | ridge_art <- function(seed = NULL, pixels = 2000) { 17 | 18 | if(!is.null(seed)) set.seed(seed) 19 | long_grid( 20 | x = seq(from = 0, to = 1, length.out = pixels), 21 | y = seq(from = 0, to = 1, length.out = pixels) 22 | ) |> 23 | mutate( 24 | paint = fracture( 25 | x = x, 26 | y = y, 27 | noise = gen_simplex, 28 | fractal = ridged, 29 | octaves = 8, 30 | frequency = 10, 31 | seed = seed 32 | ), 33 | paint = normalise(paint) 34 | ) |> 35 | as.array(value = paint) 36 | } 37 | 38 | shaded_ridge_art <- function(seed = NULL) { 39 | 40 | art <- ridge_art(seed) 41 | height_shade( 42 | heightmap = art, 43 | texture = sample_canva2(seed, 256) 44 | ) |> 45 | add_shadow( 46 | shadowmap = ray_shade( 47 | heightmap = art, 48 | sunaltitude = 30, 49 | sunangle = 90, 50 | multicore = TRUE, 51 | zscale = .05 52 | ), 53 | max_darken = .1 54 | ) |> 55 | plot_map() 56 | } 57 | 58 | tic() 59 | shaded_ridge_art(100) 60 | toc() 61 | -------------------------------------------------------------------------------- /materials/splotch.R: -------------------------------------------------------------------------------- 1 | library(dplyr) 2 | library(purrr) 3 | library(tidyr) 4 | library(tibble) 5 | library(ggplot2) 6 | library(ambient) 7 | library(tictoc) 8 | library(ggthemes) 9 | library(here) 10 | 11 | edge_length <- function(x1, y1, x2, y2) { 12 | sqrt((x1 - x2)^2 + (y1 - y2)^2) 13 | } 14 | 15 | edge_noise <- function(size) { 16 | runif(1, min = -size/2, max = size/2) 17 | } 18 | 19 | sample_edge_l <- function(polygon) { 20 | sample(length(polygon), 1, prob = map_dbl(polygon, ~ .x$seg_len)) 21 | } 22 | 23 | insert_edge_l <- function(polygon, noise) { 24 | 25 | ind <- sample_edge_l(polygon) 26 | len <- polygon[[ind]]$seg_len 27 | 28 | last_x <- polygon[[ind]]$x 29 | last_y <- polygon[[ind]]$y 30 | 31 | next_x <- polygon[[ind + 1]]$x 32 | next_y <- polygon[[ind + 1]]$y 33 | 34 | new_x <- (last_x + next_x) / 2 + edge_noise(len * noise) 35 | new_y <- (last_y + next_y) / 2 + edge_noise(len * noise) 36 | 37 | new_point <- list( 38 | x = new_x, 39 | y = new_y, 40 | seg_len = edge_length(new_x, new_y, next_x, next_y) 41 | ) 42 | 43 | polygon[[ind]]$seg_len <- edge_length( 44 | last_x, last_y, new_x, new_y 45 | ) 46 | 47 | c( 48 | polygon[1:ind], 49 | list(new_point), 50 | polygon[-(1:ind)] 51 | ) 52 | } 53 | 54 | grow_polygon_l <- function(polygon, iterations, noise, seed = NULL) { 55 | if(!is.null(seed)) set.seed(seed) 56 | for(i in 1:iterations) polygon <- insert_edge_l(polygon, noise) 57 | return(polygon) 58 | } 59 | 60 | grow_multipolygon_l <- function(base_shape, n, seed = NULL, ...) { 61 | if(!is.null(seed)) set.seed(seed) 62 | polygons <- list() 63 | for(i in 1:n) { 64 | polygons[[i]] <- grow_polygon_l(base_shape, ...) |> 65 | transpose() |> 66 | as_tibble() |> 67 | mutate(across(.fn = unlist)) 68 | } 69 | polygons <- bind_rows(polygons, .id = "id") 70 | polygons 71 | } 72 | 73 | show_multipolygon <- function(polygon, fill, alpha = .02, ...) { 74 | ggplot(polygon, aes(x, y, group = id)) + 75 | geom_polygon(colour = NA, alpha = alpha, fill = fill, ...) + 76 | coord_equal() + 77 | theme_void() 78 | } 79 | 80 | splotch <- function(seed, layers = 10) { 81 | set.seed(seed) 82 | square_l <- transpose(tibble( 83 | x = c(0, 1, 1, 0, 0), 84 | y = c(0, 0, 1, 1, 0), 85 | seg_len = c(1, 1, 1, 1, 0) 86 | )) 87 | square_l |> 88 | grow_polygon_l(iterations = 10, noise = .5, seed = seed) |> 89 | grow_multipolygon_l(n = layers, iterations = 500, noise = .8, seed = seed) 90 | } 91 | 92 | tic() 93 | dat <- splotch(seed = 1) 94 | pic <- dat |> show_multipolygon(fill = "white", alpha = .2) 95 | ggsave( 96 | filename = here("output", "splotch.png"), 97 | plot = pic, 98 | width = 2000, 99 | height = 2000, 100 | units = "px", 101 | dpi = 300, 102 | bg = "black" 103 | ) 104 | toc() 105 | 106 | 107 | 108 | -------------------------------------------------------------------------------- /materials/subdivision.R: -------------------------------------------------------------------------------- 1 | 2 | library(ggplot2) 3 | library(tibble) 4 | library(purrr) 5 | library(dplyr) 6 | 7 | sample_canva2 <- function(seed = NULL, n = 4) { 8 | if(!is.null(seed)) set.seed(seed) 9 | sample(ggthemes::canva_palettes, 1)[[1]] |> 10 | (\(x) colorRampPalette(x)(n))() 11 | } 12 | 13 | choose_rectangle <- function(blocks) { 14 | sample(nrow(blocks), 1, prob = blocks$area) 15 | } 16 | 17 | choose_break <- function(lower, upper) { 18 | round((upper - lower) * runif(1)) 19 | } 20 | 21 | create_rectangles <- function(left, right, bottom, top, value) { 22 | tibble( 23 | left = left, 24 | right = right, 25 | bottom = bottom, 26 | top = top, 27 | width = right - left, 28 | height = top - bottom, 29 | area = width * height, 30 | value = value 31 | ) 32 | } 33 | 34 | split_rectangle_x <- function(rectangle, new_value) { 35 | with(rectangle, { 36 | split <- choose_break(left, right) 37 | new_left <- c(left, left + split) 38 | new_right <- c(left + split, right) 39 | new_value <- c(value, new_value) 40 | create_rectangles(new_left, new_right, bottom, top, new_value) 41 | }) 42 | } 43 | 44 | split_rectangle_y <- function(rectangle, new_value) { 45 | with(rectangle, { 46 | split <- choose_break(bottom, top) 47 | new_bottom <- c(bottom, bottom + split) 48 | new_top <- c(bottom + split, top) 49 | new_value <- c(value, new_value) 50 | create_rectangles(left, right, new_bottom, new_top, new_value) 51 | }) 52 | } 53 | 54 | split_rectangle <- function(rectangle, value) { 55 | if(runif(1) < .5) { 56 | return(split_rectangle_x(rectangle, value)) 57 | } 58 | split_rectangle_y(rectangle, value) 59 | } 60 | 61 | split_block <- function(blocks, value) { 62 | old <- choose_rectangle(blocks) 63 | new <- split_rectangle(blocks[old, ], value) 64 | bind_rows(blocks[-old, ], new) 65 | } 66 | 67 | subdivision <- function(ncol = 1000, 68 | nrow = 1000, 69 | nsplits = 50, 70 | seed = NULL) { 71 | 72 | if(!is.null(seed)) set.seed(seed) 73 | blocks <- create_rectangles( 74 | left = 1, 75 | right = ncol, 76 | bottom = 1, 77 | top = nrow, 78 | value = 0 79 | ) 80 | reduce(1:nsplits, split_block, .init = blocks) 81 | } 82 | 83 | develop <- function(div, seed = NULL) { 84 | 85 | div |> 86 | ggplot(aes( 87 | xmin = left, 88 | xmax = right, 89 | ymin = bottom, 90 | ymax = top, 91 | fill = value 92 | )) + 93 | geom_rect( 94 | colour = "#ffffff", 95 | size = 3, 96 | show.legend = FALSE 97 | ) + 98 | scale_fill_gradientn( 99 | colours = sample_canva2(seed) 100 | ) + 101 | coord_equal() + 102 | theme_void() 103 | } 104 | 105 | pic <- subdivision(seed = 1) |> develop() 106 | plot(pic) 107 | -------------------------------------------------------------------------------- /materials/textured-lines.R: -------------------------------------------------------------------------------- 1 | library(dplyr) 2 | library(tibble) 3 | library(ggplot2) 4 | library(here) 5 | library(e1071) 6 | 7 | smooth_loess <- function(x, span) { 8 | n <- length(x) 9 | dat <- tibble(time = 1:n, walk = x) 10 | mod <- loess(walk ~ time, dat, span = span) 11 | predict(mod, tibble(time = 1:n)) 12 | } 13 | 14 | smooth_path <- function(n = 1000, smoothing = .4, seed = NULL) { 15 | if(!is.null(seed)) set.seed(seed) 16 | tibble( 17 | x = smooth_loess(rbridge(1, n), span = smoothing), 18 | y = smooth_loess(rbridge(1, n), span = smoothing), 19 | stroke = 1 20 | ) 21 | } 22 | 23 | perturb <- function(path, noise = .01, span = .1) { 24 | path |> 25 | group_by(stroke) |> 26 | mutate( 27 | x = x + rnorm(n(), 0, noise), 28 | y = y + rnorm(n(), 0, noise), 29 | x = smooth_loess(x, span), 30 | y = smooth_loess(y, span), 31 | alpha = runif(n()) > .5, 32 | size = runif(n(), 0, .2) 33 | ) 34 | } 35 | 36 | brush <- function(path, bristles = 100, seed = 1, ...) { 37 | set.seed(seed) 38 | dat <- list() 39 | for(i in 1:bristles) { 40 | dat[[i]] <- perturb(path, ...) 41 | } 42 | return(bind_rows(dat, .id = "id")) 43 | } 44 | 45 | stroke <- function(dat, geom = geom_path, colour = "white", ...) { 46 | dat |> 47 | ggplot(aes( 48 | x = x, 49 | y = y, 50 | alpha = alpha, 51 | size = size, 52 | group = paste0(stroke, id) 53 | )) + 54 | geom( 55 | colour = colour, 56 | show.legend = FALSE, 57 | ... 58 | ) + 59 | coord_equal() + 60 | scale_alpha_identity() + 61 | scale_size_identity() + 62 | theme_void() + 63 | theme(plot.background = element_rect( 64 | fill = "#222222", 65 | colour = "#222222" 66 | )) 67 | } 68 | 69 | path <- smooth_path(seed = 123) 70 | pic <- path |> brush() |> stroke() 71 | plot(pic) 72 | 73 | -------------------------------------------------------------------------------- /materials/truchet-example.R: -------------------------------------------------------------------------------- 1 | 2 | library(truchet) 3 | library(ggplot2) 4 | 5 | set.seed(123) 6 | mosaic <- st_truchet_ms( 7 | tiles = c("dr", "tn", "ane"), 8 | p1 = 0.2, # scale 1 9 | p2 = 0.6, # scale 2 10 | p3 = 0.2, # scale 3 11 | xlim = c(1, 6), 12 | ylim = c(1, 6) 13 | ) 14 | 15 | pic <- mosaic |> 16 | ggplot(aes(fill = color)) + 17 | geom_sf(color = NA, show.legend = FALSE) + 18 | scale_fill_gradientn(colours = c("#222222", "#ffffff")) + 19 | theme_void() 20 | 21 | plot(pic) 22 | -------------------------------------------------------------------------------- /materials/unbox-base.R: -------------------------------------------------------------------------------- 1 | 2 | library(ggplot2) 3 | library(tibble) 4 | library(purrr) 5 | library(dplyr) 6 | library(tictoc) 7 | library(ggthemes) 8 | library(here) 9 | 10 | sample_canva2 <- function(seed = NULL, n = 4) { 11 | 12 | if(!is.null(seed)) set.seed(seed) 13 | sample(ggthemes::canva_palettes, 1)[[1]] |> 14 | (\(x) colorRampPalette(x)(n))() 15 | } 16 | 17 | funs <- list( 18 | function(point) point + (sum(point ^ 2)) ^ (1/3), 19 | function(point) sin(point), 20 | function(point) 2 * sin(point) 21 | ) 22 | 23 | unboxer_base <- function(iterations, layers, seed = NULL) { 24 | 25 | if(!is.null(seed)) set.seed(seed) 26 | 27 | # coefficients defining affine layer transforms, A_i 28 | coeffs <- array( 29 | data = runif(9 * layers, min = -1, max = 1), 30 | dim = c(3, 3, layers) 31 | ) 32 | 33 | # list of variant functions, g_j 34 | funs <- list( 35 | function(point) point + (sum(point ^ 2)) ^ (1/3), 36 | function(point) sin(point), 37 | function(point) 2 * sin(point) 38 | ) 39 | 40 | # updater function: apply the layer, then the function 41 | # (the weirdness with point[3] is me treating colour as special) 42 | update <- function(point, layer, transform) { 43 | f <- funs[[transform]] 44 | z <- point[3] 45 | point[3] <- 1 46 | point <- f(point %*% coeffs[,,layer]) 47 | point[3] <- (point[3] + z)/2 48 | return(point) 49 | } 50 | 51 | # initial point 52 | point0 <- matrix( 53 | data = runif(3, min = -1, max = 1), 54 | nrow = 1, 55 | ncol = 3 56 | ) 57 | 58 | # sample points 59 | layer_ind <- sample(layers, iterations, replace = TRUE) 60 | trans_ind <- sample(length(funs), iterations, replace = TRUE) 61 | points <- accumulate2(layer_ind, trans_ind, update, .init = point0) 62 | 63 | # tidy up, add columns, and return 64 | points <- matrix(unlist(points), ncol = 3, byrow = TRUE) 65 | points <- cbind( 66 | points, 67 | c(0, layer_ind), 68 | c(0, trans_ind) 69 | ) 70 | return(points) 71 | } 72 | 73 | unbox_art <- function(data, seed = NULL, size = 1) { 74 | 75 | # convert to data frame and sample a palette 76 | data <- data |> as.data.frame() |> as_tibble() 77 | names(data) <- c("x", "y", "c", "l", "t")[1:ncol(data)] 78 | shades <- sample_canva2(seed) 79 | 80 | # render image as a scatter plot 81 | ggplot(data, aes(x, y, colour = c)) + 82 | geom_point( 83 | size = size, 84 | stroke = 0, 85 | show.legend = FALSE 86 | ) + 87 | theme_void() + 88 | coord_equal(xlim = c(-4, 4), ylim = c(-4, 4)) + 89 | scale_colour_gradientn(colours = shades) + 90 | scale_x_continuous(expand = c(0, 0)) + 91 | scale_y_continuous(expand = c(0, 0)) + 92 | theme(panel.background = element_rect( 93 | fill = shades[1], colour = shades[1] 94 | )) 95 | } 96 | 97 | tic() 98 | 99 | seed <- 1234 100 | layers <- 5 101 | 102 | pic <- unboxer_base(1000000, layers = layers, seed = seed) |> 103 | unbox_art(seed = seed, size = .2) 104 | fname <- paste0("unboxer-base-", layers, "-", seed, ".png") 105 | 106 | ggsave( 107 | filename = here("output", fname), 108 | plot = pic, 109 | width = 2000, 110 | height = 2000, 111 | units = "px", 112 | dpi = 300 113 | ) 114 | 115 | toc() 116 | 117 | 118 | 119 | -------------------------------------------------------------------------------- /materials/unbox-fast-test.R: -------------------------------------------------------------------------------- 1 | 2 | library(tictoc) 3 | library(Rcpp) 4 | library(here) 5 | 6 | sourceCpp(file = here("materials", "unbox-fast.cpp")) 7 | 8 | tic() 9 | set.seed(999) 10 | dat <- unboxer_rcpp(1000000, layers = 2) 11 | toc() 12 | -------------------------------------------------------------------------------- /materials/unbox-fast.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace Rcpp; 4 | using namespace std; 5 | 6 | // [[Rcpp::export]] 7 | NumericMatrix unboxer_rcpp(int iterations, int layers) { 8 | 9 | // variables 10 | NumericMatrix pts(iterations, 3); 11 | NumericMatrix cff(9, layers); 12 | int r, f; 13 | double x, y, z, s; 14 | 15 | // coefficients 16 | for(int i = 0; i < 9; i++) { 17 | for(int j = 0; j < layers; j++) { 18 | cff(i,j) = R::runif(-1,1); 19 | } 20 | } 21 | 22 | // initial point 23 | pts(0, 0) = R::runif(-1, 1); 24 | pts(0, 1) = R::runif(-1, 1); 25 | pts(0, 2) = R::runif(-1, 1); 26 | 27 | // accumulate 28 | for(int t = 1; t < iterations; t++) { 29 | r = rand() % layers; // which transform to use? 30 | f = rand() % 3; // which function to use? 31 | 32 | // apply transformation 33 | x = cff(0, r) * pts(t-1, 0) + cff(1, r) * pts(t-1, 1) + cff(2, r); 34 | y = cff(3, r) * pts(t-1, 0) + cff(4, r) * pts(t-1, 1) + cff(5, r); 35 | z = cff(6, r) * pts(t-1, 0) + cff(7, r) * pts(t-1, 1) + cff(8, r); 36 | 37 | // apply function 38 | if(f == 0) { 39 | s = pow(x*x + y*y + z*z, 1/3); 40 | x = x + s; 41 | y = y + s; 42 | z = z + s; 43 | } else if(f == 1) { 44 | x = sin(x); 45 | y = sin(y); 46 | z = sin(z); 47 | } else { 48 | x = 2 * sin(x); 49 | y = 2 * sin(y); 50 | z = 2 * sin(z); 51 | } 52 | 53 | // store new point 54 | pts(t, 0) = x; 55 | pts(t, 1) = y; 56 | pts(t, 2) = (z + pts(t-1, 2))/2; 57 | } 58 | return pts; 59 | } 60 | -------------------------------------------------------------------------------- /materials/unbox-grid.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | using namespace Rcpp; 4 | using namespace std; 5 | 6 | // [[Rcpp::export]] 7 | NumericMatrix unboxer_grid(int iterations, 8 | int layers, 9 | int pixels, 10 | double border) { 11 | 12 | // variables 13 | NumericMatrix image(pixels, pixels); 14 | NumericMatrix cff(9, layers); 15 | int r, c, f, x_ind, y_ind; 16 | double x, y, z, s; 17 | 18 | // set image matrix to zeros 19 | for(int r = 0; r < pixels; r++) { 20 | for(int c = 0; c < pixels; c++) { 21 | image(c, r) = 0; 22 | } 23 | } 24 | 25 | // coefficients 26 | for(int i = 0; i < 9; i++) { 27 | for(int j = 0; j < layers; j++) { 28 | cff(i,j) = R::runif(-1,1); 29 | } 30 | } 31 | 32 | // values for initial state 33 | double x_old = R::runif(-1, 1); 34 | double y_old = R::runif(-1, 1); 35 | double z_old = R::runif(-1, 1); 36 | 37 | // accumulate 38 | for(int t = 1; t < iterations; t++) { 39 | r = rand() % layers; // which transform to use? 40 | f = rand() % 3; // which function to use? 41 | 42 | // apply transformation 43 | x = cff(0, r) * x_old + cff(1, r) * y_old + cff(2, r); 44 | y = cff(3, r) * x_old + cff(4, r) * y_old + cff(5, r); 45 | z = cff(6, r) * x_old + cff(7, r) * y_old + cff(8, r); 46 | 47 | // apply function 48 | if(f == 0) { 49 | s = pow(x*x + y*y + z*z, 1/3); 50 | x = x + s; 51 | y = y + s; 52 | z = abs(z + s); 53 | } else if(f == 1) { 54 | x = sin(x); 55 | y = sin(y); 56 | z = sin(z) + 1; 57 | } else { 58 | x = 2 * sin(x); 59 | y = 2 * sin(y); 60 | z = 2 * (sin(z) + 1); 61 | } 62 | 63 | // compute indices to be updated 64 | x_ind = int (x * pixels / (2 * border)) + pixels / 2; 65 | y_ind = int (y * pixels / (2 * border)) + pixels / 2; 66 | 67 | // store results if they fall within the range 68 | if(x_ind >= 0 & x_ind < pixels) { 69 | if(y_ind >= 0 & y_ind < pixels) { 70 | image(x_ind, y_ind) = z; 71 | } 72 | } 73 | 74 | // move new to old 75 | x_old = x; 76 | y_old = y; 77 | z_old = (z + z_old) / 2; 78 | } 79 | return image; 80 | } 81 | -------------------------------------------------------------------------------- /materials/voronoi-baroque.R: -------------------------------------------------------------------------------- 1 | 2 | library(tibble) 3 | library(purrr) 4 | library(ggplot2) 5 | library(ggforce) 6 | library(voronoise) 7 | library(dplyr) 8 | 9 | sample_canva2 <- function(seed = NULL, n = 4) { 10 | if(!is.null(seed)) set.seed(seed) 11 | sample(ggthemes::canva_palettes, 1)[[1]] |> 12 | (\(x) colorRampPalette(x)(n))() 13 | } 14 | 15 | unboxy <- function(iterations, layers) { 16 | 17 | coeffs <- array( 18 | data = runif(9 * layers, min = -1, max = 1), 19 | dim = c(3, 3, layers) 20 | ) 21 | 22 | point0 <- matrix( 23 | data = runif(3, min = -1, max = 1), 24 | nrow = 1, 25 | ncol = 3 26 | ) 27 | 28 | funs <- list( 29 | function(point) point + (sum(point ^ 2)) ^ (1/3), 30 | function(point) sin(point), 31 | function(point) 2 * sin(point) 32 | ) 33 | 34 | update <- function(point, t) { 35 | l <- sample(layers, 1) 36 | f <- sample(funs, 1)[[1]] 37 | z <- point[3] 38 | point[3] <- 1 39 | point <- f(point %*% coeffs[,,l]) 40 | point[3] <- (point[3] + z)/2 41 | return(point) 42 | } 43 | 44 | points <- accumulate(1:iterations, update, .init = point0) 45 | points <- matrix(unlist(points), ncol = 3, byrow = TRUE) 46 | points <- as_tibble(as.data.frame(points)) 47 | names(points) <- c("x", "y", "val") 48 | return(points) 49 | } 50 | 51 | sift <- function(data) { 52 | data <- data |> 53 | group_by(group) |> 54 | mutate( 55 | tilesize = (max(x) - min(x)) * (max(y) - min(y)), 56 | x = if_else(tilesize > .02, x, x + rnorm(1)/10), 57 | y = if_else(tilesize > .02, y, y + rnorm(1)/10) 58 | ) |> 59 | ungroup() 60 | return(data) 61 | } 62 | 63 | shake <- function(data) { 64 | data |> 65 | group_by(group) |> 66 | mutate( 67 | x = x + runif(1)/10, 68 | y = y + runif(1)/10 69 | ) |> 70 | ungroup() 71 | } 72 | 73 | voronoi_baroque <- function( 74 | seed, 75 | perturb, 76 | max.radius = NULL, 77 | radius = 0, 78 | expand = 0, 79 | ... 80 | ) { 81 | 82 | set.seed(seed) 83 | 84 | blank <- ggplot(mapping = aes(x, y, fill = val)) + 85 | theme_void() + 86 | coord_equal(xlim = c(-2.75, 2.75), ylim = c(-2.75, 2.75)) + 87 | guides(fill = guide_none(), alpha = guide_none()) + 88 | scale_fill_gradientn(colours = sample_canva2(seed)) + 89 | scale_alpha_identity() + 90 | scale_x_continuous(expand = c(0, 0)) + 91 | scale_y_continuous(expand = c(0, 0)) 92 | 93 | blank + 94 | geom_voronoise( 95 | data = unboxy(iterations = 10000, layers = 5), 96 | perturb = perturb, 97 | max.radius = max.radius, 98 | radius = radius, 99 | expand = expand, 100 | ..., 101 | show.legend = FALSE 102 | ) 103 | } 104 | 105 | pic <- voronoi_baroque(43, shake) 106 | plot(pic) 107 | -------------------------------------------------------------------------------- /materials/voronoi-tiles.R: -------------------------------------------------------------------------------- 1 | 2 | library(ggplot2) 3 | library(ggforce) 4 | library(tibble) 5 | 6 | set.seed(61) 7 | 8 | dat <- tibble( 9 | x = runif(20), 10 | y = runif(20), 11 | val = runif(20) 12 | ) 13 | 14 | bg_dat <- tibble( 15 | x = runif(500, min = -.5, max = 1.5), 16 | y = runif(500, min = -.5, max = 1.5) 17 | ) 18 | 19 | pic <- ggplot(dat, aes(x, y, fill = val)) + 20 | coord_equal(xlim = c(-.3, 1.3), ylim = c(-.3, 1.3)) + 21 | guides(fill = guide_none()) + 22 | theme_void() + 23 | theme(panel.background = element_rect( 24 | fill = "#222222", colour = "#222222" 25 | )) 26 | 27 | pic2 <- pic + 28 | geom_voronoi_tile( 29 | data = bg_dat, 30 | fill = "#333333", 31 | radius = .01, 32 | expand = -.0025 33 | ) + 34 | geom_voronoi_tile( 35 | colour = "white", 36 | max.radius = .2, 37 | radius = .02, 38 | expand = -.005 39 | ) 40 | 41 | plot(pic2) 42 | -------------------------------------------------------------------------------- /materials/voronoi-unbox.R: -------------------------------------------------------------------------------- 1 | 2 | library(tibble) 3 | library(purrr) 4 | library(ggplot2) 5 | library(ggforce) 6 | 7 | sample_canva2 <- function(seed = NULL, n = 4) { 8 | if(!is.null(seed)) set.seed(seed) 9 | sample(ggthemes::canva_palettes, 1)[[1]] |> 10 | (\(x) colorRampPalette(x)(n))() 11 | } 12 | 13 | unboxy <- function(iterations, layers) { 14 | 15 | coeffs <- array( 16 | data = runif(9 * layers, min = -1, max = 1), 17 | dim = c(3, 3, layers) 18 | ) 19 | 20 | point0 <- matrix( 21 | data = runif(3, min = -1, max = 1), 22 | nrow = 1, 23 | ncol = 3 24 | ) 25 | 26 | funs <- list( 27 | function(point) point + (sum(point ^ 2)) ^ (1/3), 28 | function(point) sin(point), 29 | function(point) 2 * sin(point) 30 | ) 31 | 32 | update <- function(point, t) { 33 | l <- sample(layers, 1) 34 | f <- sample(funs, 1)[[1]] 35 | z <- point[3] 36 | point[3] <- 1 37 | point <- f(point %*% coeffs[,,l]) 38 | point[3] <- (point[3] + z)/2 39 | return(point) 40 | } 41 | 42 | points <- accumulate(1:iterations, update, .init = point0) 43 | points <- matrix(unlist(points), ncol = 3, byrow = TRUE) 44 | points <- as_tibble(as.data.frame(points)) 45 | names(points) <- c("x", "y", "val") 46 | return(points) 47 | } 48 | 49 | set.seed(1) 50 | dat <- unboxy(iterations = 1000, layers = 5) 51 | 52 | pic <- ggplot(dat, aes(x, y, fill = val)) + 53 | theme_void() + 54 | coord_equal(xlim = c(-2.5, 2.5), ylim = c(-2.5, 2.5)) + 55 | scale_fill_gradientn(colours = sample_canva2()) + 56 | scale_x_continuous(expand = c(0, 0)) + 57 | scale_y_continuous(expand = c(0, 0)) 58 | 59 | pic2 <- pic + 60 | geom_voronoi_tile( 61 | colour = "#222222", 62 | size = .2, 63 | show.legend = FALSE 64 | ) 65 | 66 | plot(pic2) 67 | -------------------------------------------------------------------------------- /output/animated-perlin-heart-99.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/output/animated-perlin-heart-99.gif -------------------------------------------------------------------------------- /output/curl-art-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/output/curl-art-1.png -------------------------------------------------------------------------------- /output/curl-art-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/output/curl-art-2.png -------------------------------------------------------------------------------- /output/noise-art.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/output/noise-art.png -------------------------------------------------------------------------------- /output/smudged-hexagon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/output/smudged-hexagon.png -------------------------------------------------------------------------------- /output/splotch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/output/splotch.png -------------------------------------------------------------------------------- /output/unboxer-base-5-1234.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/output/unboxer-base-5-1234.png -------------------------------------------------------------------------------- /site-source/.gitignore: -------------------------------------------------------------------------------- 1 | /.quarto/ 2 | -------------------------------------------------------------------------------- /site-source/_quarto.yml: -------------------------------------------------------------------------------- 1 | project: 2 | type: website 3 | output-dir: ../_site 4 | 5 | website: 6 | title: "ART FROM CODE" 7 | site-url: https://art-from-code.netlify.app 8 | repo-url: https://github.com/rstudio-conf-2022/art-from-code 9 | open-graph: 10 | image: "http://art-from-code.netlify.app/img/banner-3.png" 11 | description: "An rstudio::conf workshop on generative art with R" 12 | twitter-card: 13 | creator: "@djnavarro" 14 | card-style: summary_large_image 15 | image: "http://art-from-code.netlify.app/img/banner-3.png" 16 | description: "An rstudio::conf workshop on generative art with R" 17 | 18 | navbar: 19 | left: 20 | - href: index.qmd 21 | text: Home 22 | - text: Sessions 23 | menu: 24 | - href: day-1/session-1/index.html 25 | text: "Get started" 26 | - href: day-1/session-2/index.html 27 | text: "Spatial noise tricks" 28 | - href: day-1/session-3/index.html 29 | text: "Polygon tricks" 30 | - href: day-1/session-4/index.html 31 | text: "Shading tricks" 32 | - href: day-2/session-1/index.html 33 | text: "Iterated function systems" 34 | - href: day-2/session-2/index.html 35 | text: "Tiles and tesselations" 36 | - href: day-2/session-3/index.html 37 | text: "Pixel filters" 38 | - href: day-2/session-4/index.html 39 | text: "Wrap up" 40 | - text: Slides 41 | href: slides/index.html 42 | 43 | format: 44 | html: 45 | theme: 46 | - darkly 47 | - darkish.scss 48 | css: styles.css 49 | toc: true 50 | include-after-body: plausible.html 51 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /site-source/darkish.scss: -------------------------------------------------------------------------------- 1 | /*-- scss:defaults --*/ 2 | 3 | // import google fonts 4 | @import 'https://fonts.googleapis.com/css2?family=Nunito&display=swap'; 5 | @import 'https://fonts.googleapis.com/css2?family=Fira+Code:wght@300;400;500;600;700&display=swap'; 6 | 7 | // override darkly font family 8 | $font-family-sans-serif: "Nunito", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji" !default; 9 | 10 | // override darkly link colour 11 | $link-color: #e83e8c !default; 12 | 13 | /*-- scss:rules --*/ 14 | 15 | -------------------------------------------------------------------------------- /site-source/day-1/session-1/.gitignore: -------------------------------------------------------------------------------- 1 | index_cache 2 | index_files 3 | -------------------------------------------------------------------------------- /site-source/day-1/session-2/.gitignore: -------------------------------------------------------------------------------- 1 | index_cache 2 | index_files 3 | -------------------------------------------------------------------------------- /site-source/day-1/session-3/.gitignore: -------------------------------------------------------------------------------- 1 | index_cache 2 | index_files 3 | animated-perlin-heart* 4 | -------------------------------------------------------------------------------- /site-source/day-1/session-3/hand-drawn-hearts.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/site-source/day-1/session-3/hand-drawn-hearts.jpg -------------------------------------------------------------------------------- /site-source/day-1/session-4/.gitignore: -------------------------------------------------------------------------------- 1 | index_cache 2 | index_files 3 | ice_3d.png 4 | circles_3d.png 5 | -------------------------------------------------------------------------------- /site-source/day-2/session-1/.gitignore: -------------------------------------------------------------------------------- 1 | index_cache 2 | index_files 3 | -------------------------------------------------------------------------------- /site-source/day-2/session-2/.gitignore: -------------------------------------------------------------------------------- 1 | index_cache 2 | index_files 3 | -------------------------------------------------------------------------------- /site-source/day-2/session-2/wpa-land-use-survey-map.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/site-source/day-2/session-2/wpa-land-use-survey-map.jpg -------------------------------------------------------------------------------- /site-source/day-2/session-3/.gitignore: -------------------------------------------------------------------------------- 1 | index_cache 2 | index_files 3 | -------------------------------------------------------------------------------- /site-source/day-2/session-3/dithered.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/site-source/day-2/session-3/dithered.png -------------------------------------------------------------------------------- /site-source/day-2/session-3/quantised.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/site-source/day-2/session-3/quantised.png -------------------------------------------------------------------------------- /site-source/day-2/session-3/undithered.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/site-source/day-2/session-3/undithered.png -------------------------------------------------------------------------------- /site-source/day-2/session-4/.gitignore: -------------------------------------------------------------------------------- 1 | index_cache 2 | index_files 3 | -------------------------------------------------------------------------------- /site-source/img/ascii-cross.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/site-source/img/ascii-cross.png -------------------------------------------------------------------------------- /site-source/img/ash_14_006.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/site-source/img/ash_14_006.png -------------------------------------------------------------------------------- /site-source/img/banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/site-source/img/banner.png -------------------------------------------------------------------------------- /site-source/img/day-1-session-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/site-source/img/day-1-session-1.png -------------------------------------------------------------------------------- /site-source/img/day-1-session-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/site-source/img/day-1-session-2.png -------------------------------------------------------------------------------- /site-source/img/day-1-session-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/site-source/img/day-1-session-3.png -------------------------------------------------------------------------------- /site-source/img/day-1-session-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/site-source/img/day-1-session-4.png -------------------------------------------------------------------------------- /site-source/img/day-2-session-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/site-source/img/day-2-session-1.png -------------------------------------------------------------------------------- /site-source/img/day-2-session-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/site-source/img/day-2-session-2.png -------------------------------------------------------------------------------- /site-source/img/day-2-session-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/site-source/img/day-2-session-3.png -------------------------------------------------------------------------------- /site-source/img/day-2-session-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/site-source/img/day-2-session-4.png -------------------------------------------------------------------------------- /site-source/img/image4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/site-source/img/image4.jpg -------------------------------------------------------------------------------- /site-source/img/nebula_04_153_5000.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/site-source/img/nebula_04_153_5000.jpg -------------------------------------------------------------------------------- /site-source/img/pollen_55_5739.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rstudio-conf-2022/art-from-code/4c8a860f8c130a0b3b71c2fd7bae26180d6ba138/site-source/img/pollen_55_5739.jpg -------------------------------------------------------------------------------- /site-source/plausible.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /site-source/styles.css: -------------------------------------------------------------------------------- 1 | /* css styles */ 2 | 3 | .navbar-dark, .navbar-light, .navbar { 4 | background-color: #000000; 5 | } 6 | --------------------------------------------------------------------------------