# [sketch-a-day](https://abav.lugaralgum.com/sketch-a-day) ## coding a visual idea a day Welcome! My name is [Alexandre Villares](https://abav.lugaralgum.com) and since January, 2018 I have been coding *sketches* everyday, publishing the source code in the same repository that stores this page, [github.com/villares/sketch-a-day](https://github.com/villares/sketch-a-day). The results here are mostly tentative, exploratory, and I don’t feel like they need to be relevant or meaningful on any particular day. The everyday practice leads to the emergence of ideas that I consider interesting, worthy of further exploration. Some of those have been added to [selected work](https://abav.lugaralgum.com/selected-work/index-EN.html), this collection itself became valuable for me, and it is my pleasure to share it with anyone willing to explore coding as a creative and expressive medium. To support my artistic work, research and open educational resources I freely publish on-line, donate using [Wise](https://wise.com/pay/me/alexandrev562), [Liberapay](https://liberapay.com/villares), [PayPal](https://www.paypal.com/donate/?hosted_button_id=5B4MZ78C9J724), or to the Brazilan PIX key `46c37783-5edb-4f1c-b3a8-1309db11488c`. You can follow me on Mastodon [@villares@ciberlandia.pt](https://ciberlandia.pt/@villares) or at @villares@pynews.com.br, where I post most of my daily sketches. Please do not hesitate to [contact me](http://contato.lugaralgum.com) regarding licenses to use my work, teaching opportunities, consulting or other projects. --- 2026 \| [2025](2025.md) \| [2024](2024.md) \| [2023](2023.md) \| [2022](2022.md) \| [2021](2021.md) \| [2020](2020.md) \| [2019](2019.md) \| [2018](2018.md) --- ### sketch_2026_07_30  [sketch_2026_07_30](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_07_30) [[py5](https://py5coding.org/)] --- ### sketch_2026_07_29  [sketch_2026_07_29](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_07_29) [[py5](https://py5coding.org/)] --- ### sketch_2026_07_28  [sketch_2026_07_28](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_07_28) [[py5](https://py5coding.org/)] --- ### sketch_2026_07_27  [sketch_2026_07_27](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_07_27) [[py5](https://py5coding.org/)] --- ### sketch_2026_07_26  [sketch_2026_07_26](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_07_26) [[py5](https://py5coding.org/)] --- ### sketch_2026_07_25  [sketch_2026_07_25](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_07_25) [[py5](https://py5coding.org/)] --- ### sketch_2026_07_24  [sketch_2026_07_24](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_07_24) [[py5](https://py5coding.org/)] --- ### sketch_2026_07_23  [sketch_2026_07_23](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_07_23) [[py5](https://py5coding.org/)] --- ### sketch_2026_07_22  [sketch_2026_07_22](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_07_22) [[py5](https://py5coding.org/)] --- ### sketch_2026_07_21  [sketch_2026_07_21](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_07_21) [[py5](https://py5coding.org/)] #shapely v = poly.exterior.interpolate(t, normalized=True) --- ### sketch_2026_07_20  [sketch_2026_07_20](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_07_20) [[py5](https://py5coding.org/)] --- ### sketch_2026_07_19  [sketch_2026_07_19](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_07_19) [[py5](https://py5coding.org/)] --- ### sketch_2026_07_18  [sketch_2026_07_18](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_07_18) [[py5](https://py5coding.org/)] --- ### sketch_2026_07_17  [sketch_2026_07_17](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_07_17) [[py5](https://py5coding.org/)] --- ### sketch_2026_07_16  [sketch_2026_07_16](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_07_16) [[py5](https://py5coding.org/)] --- ### sketch_2026_07_15  [sketch_2026_07_15](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_07_15) [[py5](https://py5coding.org/)] --- ### sketch_2026_07_14  [sketch_2026_07_14](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_07_14) [[py5](https://py5coding.org/)] --- ### sketch_2026_07_13  [sketch_2026_07_13](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_07_13) [[py5](https://py5coding.org/)] --- ### sketch_2026_07_12  [sketch_2026_07_12](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_07_12) [[py5](https://py5coding.org/)] --- ### sketch_2026_07_11  [sketch_2026_07_11](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_07_11) [[py5](https://py5coding.org/)] --- ### sketch_2026_07_10  [sketch_2026_07_10](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_07_10) [[py5](https://py5coding.org/)] --- ### sketch_2026_07_09  [sketch_2026_07_09](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_07_09) [[py5](https://py5coding.org/)] --- ### sketch_2026_07_08  [sketch_2026_07_08](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_07_08) [[py5](https://py5coding.org/)] --- ### sketch_2026_07_07  [sketch_2026_07_07](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_07_07) [[py5](https://py5coding.org/)] 90 estrelas --- ### sketch_2026_07_06  [sketch_2026_07_06](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_07_06) [[py5](https://py5coding.org/)] --- ### sketch_2026_07_05  [sketch_2026_07_05](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_07_05) [[py5](https://py5coding.org/)] --- ### sketch_2026_07_04  [sketch_2026_07_04](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_07_04) [[py5](https://py5coding.org/)] --- ### sketch_2026_07_03  [sketch_2026_07_03](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_07_03) [[py5](https://py5coding.org/)] --- ### sketch_2026_07_02  [sketch_2026_07_02](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_07_02) [[py5](https://py5coding.org/)] --- ### sketch_2026_07_01  [sketch_2026_07_01](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_07_01) [[py5](https://py5coding.org/)] --- ### sketch_2026_06_30  [sketch_2026_06_30](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_06_30) [[py5](https://py5coding.org/)] Continued from sketch_2026_06_07 --- ### sketch_2026_06_29  [sketch_2026_06_29](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_06_29) [[py5](https://py5coding.org/)] --- ### sketch_2026_06_28  [sketch_2026_06_28](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_06_28) [[py5](https://py5coding.org/)] A blast from the past... revisiting a 2018 sketch-a-day sketch "s310". --- ### sketch_2026_06_27  [sketch_2026_06_27](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_06_27) [[py5](https://py5coding.org/)] --- ### sketch_2026_06_26  [sketch_2026_06_26](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_06_26) [[py5](https://py5coding.org/)] --- ### sketch_2026_06_25  [sketch_2026_06_25](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_06_25) [[py5](https://py5coding.org/)] --- ### sketch_2026_06_24  [sketch_2026_06_24](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_06_24) [[py5](https://py5coding.org/)] --- ### sketch_2026_06_22  [sketch_2026_06_22](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_06_22) [[py5](https://py5coding.org/)] WIP --- ### sketch_2026_06_21  [sketch_2026_06_21](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_06_21) [[py5](https://py5coding.org/)] WIP, it was easy and fun to add sound using the Processing Sound library... let's see if I can post a capture with sound... --- ### sketch_2026_06_20  [sketch_2026_06_20](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_06_20) [[py5](https://py5coding.org/)] WIP memory game, maybe --- ### sketch_2026_06_19  [sketch_2026_06_19](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_06_19) [[py5](https://py5coding.org/)] WIP of a memory game, maybe --- ### sketch_2026_06_18  [sketch_2026_06_18](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_06_18) [[py5](https://py5coding.org/)] WIP of a memory game, maybe --- ### sketch_2026_06_17  [sketch_2026_06_17](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_06_17) [[py5](https://py5coding.org/)] --- ### sketch_2026_06_16  [sketch_2026_06_16](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_06_16) [[py5](https://py5coding.org/)] --- ### sketch_2026_06_15  [sketch_2026_06_15](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_06_15) [[py5](https://py5coding.org/)] --- ### sketch_2026_06_14  [sketch_2026_06_14](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_06_14) [[py5](https://py5coding.org/)] --- ### sketch_2026_06_13  [sketch_2026_06_13](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_06_13) [[py5](https://py5coding.org/)] --- ### sketch_2026_06_12  [sketch_2026_06_12](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_06_12) [[py5](https://py5coding.org/)] --- ### sketch_2026_06_11  [sketch_2026_06_11](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_06_11) [[py5](https://py5coding.org/)] --- ### sketch_2026_06_10  [sketch_2026_06_10](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_06_10) [[py5](https://py5coding.org/)] --- ### sketch_2026_06_09  [sketch_2026_06_09](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_06_09) [[py5](https://py5coding.org/)] --- ### sketch_2026_06_08  [sketch_2026_06_08](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_06_08) [[py5](https://py5coding.org/)] --- ### sketch_2026_06_07  [sketch_2026_06_07](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_06_07) [[py5](https://py5coding.org/)] --- ### sketch_2026_06_06  [sketch_2026_06_06](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_06_06) [[py5](https://py5coding.org/)] Now I think I got it exactly! (https://freeradical.zone/@bitartbot/116696573113492478) --- ### sketch_2026_06_05  [sketch_2026_06_05](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_06_05) [[py5](https://py5coding.org/)] inspired by https://freeradical.zone/@bitartbot/116696573113492478 f(x,y) = ((((y % 9) * (~y)) & (-(x & x))) ^ (~((-y) ^ (-y)))) % 6 --- ### sketch_2026_06_04  [sketch_2026_06_04](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_06_04) [[py5](https://py5coding.org/)] #LSystem --- ### sketch_2026_06_03  [sketch_2026_06_03](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_06_03) [[py5](https://py5coding.org/)] #LSytem --- ### sketch_2026_06_02  [sketch_2026_06_02](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_06_02) [[py5](https://py5coding.org/)] #SãoPaulo map made with #geopandas + #folium + social vulnerabilirty index data from GeoSampa. A heavy but interactive version at https://abav.lugaralgum.com/sketch-a-day/2026/sketch_2026_06_02/mapa.html --- ### sketch_2026_06_01  [sketch_2026_06_01](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_06_01) [[py5](https://py5coding.org/)] More slider experiments... --- ### sketch_2026_05_31  [sketch_2026_05_31](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_05_31) [[py5](https://py5coding.org/)] I think I'm going to revisit my silly Slider class... I can use ControlP5 with py5 but for some reason I always want to fiddle with this myself. At some point I had a Frankenstein Sliders+Arduino+Pots hybrid... --- ### sketch_2026_05_30  [sketch_2026_05_30](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_05_30) [[py5](https://py5coding.org/)] #Arduino + #telemetrix + #rotaryEncoder testing... --- ### sketch_2026_05_29  [sketch_2026_05_29](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_05_29) [[py5](https://py5coding.org/)] #Arduino + #telemetrix + #rotaryEncoder testing... --- ### sketch_2026_05_28  [sketch_2026_05_28](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_05_28) [[py5](https://py5coding.org/)] Experimenting with #telemetrix, a Python tool for serial comms with an #Arduino board (replacing #pyfirmata). Trying out rotary encoders... --- ### sketch_2026_05_27  [sketch_2026_05_27](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_05_27) [[py5](https://py5coding.org/)] --- ### sketch_2026_05_26  [sketch_2026_05_26](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_05_26) [[py5](https://py5coding.org/)] --- ### sketch_2026_05_25  [sketch_2026_05_25](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_05_25) [[py5](https://py5coding.org/)] --- ### sketch_2026_05_24  [sketch_2026_05_24](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_05_24) [[py5](https://py5coding.org/)] --- ### sketch_2026_05_23  [sketch_2026_05_23](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_05_23) [[py5](https://py5coding.org/)] --- ### sketch_2026_05_22  [sketch_2026_05_22](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_05_22) [[py5](https://py5coding.org/)] --- ### sketch_2026_05_21  [sketch_2026_05_21](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_05_21) [[py5](https://py5coding.org/)] --- ### sketch_2026_05_20  [sketch_2026_05_20](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_05_20) [[py5](https://py5coding.org/)] --- ### sketch_2026_05_19  [sketch_2026_05_19](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_05_19) [[py5](https://py5coding.org/)] --- ### sketch_2026_05_18  [sketch_2026_05_18](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_05_18) [[py5](https://py5coding.org/)] --- ### sketch_2026_05_17  [sketch_2026_05_17](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_05_17) [[py5](https://py5coding.org/)] Reviving a sketch/idea from 2018 :) --- ### sketch_2026_05_16  [sketch_2026_05_16](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_05_16) [[py5](https://py5coding.org/)] Everything looks a bit fishy and broken on these latest sketches, because changing the rendering sizes is changing the number of combos found, which it shouldn't :( --- ### sketch_2026_05_15  [sketch_2026_05_15](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_05_15) [[py5](https://py5coding.org/)] --- ### sketch_2026_05_14  [sketch_2026_05_14](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_05_14) [[py5](https://py5coding.org/)] WIP --- ### sketch_2026_05_13  [sketch_2026_05_13](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_05_13) [[py5](https://py5coding.org/)] --- ### sketch_2026_05_12  [sketch_2026_05_12](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_05_12) [[py5](https://py5coding.org/)] 57 closed loops made from 4 segments on a 3x3 grid of points. --- ### sketch_2026_05_11  [sketch_2026_05_11](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_05_11) [[py5](https://py5coding.org/)] --- ### sketch_2026_05_10  [sketch_2026_05_10](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_05_10) [[py5](https://py5coding.org/)] 261 combinations of 3 connected segments, on a 3x3 grid of points. Removing rotations and translations. --- ### sketch_2026_05_09  [sketch_2026_05_09](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_05_09) [[py5](https://py5coding.org/)] --- ### sketch_2026_05_08  [sketch_2026_05_08](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_05_08) [[py5](https://py5coding.org/)] --- ### sketch_2026_05_07  [sketch_2026_05_07](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_05_07) [[py5](https://py5coding.org/)] --- ### sketch_2026_05_06  [sketch_2026_05_06](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_05_06) [[py5](https://py5coding.org/)] --- ### sketch_2026_05_05  [sketch_2026_05_05](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_05_05) [[py5](https://py5coding.org/)] --- ### sketch_2026_05_04  [sketch_2026_05_04](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_05_04) [[py5](https://py5coding.org/)] --- ### sketch_2026_05_03  [sketch_2026_05_03](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_05_03) [[py5](https://py5coding.org/)] Reviving a sketch from 2018... --- ### sketch_2026_05_02  [sketch_2026_05_02](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_05_02) [[py5](https://py5coding.org/)] --- ### sketch_2026_05_01  [sketch_2026_05_01](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_05_01) [[py5](https://py5coding.org/)] --- ### sketch_2026_04_30  [sketch_2026_04_30](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_04_30) [[py5](https://py5coding.org/)] --- ### sketch_2026_04_29  [sketch_2026_04_29](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_04_29) [[py5](https://py5coding.org/)] --- ### sketch_2026_04_28  [sketch_2026_04_28](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_04_28) [[py5](https://py5coding.org/)] --- ### sketch_2026_04_27  [sketch_2026_04_27](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_04_27) [[py5](https://py5coding.org/)] --- ### sketch_2026_04_26  [sketch_2026_04_26](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_04_26) [[py5](https://py5coding.org/)] --- ### sketch_2026_04_25  [sketch_2026_04_25](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_04_25) [[py5](https://py5coding.org/)] --- ### sketch_2026_04_24  [sketch_2026_04_24](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_04_24) [[py5](https://py5coding.org/)] --- ### sketch_2026_04_23  [sketch_2026_04_23](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_04_23) [[py5](https://py5coding.org/)] --- ### sketch_2026_04_22  [sketch_2026_04_22](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_04_22) [[py5](https://py5coding.org/)] --- ### sketch_2026_04_21  [sketch_2026_04_21](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_04_21) [[py5](https://py5coding.org/)] --- ### sketch_2026_04_20  [sketch_2026_04_20](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_04_20) [[py5](https://py5coding.org/)] --- ### sketch_2026_04_19  [sketch_2026_04_19](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_04_19) [[py5](https://py5coding.org/)] #pymunk studies... spring WIP --- ### sketch_2026_04_18  [sketch_2026_04_18](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_04_18) [[py5](https://py5coding.org/)] Another attempt at improving an old "Particle Life" sketch... --- ### sketch_2026_04_17  [sketch_2026_04_17](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_04_17) [[py5](https://py5coding.org/)] --- ### sketch_2026_04_16  [sketch_2026_04_16](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_04_16) [[py5](https://py5coding.org/)] --- ### sketch_2026_04_15  [sketch_2026_04_15](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_04_15) [[py5](https://py5coding.org/)] WIP #QuadraticCurve --- ### sketch_2026_04_14  [sketch_2026_04_14](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_04_14) [[py5](https://py5coding.org/)] Sketch feito na última aula do curso para o MAM-SP... uma turma muito legal, foi um prazer. --- ### sketch_2026_04_13  [sketch_2026_04_13](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_04_13) [[py5](https://py5coding.org/)] --- ### sketch_2026_04_12  [sketch_2026_04_12](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_04_12) [[py5](https://py5coding.org/)] Adding some old code for handling #shapely MultiPolygons and Polygons with holes to my #pymunk wrapper :) --- ### sketch_2026_04_11  [sketch_2026_04_11](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_04_11) [[py5](https://py5coding.org/)] Zero-gravity study of #pymunk PinJoint and PivotJoint, --- ### sketch_2026_04_10  [sketch_2026_04_10](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_04_10) [[py5](https://py5coding.org/)] --- ### sketch_2026_04_09  [sketch_2026_04_09](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_04_09) [[py5](https://py5coding.org/)] L-System from today's activity at Sesc. --- ### sketch_2026_04_08  [sketch_2026_04_08](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_04_08) [[py5](https://py5coding.org/)] More #pymunk experiments, I think I have a basic "experimental helpers" module with a few wrapper classes. --- ### sketch_2026_04_06  [sketch_2026_04_06](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_04_06) [[py5](https://py5coding.org/)] --- ### sketch_2026_04_05  [sketch_2026_04_05](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_04_05) [[py5](https://py5coding.org/)] --- ### sketch_2026_04_04  [sketch_2026_04_04](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_04_04) [[py5](https://py5coding.org/)] WIP I'm pursuing an idea I discussed with Ramalho once about making some thin class wrappers around #pymunk objects to simplify creation (and py5 drawing) of the simulations. --- ### sketch_2026_04_03  [sketch_2026_04_03](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_04_03) [[py5](https://py5coding.org/)] --- ### sketch_2026_04_02  [sketch_2026_04_02](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_04_02) [[py5](https://py5coding.org/)] A small #pymunk demo I've built today at Sesc... --- ### sketch_2026_04_01  [sketch_2026_04_01](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_04_01) [[py5](https://py5coding.org/)] --- ### sketch_2026_03_31  [sketch_2026_03_31](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_03_31) [[py5](https://py5coding.org/)] --- ### sketch_2026_03_30  [sketch_2026_03_30](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_03_30) [[py5](https://py5coding.org/)] --- ### sketch_2026_03_29  [sketch_2026_03_29](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_03_29) [[py5](https://py5coding.org/)] --- ### sketch_2026_03_28  [sketch_2026_03_28](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_03_28) [[py5](https://py5coding.org/)] Obrigado aos amigos do LHC (Laboratório Hacker de Campinas) pelo dia sensacional! --- ### sketch_2026_03_27  [sketch_2026_03_27](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_03_27) [[py5](https://py5coding.org/)] Today my father would have been 91 years old. --- ### sketch_2026_03_26  [sketch_2026_03_26](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_03_26) [[py5](https://py5coding.org/)] --- ### sketch_2026_03_25  [sketch_2026_03_25](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_03_25) [[py5](https://py5coding.org/)] WIP... #Typography --- ### sketch_2026_03_24  [sketch_2026_03_24](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_03_24) [[py5](https://py5coding.org/)] --- ### sketch_2026_03_23  [sketch_2026_03_23](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_03_23) [[py5](https://py5coding.org/)] --- ### sketch_2026_03_22  [sketch_2026_03_22](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_03_22) [[py5](https://py5coding.org/)] --- ### sketch_2026_03_21  [sketch_2026_03_21](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_03_21) [[py5](https://py5coding.org/)] --- ### sketch_2026_03_20  [sketch_2026_03_20](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_03_20) [[py5](https://py5coding.org/)] #scipy minimal spanning tree --- ### sketch_2026_03_19  [sketch_2026_03_19](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_03_19) [[py5](https://py5coding.org/)] Dürer meets py5 https://en.wikipedia.org/wiki/Melencolia_I (thank you for the vertex data @introscopia!) --- ### sketch_2026_03_18  [sketch_2026_03_18](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_03_18) [[py5](https://py5coding.org/)] 322 combinations of 3 segments from 3x3 grid of points, avoiding rotations. --- ### sketch_2026_03_17  [sketch_2026_03_17](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_03_17) [[py5](https://py5coding.org/)] 1300 combinations of 3 connected line segments from a 3x3 grid of points. --- ### sketch_2026_03_16  [sketch_2026_03_16](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_03_16) [[py5](https://py5coding.org/)] 228 pairs of segments from a 3x3 grid that share a point *and* don't align or overlap. --- ### sketch_2026_03_15  [sketch_2026_03_15](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_03_15) [[py5](https://py5coding.org/)] 378 two-segment combinations from a 3x3 grid. Ordered and colored by segment length. --- ### sketch_2026_03_14  [sketch_2026_03_14](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_03_14) [[py5](https://py5coding.org/)] 1260 combinations of 3 line segments on a 3x3 grid of points. The segments must not have endings in common. --- ### sketch_2026_03_13  [sketch_2026_03_13](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_03_13) [[py5](https://py5coding.org/)] Same 945 combinations of 4 lines from a 3x3 grid of points. Lines are now colored according to their angle. --- ### sketch_2026_03_12   [sketch_2026_03_12](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_03_12) [[py5](https://py5coding.org/)] 945 combinations of 4 lines on a 3x3 grid: the lines have no shared vertices --- ### sketch_2026_03_11  [sketch_2026_03_11](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_03_11) [[py5](https://py5coding.org/)] 100 of the 1890 combinations of 4 connected lines on a 3x3 grid... WIP. --- ### sketch_2026_03_10  [sketch_2026_03_10](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_03_10) [[py5](https://py5coding.org/)] Inspired by https://internet-janitor.itch.io/wigglypaint --- ### sketch_2026_03_09  [sketch_2026_03_09](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_03_09) [[py5](https://py5coding.org/)] Inpired by Wiggly Paint (https://internet-janitor.itch.io/wigglypaint) - See also https://beyondloom.com/blog/onwigglypaint.html --- ### sketch_2026_03_08  [sketch_2026_03_08](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_03_08) [[py5](https://py5coding.org/)] 516 triangles on a 4x4 grid of points, avoiding duplicates with whole grid rotation, but not duplicates whit translations (& possible rotations) of the triangles inside the grid. --- ### sketch_2026_03_07  [sketch_2026_03_07](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_03_07) [[py5](https://py5coding.org/)] --- ### sketch_2026_03_06  [sketch_2026_03_06](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_03_06) [[py5](https://py5coding.org/)] Based on the code written yesterday at the "drawing with code open atelier" at Sesc. Using images from Wikimedia Commons! :) --- ### sketch_2026_03_05  [sketch_2026_03_05](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_03_05) [[py5](https://py5coding.org/)] Another #CellularAutomata experiment --- ### sketch_2026_03_04  [sketch_2026_03_04](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_03_04) [[py5](https://py5coding.org/)] #CellularAutomata with a 16 cell neighborhood: (-1, -1), ( 0, -1), (1, -1), (-1, 0), ( 1, 0), (-1, 1), (0, 1), ( 1, 1), (-2, -2), ( 0, -4), (2, -2), (-4, 0), ( 4, 0), (-2, 2), (0, 4), ( 2, 2) --- ### sketch_2026_03_03  [sketch_2026_03_03](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_03_03) [[py5](https://py5coding.org/)] Changing Conway's neighborhood rules is a quick way to explore closely related #CellularAutomata ... also circles! --- ### sketch_2026_03_02  [sketch_2026_03_02](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_03_02) [[py5](https://py5coding.org/)] Calculation of #Conway's #GameOfLife was already very fast with #Numpy, but drawing was slow (squares and text...) now this is *so* fast... with vectorized `py5.points()` getting arrays of points to draw as squares with `py5.stroke_cap(py5.PROJECT)`. Check it out! --- ### sketch_2026_03_01  [sketch_2026_03_01](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_03_01) [[py5](https://py5coding.org/)] --- ### sketch_2026_02_28  [sketch_2026_02_28](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_02_28) [[py5](https://py5coding.org/)] Preparing a bit for teaching my #CellularAutomata class a few times this semester.#WIP #ConwaysGameOfLife with #numpy --- ### sketch_2026_02_27  [sketch_2026_02_27](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_02_27) [[py5](https://py5coding.org/)] Back to some #numpy + #OpenSimplexNoise studies... --- ### sketch_2026_02_26  [sketch_2026_02_26](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_02_26) [[py5](https://py5coding.org/)] 979 ways of dividing a square with a 3x3 grid of points (980 if you count not dividing the square at all as one!) --- ### sketch_2026_02_25  [sketch_2026_02_25](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_02_25) [[py5](https://py5coding.org/)] 979 ways of dividing a 3x3 grid of points into polygons. Did I miss any? I hope not. The polys are colored according to the number of vertices. --- ### sketch_2026_02_24  [sketch_2026_02_24](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_02_24) [[py5](https://py5coding.org/)] WIP / debug view: #shapely union is generating some bad polygons maybe subdivided edges or badly behaving vertices?) I have to figure out how to fix them. --- ### sketch_2026_02_23  [sketch_2026_02_23](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_02_23) [[py5](https://py5coding.org/)] 197 ways of dividing a grid of 3x3 points into triangles. Removing rotations. I have done this before, but it has been fun doing it again from scratch I like the strategy this time much better. --- ### sketch_2026_02_22  [sketch_2026_02_22](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_02_22) [[py5](https://py5coding.org/)] 270 pairs of non-overlapping triangles from a 3x3 grid of points. Removing rotations. --- ### sketch_2026_02_21  [sketch_2026_02_21](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_02_21) [[py5](https://py5coding.org/)] WIP: A first attempt at rendering a dictionary that shows on each row, at the start on the left, one of the 76 triangles that can be drawn on a 3x3 grid, then all the other triangles that do not overlapp with it. Tweaked the next day... --- ### sketch_2026_02_20  [sketch_2026_02_20](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_02_20) [[py5](https://py5coding.org/)] The 23 ways of dividing a 3x3 grid into 2, 3 and 4 triangles, excluding rotations. --- ### sketch_2026_02_19  [sketch_2026_02_19](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_02_19) [[py5](https://py5coding.org/)] 244 ways of dividing a 3 x 3 grid of points into 6 triangles. --- ### sketch_2026_02_18  [sketch_2026_02_18](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_02_18) [[py5](https://py5coding.org/)] 471 of 1703 triangulations of the 3 x 3 grid --- ### sketch_2026_02_17  [sketch_2026_02_17](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_02_17) [[py5](https://py5coding.org/)] --- ### sketch_2026_02_16  [sketch_2026_02_16](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_02_16) [[py5](https://py5coding.org/)] --- ### sketch_2026_02_15  [sketch_2026_02_15](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_02_15) [[py5](https://py5coding.org/)] --- ### sketch_2026_02_14  [sketch_2026_02_14](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_02_14) [[py5](https://py5coding.org/)] --- ### sketch_2026_02_13  [sketch_2026_02_13](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_02_13) [[py5](https://py5coding.org/)] --- ### sketch_2026_02_12  [sketch_2026_02_12](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_02_12) [[py5](https://py5coding.org/)] This sketch was made during an activity at Sesc today :) --- ### sketch_2026_02_11  [sketch_2026_02_11](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_02_11) [[py5](https://py5coding.org/)] --- ### sketch_2026_02_10  [sketch_2026_02_10](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_02_10) [[py5](https://py5coding.org/)] --- ### sketch_2026_02_09  [sketch_2026_02_09](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_02_09) [[py5](https://py5coding.org/)] --- ### sketch_2026_02_08  [sketch_2026_02_08](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_02_08) [[py5](https://py5coding.org/)] --- ### sketch_2026_02_07  [sketch_2026_02_07](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_02_07) [[py5](https://py5coding.org/)] --- ### sketch_2026_02_06  [sketch_2026_02_06](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_02_06) [[py5](https://py5coding.org/)] --- ### sketch_2026_02_05  [sketch_2026_02_05](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_02_05) [[py5](https://py5coding.org/)] --- ### sketch_2026_02_04  [sketch_2026_02_04](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_02_04) [[py5](https://py5coding.org/)] --- ### sketch_2026_02_03  [sketch_2026_02_03](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_02_03) [[py5](https://py5coding.org/)] --- ### sketch_2026_02_02  [sketch_2026_02_02](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_02_02) [[py5](https://py5coding.org/)] WIP... --- ### sketch_2026_02_01  [sketch_2026_02_01](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_02_01) [[py5](https://py5coding.org/)] --- ### sketch_2026_01_31  [sketch_2026_01_31](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_01_31) [[py5](https://py5coding.org/)] I'm restarting my shape subdivision ideas, this time with simpler structures (maybe?) instead of an object oriented "Shape" class. --- ### sketch_2026_01_30  [sketch_2026_01_30](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_01_30) [[py5](https://py5coding.org/)] --- ### sketch_2026_01_29  [sketch_2026_01_29](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_01_29) [[py5](https://py5coding.org/)] --- ### sketch_2026_01_28  [sketch_2026_01_28](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_01_28) [[py5](https://py5coding.org/)] A crude attempt at a noisy brush #PerlinNoise --- ### sketch_2026_01_27  [sketch_2026_01_27](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_01_27) [[py5](https://py5coding.org/)] --- ### sketch_2026_01_26  [sketch_2026_01_26](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_01_26) [[py5](https://py5coding.org/)] --- ### sketch_2026_01_25  [sketch_2026_01_25](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_01_25) [[py5](https://py5coding.org/)] --- ### sketch_2026_01_24  [sketch_2026_01_24](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_01_24) [[py5](https://py5coding.org/)] `py5.blend_mode(py5.MULTIPLY)` --- ### sketch_2026_01_23  [sketch_2026_01_23](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_01_23) [[py5](https://py5coding.org/)] --- ### sketch_2026_01_22  [sketch_2026_01_22](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_01_22) [[py5](https://py5coding.org/)] I enjoyed this one, randomizing the widths of rows and columns of a grid then applying a #TSP strategy. #genuary #genuary22 #genuary2026 --- ### sketch_2026_01_21  [sketch_2026_01_21](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_01_21) [[py5](https://py5coding.org/)] Ada meets Waldemar Cordeiro and Giorgio Moscati (Learn more about them at https://www.waldemarcordeiro.com/ & https://ekac.org/moscati.html) --- ### sketch_2026_01_20  [sketch_2026_01_20](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_01_20) [[py5](https://py5coding.org/)] --- ### sketch_2026_01_19  [sketch_2026_01_19](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_01_19) [[py5](https://py5coding.org/)] --- ### sketch_2026_01_18  [sketch_2026_01_18](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_01_18) [[py5](https://py5coding.org/)] 10000 steps of walker that turns 30° one way if the step is prime and 30° the other way. #genuary #genuary18 #genuary2026 --- ### sketch_2026_01_17  [sketch_2026_01_17](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_01_17) [[py5](https://py5coding.org/)] I'm not sure it would count as #genuary17 but I wanted to do this inspired by something I saw from @ranoya@vis.social #genuary #genuary2026 --- ### sketch_2026_01_16  [sketch_2026_01_16](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_01_16) [[py5](https://py5coding.org/)] --- ### sketch_2026_01_15  [sketch_2026_01_15](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_01_15) [[py5](https://py5coding.org/)] --- ### sketch_2026_01_14  [sketch_2026_01_14](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_01_14) [[py5](https://py5coding.org/)] --- ### sketch_2026_01_13  [sketch_2026_01_13](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_01_13) [[py5](https://py5coding.org/)] --- ### sketch_2026_01_12  [sketch_2026_01_12](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_01_12) [[py5](https://py5coding.org/)] #genuary #genuary12 #genuary2026 #3D boxes only --- ### sketch_2026_01_11  [sketch_2026_01_11](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_01_11) [[py5](https://py5coding.org/)] --- ### sketch_2026_01_10  [sketch_2026_01_10](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_01_10) [[py5](https://py5coding.org/)] #genuary #genuary10 #genurary2026 --- ### sketch_2026_01_09  [sketch_2026_01_09](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_01_09) [[py5](https://py5coding.org/)] Tweaking an old idea of coloring Wolfram's Automata #genuary #genuary9 #genuary2026 --- ### sketch_2026_01_08  [sketch_2026_01_08](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_01_08) [[py5](https://py5coding.org/)] #genuary #genuary8 #genuary2026 Tweaking a sketch from 2022... --- ### sketch_2026_01_07  [sketch_2026_01_07](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_01_07) [[py5](https://py5coding.org/)] The cool binary XOR based pattern I learned fron Ntsutae... now with #numpy #genuary #genuary7 #genuary2026 --- ### sketch_2026_01_06  [sketch_2026_01_06](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_01_06) [[py5](https://py5coding.org/)] #genuary6 #genuary #genurary2026 --- ### sketch_2026_01_05  [sketch_2026_01_05](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_01_05) [[py5](https://py5coding.org/)] In 2021 I was working on some older code for a silly glyph editor, I couldn't resurrect the editor (yet) but I could still read some pickled glyphs data! I hope I get back to these studies again. Note: be careful about loading pickled data from untrusted sources, there is a nasty risk of "arbitrary code execution". --- ### sketch_2026_01_04  [sketch_2026_01_04](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_01_04) [[py5](https://py5coding.org/)] #genuary4 #genuary #genuary2026 --- ### sketch_2026_01_03  [sketch_2026_01_03](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_01_03) [[py5](https://py5coding.org/)] Once I made a nice Fibonacci based animation, but this time I couldn't figure something I liked :( #genuary #genuary 3 #genuary2026 --- ### sketch_2026_01_02  [sketch_2026_01_02](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_01_02) [[py5](https://py5coding.org/)] #genuary2 #genuary #genuary2026 --- ### sketch_2026_01_01  [sketch_2026_01_01](https://github.com/villares/sketch-a-day/tree/main/2026/sketch_2026_01_01) [[py5](https://py5coding.org/)] #genuary #genuary1 #genuary2026 --- 2026 \| [2025](2025.md) \| [2024](2024.md) \| [2023](2023.md) \| [2022](2022.md) \| [2021](2021.md) \| [2020](2020.md) \| [2019](2019.md) \| [2018](2018.md) ---
The sketch-a-day project, images and code repository, by Alexandre B A Villares are licensed under Attribution-NonCommercial-NoDerivatives 4.0 International , except if marked/attributed otherwise in a file or code section. Please contact for licensing questions.