Skip to content

Instantly share code, notes, and snippets.

@Schaback
Last active June 4, 2025 12:55
Show Gist options
  • Save Schaback/f638c1ca026ab84d25798cc71d05ff2c to your computer and use it in GitHub Desktop.
Save Schaback/f638c1ca026ab84d25798cc71d05ff2c to your computer and use it in GitHub Desktop.
Pattern test
Display the source blob
Display the rendered blob
Raw
{
"metadata": {
"kernelspec": {
"name": "python",
"display_name": "Python (Pyodide)",
"language": "python"
},
"language_info": {
"codemirror_mode": {
"name": "python",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8"
}
},
"nbformat_minor": 5,
"nbformat": 4,
"cells": [
{
"id": "04c8360d-9afc-40ca-8145-9ba78219a4c0",
"cell_type": "markdown",
"source": "# PoC: Smaller Triangle Background Generation\nThis is another approach to generate the triangle background. \nHere, the file size does not scale proportional with the number of triangles, but with a repetition factor instead.\n\n\nHere is the full code. There is *some* optimization already in there, but there is a little bit more that could be done. Explanation below.",
"metadata": {}
},
{
"id": "0cd1d118-54d7-4c66-8e99-78414b0e02a7",
"cell_type": "code",
"source": "%pip install svgwrite\nimport random\n\nfrom IPython.core.display import SVG\nfrom svgwrite import Drawing\n\nX_STRIDE_WIDTH_COUNT = 4\nY_STRIDE_WIDTH_COUNT = 5\n\n\ndwg = Drawing(\"triangle_grid.svg\", size=(1000, 1000), profile=\"full\")\n# I screwed something up with the alignment, there is a ~1px gap between the triangles.\n# Probably has to do with the rotation if I had to guess. Principle should still work though:\ndwg.add(dwg.rect((0, 0), (\"100%\", \"100%\"), fill=\"black\"))\n\n# Triangle size\nsize = 100\n\npoints = [\n (0, 0),\n (0 + size, 0),\n (0 + size // 2, 0 + size // 2),\n]\n\nbg_rect = dwg.rect((0, 0), (\"100%\", \"100%\"))\ndwg.defs.add(bg_rect)\n\nfor x_offset in range(X_STRIDE_WIDTH_COUNT):\n for y_offset in range(Y_STRIDE_WIDTH_COUNT):\n color_channel = random.randint(15, 38)\n triangle = dwg.polygon(points, fill=f\"rgb({color_channel},{color_channel},{color_channel})\")\n dwg.defs.add(triangle)\n\n for rot in range(4):\n pattern = dwg.pattern(\n id=f\"t{rot}-{x_offset}-{y_offset}\",\n patternUnits=\"userSpaceOnUse\",\n x=x_offset * size,\n width=size * X_STRIDE_WIDTH_COUNT,\n y=y_offset * size,\n height=size * Y_STRIDE_WIDTH_COUNT,\n )\n pattern.rotate(rot * 90)\n pattern.add(dwg.use(triangle))\n dwg.defs.add(pattern)\n\n rect = dwg.use(bg_rect)\n rect.update(\n {\"fill\": f\"url(#t{rot}-{x_offset}-{y_offset})\"},\n )\n dwg.add(rect)\n\n\nprint(f\"Filesize: ~{len(dwg.tostring()) / 1000} kb\")\nSVG(data=dwg.tostring())",
"metadata": {
"trusted": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": "Filesize: ~18.113 kb\n"
},
{
"execution_count": 59,
"output_type": "execute_result",
"data": {
"text/plain": "<IPython.core.display.SVG object>",
"image/svg+xml": "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:ev=\"http://www.w3.org/2001/xml-events\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" baseProfile=\"full\" height=\"1000\" version=\"1.1\" width=\"1000\"><defs><rect height=\"100%\" id=\"id794\" width=\"100%\" x=\"0\" y=\"0\"/><polygon fill=\"rgb(22,22,22)\" id=\"id793\" points=\"0,0 100,0 50,50\"/><pattern height=\"500\" id=\"t0-0-0\" patternTransform=\"rotate(0)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"0\" y=\"0\"><use xlink:href=\"#id793\"/></pattern><pattern height=\"500\" id=\"t1-0-0\" patternTransform=\"rotate(90)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"0\" y=\"0\"><use xlink:href=\"#id793\"/></pattern><pattern height=\"500\" id=\"t2-0-0\" patternTransform=\"rotate(180)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"0\" y=\"0\"><use xlink:href=\"#id793\"/></pattern><pattern height=\"500\" id=\"t3-0-0\" patternTransform=\"rotate(270)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"0\" y=\"0\"><use xlink:href=\"#id793\"/></pattern><polygon fill=\"rgb(37,37,37)\" id=\"id795\" points=\"0,0 100,0 50,50\"/><pattern height=\"500\" id=\"t0-0-1\" patternTransform=\"rotate(0)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"0\" y=\"100\"><use xlink:href=\"#id795\"/></pattern><pattern height=\"500\" id=\"t1-0-1\" patternTransform=\"rotate(90)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"0\" y=\"100\"><use xlink:href=\"#id795\"/></pattern><pattern height=\"500\" id=\"t2-0-1\" patternTransform=\"rotate(180)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"0\" y=\"100\"><use xlink:href=\"#id795\"/></pattern><pattern height=\"500\" id=\"t3-0-1\" patternTransform=\"rotate(270)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"0\" y=\"100\"><use xlink:href=\"#id795\"/></pattern><polygon fill=\"rgb(30,30,30)\" id=\"id796\" points=\"0,0 100,0 50,50\"/><pattern height=\"500\" id=\"t0-0-2\" patternTransform=\"rotate(0)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"0\" y=\"200\"><use xlink:href=\"#id796\"/></pattern><pattern height=\"500\" id=\"t1-0-2\" patternTransform=\"rotate(90)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"0\" y=\"200\"><use xlink:href=\"#id796\"/></pattern><pattern height=\"500\" id=\"t2-0-2\" patternTransform=\"rotate(180)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"0\" y=\"200\"><use xlink:href=\"#id796\"/></pattern><pattern height=\"500\" id=\"t3-0-2\" patternTransform=\"rotate(270)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"0\" y=\"200\"><use xlink:href=\"#id796\"/></pattern><polygon fill=\"rgb(38,38,38)\" id=\"id797\" points=\"0,0 100,0 50,50\"/><pattern height=\"500\" id=\"t0-0-3\" patternTransform=\"rotate(0)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"0\" y=\"300\"><use xlink:href=\"#id797\"/></pattern><pattern height=\"500\" id=\"t1-0-3\" patternTransform=\"rotate(90)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"0\" y=\"300\"><use xlink:href=\"#id797\"/></pattern><pattern height=\"500\" id=\"t2-0-3\" patternTransform=\"rotate(180)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"0\" y=\"300\"><use xlink:href=\"#id797\"/></pattern><pattern height=\"500\" id=\"t3-0-3\" patternTransform=\"rotate(270)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"0\" y=\"300\"><use xlink:href=\"#id797\"/></pattern><polygon fill=\"rgb(20,20,20)\" id=\"id798\" points=\"0,0 100,0 50,50\"/><pattern height=\"500\" id=\"t0-0-4\" patternTransform=\"rotate(0)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"0\" y=\"400\"><use xlink:href=\"#id798\"/></pattern><pattern height=\"500\" id=\"t1-0-4\" patternTransform=\"rotate(90)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"0\" y=\"400\"><use xlink:href=\"#id798\"/></pattern><pattern height=\"500\" id=\"t2-0-4\" patternTransform=\"rotate(180)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"0\" y=\"400\"><use xlink:href=\"#id798\"/></pattern><pattern height=\"500\" id=\"t3-0-4\" patternTransform=\"rotate(270)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"0\" y=\"400\"><use xlink:href=\"#id798\"/></pattern><polygon fill=\"rgb(30,30,30)\" id=\"id799\" points=\"0,0 100,0 50,50\"/><pattern height=\"500\" id=\"t0-1-0\" patternTransform=\"rotate(0)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"100\" y=\"0\"><use xlink:href=\"#id799\"/></pattern><pattern height=\"500\" id=\"t1-1-0\" patternTransform=\"rotate(90)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"100\" y=\"0\"><use xlink:href=\"#id799\"/></pattern><pattern height=\"500\" id=\"t2-1-0\" patternTransform=\"rotate(180)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"100\" y=\"0\"><use xlink:href=\"#id799\"/></pattern><pattern height=\"500\" id=\"t3-1-0\" patternTransform=\"rotate(270)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"100\" y=\"0\"><use xlink:href=\"#id799\"/></pattern><polygon fill=\"rgb(33,33,33)\" id=\"id800\" points=\"0,0 100,0 50,50\"/><pattern height=\"500\" id=\"t0-1-1\" patternTransform=\"rotate(0)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"100\" y=\"100\"><use xlink:href=\"#id800\"/></pattern><pattern height=\"500\" id=\"t1-1-1\" patternTransform=\"rotate(90)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"100\" y=\"100\"><use xlink:href=\"#id800\"/></pattern><pattern height=\"500\" id=\"t2-1-1\" patternTransform=\"rotate(180)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"100\" y=\"100\"><use xlink:href=\"#id800\"/></pattern><pattern height=\"500\" id=\"t3-1-1\" patternTransform=\"rotate(270)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"100\" y=\"100\"><use xlink:href=\"#id800\"/></pattern><polygon fill=\"rgb(35,35,35)\" id=\"id801\" points=\"0,0 100,0 50,50\"/><pattern height=\"500\" id=\"t0-1-2\" patternTransform=\"rotate(0)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"100\" y=\"200\"><use xlink:href=\"#id801\"/></pattern><pattern height=\"500\" id=\"t1-1-2\" patternTransform=\"rotate(90)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"100\" y=\"200\"><use xlink:href=\"#id801\"/></pattern><pattern height=\"500\" id=\"t2-1-2\" patternTransform=\"rotate(180)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"100\" y=\"200\"><use xlink:href=\"#id801\"/></pattern><pattern height=\"500\" id=\"t3-1-2\" patternTransform=\"rotate(270)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"100\" y=\"200\"><use xlink:href=\"#id801\"/></pattern><polygon fill=\"rgb(32,32,32)\" id=\"id802\" points=\"0,0 100,0 50,50\"/><pattern height=\"500\" id=\"t0-1-3\" patternTransform=\"rotate(0)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"100\" y=\"300\"><use xlink:href=\"#id802\"/></pattern><pattern height=\"500\" id=\"t1-1-3\" patternTransform=\"rotate(90)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"100\" y=\"300\"><use xlink:href=\"#id802\"/></pattern><pattern height=\"500\" id=\"t2-1-3\" patternTransform=\"rotate(180)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"100\" y=\"300\"><use xlink:href=\"#id802\"/></pattern><pattern height=\"500\" id=\"t3-1-3\" patternTransform=\"rotate(270)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"100\" y=\"300\"><use xlink:href=\"#id802\"/></pattern><polygon fill=\"rgb(31,31,31)\" id=\"id803\" points=\"0,0 100,0 50,50\"/><pattern height=\"500\" id=\"t0-1-4\" patternTransform=\"rotate(0)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"100\" y=\"400\"><use xlink:href=\"#id803\"/></pattern><pattern height=\"500\" id=\"t1-1-4\" patternTransform=\"rotate(90)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"100\" y=\"400\"><use xlink:href=\"#id803\"/></pattern><pattern height=\"500\" id=\"t2-1-4\" patternTransform=\"rotate(180)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"100\" y=\"400\"><use xlink:href=\"#id803\"/></pattern><pattern height=\"500\" id=\"t3-1-4\" patternTransform=\"rotate(270)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"100\" y=\"400\"><use xlink:href=\"#id803\"/></pattern><polygon fill=\"rgb(19,19,19)\" id=\"id804\" points=\"0,0 100,0 50,50\"/><pattern height=\"500\" id=\"t0-2-0\" patternTransform=\"rotate(0)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"200\" y=\"0\"><use xlink:href=\"#id804\"/></pattern><pattern height=\"500\" id=\"t1-2-0\" patternTransform=\"rotate(90)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"200\" y=\"0\"><use xlink:href=\"#id804\"/></pattern><pattern height=\"500\" id=\"t2-2-0\" patternTransform=\"rotate(180)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"200\" y=\"0\"><use xlink:href=\"#id804\"/></pattern><pattern height=\"500\" id=\"t3-2-0\" patternTransform=\"rotate(270)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"200\" y=\"0\"><use xlink:href=\"#id804\"/></pattern><polygon fill=\"rgb(36,36,36)\" id=\"id805\" points=\"0,0 100,0 50,50\"/><pattern height=\"500\" id=\"t0-2-1\" patternTransform=\"rotate(0)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"200\" y=\"100\"><use xlink:href=\"#id805\"/></pattern><pattern height=\"500\" id=\"t1-2-1\" patternTransform=\"rotate(90)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"200\" y=\"100\"><use xlink:href=\"#id805\"/></pattern><pattern height=\"500\" id=\"t2-2-1\" patternTransform=\"rotate(180)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"200\" y=\"100\"><use xlink:href=\"#id805\"/></pattern><pattern height=\"500\" id=\"t3-2-1\" patternTransform=\"rotate(270)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"200\" y=\"100\"><use xlink:href=\"#id805\"/></pattern><polygon fill=\"rgb(17,17,17)\" id=\"id806\" points=\"0,0 100,0 50,50\"/><pattern height=\"500\" id=\"t0-2-2\" patternTransform=\"rotate(0)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"200\" y=\"200\"><use xlink:href=\"#id806\"/></pattern><pattern height=\"500\" id=\"t1-2-2\" patternTransform=\"rotate(90)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"200\" y=\"200\"><use xlink:href=\"#id806\"/></pattern><pattern height=\"500\" id=\"t2-2-2\" patternTransform=\"rotate(180)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"200\" y=\"200\"><use xlink:href=\"#id806\"/></pattern><pattern height=\"500\" id=\"t3-2-2\" patternTransform=\"rotate(270)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"200\" y=\"200\"><use xlink:href=\"#id806\"/></pattern><polygon fill=\"rgb(29,29,29)\" id=\"id807\" points=\"0,0 100,0 50,50\"/><pattern height=\"500\" id=\"t0-2-3\" patternTransform=\"rotate(0)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"200\" y=\"300\"><use xlink:href=\"#id807\"/></pattern><pattern height=\"500\" id=\"t1-2-3\" patternTransform=\"rotate(90)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"200\" y=\"300\"><use xlink:href=\"#id807\"/></pattern><pattern height=\"500\" id=\"t2-2-3\" patternTransform=\"rotate(180)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"200\" y=\"300\"><use xlink:href=\"#id807\"/></pattern><pattern height=\"500\" id=\"t3-2-3\" patternTransform=\"rotate(270)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"200\" y=\"300\"><use xlink:href=\"#id807\"/></pattern><polygon fill=\"rgb(17,17,17)\" id=\"id808\" points=\"0,0 100,0 50,50\"/><pattern height=\"500\" id=\"t0-2-4\" patternTransform=\"rotate(0)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"200\" y=\"400\"><use xlink:href=\"#id808\"/></pattern><pattern height=\"500\" id=\"t1-2-4\" patternTransform=\"rotate(90)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"200\" y=\"400\"><use xlink:href=\"#id808\"/></pattern><pattern height=\"500\" id=\"t2-2-4\" patternTransform=\"rotate(180)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"200\" y=\"400\"><use xlink:href=\"#id808\"/></pattern><pattern height=\"500\" id=\"t3-2-4\" patternTransform=\"rotate(270)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"200\" y=\"400\"><use xlink:href=\"#id808\"/></pattern><polygon fill=\"rgb(18,18,18)\" id=\"id809\" points=\"0,0 100,0 50,50\"/><pattern height=\"500\" id=\"t0-3-0\" patternTransform=\"rotate(0)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"300\" y=\"0\"><use xlink:href=\"#id809\"/></pattern><pattern height=\"500\" id=\"t1-3-0\" patternTransform=\"rotate(90)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"300\" y=\"0\"><use xlink:href=\"#id809\"/></pattern><pattern height=\"500\" id=\"t2-3-0\" patternTransform=\"rotate(180)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"300\" y=\"0\"><use xlink:href=\"#id809\"/></pattern><pattern height=\"500\" id=\"t3-3-0\" patternTransform=\"rotate(270)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"300\" y=\"0\"><use xlink:href=\"#id809\"/></pattern><polygon fill=\"rgb(23,23,23)\" id=\"id810\" points=\"0,0 100,0 50,50\"/><pattern height=\"500\" id=\"t0-3-1\" patternTransform=\"rotate(0)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"300\" y=\"100\"><use xlink:href=\"#id810\"/></pattern><pattern height=\"500\" id=\"t1-3-1\" patternTransform=\"rotate(90)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"300\" y=\"100\"><use xlink:href=\"#id810\"/></pattern><pattern height=\"500\" id=\"t2-3-1\" patternTransform=\"rotate(180)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"300\" y=\"100\"><use xlink:href=\"#id810\"/></pattern><pattern height=\"500\" id=\"t3-3-1\" patternTransform=\"rotate(270)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"300\" y=\"100\"><use xlink:href=\"#id810\"/></pattern><polygon fill=\"rgb(34,34,34)\" id=\"id811\" points=\"0,0 100,0 50,50\"/><pattern height=\"500\" id=\"t0-3-2\" patternTransform=\"rotate(0)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"300\" y=\"200\"><use xlink:href=\"#id811\"/></pattern><pattern height=\"500\" id=\"t1-3-2\" patternTransform=\"rotate(90)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"300\" y=\"200\"><use xlink:href=\"#id811\"/></pattern><pattern height=\"500\" id=\"t2-3-2\" patternTransform=\"rotate(180)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"300\" y=\"200\"><use xlink:href=\"#id811\"/></pattern><pattern height=\"500\" id=\"t3-3-2\" patternTransform=\"rotate(270)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"300\" y=\"200\"><use xlink:href=\"#id811\"/></pattern><polygon fill=\"rgb(20,20,20)\" id=\"id812\" points=\"0,0 100,0 50,50\"/><pattern height=\"500\" id=\"t0-3-3\" patternTransform=\"rotate(0)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"300\" y=\"300\"><use xlink:href=\"#id812\"/></pattern><pattern height=\"500\" id=\"t1-3-3\" patternTransform=\"rotate(90)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"300\" y=\"300\"><use xlink:href=\"#id812\"/></pattern><pattern height=\"500\" id=\"t2-3-3\" patternTransform=\"rotate(180)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"300\" y=\"300\"><use xlink:href=\"#id812\"/></pattern><pattern height=\"500\" id=\"t3-3-3\" patternTransform=\"rotate(270)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"300\" y=\"300\"><use xlink:href=\"#id812\"/></pattern><polygon fill=\"rgb(38,38,38)\" id=\"id813\" points=\"0,0 100,0 50,50\"/><pattern height=\"500\" id=\"t0-3-4\" patternTransform=\"rotate(0)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"300\" y=\"400\"><use xlink:href=\"#id813\"/></pattern><pattern height=\"500\" id=\"t1-3-4\" patternTransform=\"rotate(90)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"300\" y=\"400\"><use xlink:href=\"#id813\"/></pattern><pattern height=\"500\" id=\"t2-3-4\" patternTransform=\"rotate(180)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"300\" y=\"400\"><use xlink:href=\"#id813\"/></pattern><pattern height=\"500\" id=\"t3-3-4\" patternTransform=\"rotate(270)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"300\" y=\"400\"><use xlink:href=\"#id813\"/></pattern></defs><rect fill=\"black\" height=\"100%\" width=\"100%\" x=\"0\" y=\"0\"/><use fill=\"url(#t0-0-0)\" xlink:href=\"#id794\"/><use fill=\"url(#t1-0-0)\" xlink:href=\"#id794\"/><use fill=\"url(#t2-0-0)\" xlink:href=\"#id794\"/><use fill=\"url(#t3-0-0)\" xlink:href=\"#id794\"/><use fill=\"url(#t0-0-1)\" xlink:href=\"#id794\"/><use fill=\"url(#t1-0-1)\" xlink:href=\"#id794\"/><use fill=\"url(#t2-0-1)\" xlink:href=\"#id794\"/><use fill=\"url(#t3-0-1)\" xlink:href=\"#id794\"/><use fill=\"url(#t0-0-2)\" xlink:href=\"#id794\"/><use fill=\"url(#t1-0-2)\" xlink:href=\"#id794\"/><use fill=\"url(#t2-0-2)\" xlink:href=\"#id794\"/><use fill=\"url(#t3-0-2)\" xlink:href=\"#id794\"/><use fill=\"url(#t0-0-3)\" xlink:href=\"#id794\"/><use fill=\"url(#t1-0-3)\" xlink:href=\"#id794\"/><use fill=\"url(#t2-0-3)\" xlink:href=\"#id794\"/><use fill=\"url(#t3-0-3)\" xlink:href=\"#id794\"/><use fill=\"url(#t0-0-4)\" xlink:href=\"#id794\"/><use fill=\"url(#t1-0-4)\" xlink:href=\"#id794\"/><use fill=\"url(#t2-0-4)\" xlink:href=\"#id794\"/><use fill=\"url(#t3-0-4)\" xlink:href=\"#id794\"/><use fill=\"url(#t0-1-0)\" xlink:href=\"#id794\"/><use fill=\"url(#t1-1-0)\" xlink:href=\"#id794\"/><use fill=\"url(#t2-1-0)\" xlink:href=\"#id794\"/><use fill=\"url(#t3-1-0)\" xlink:href=\"#id794\"/><use fill=\"url(#t0-1-1)\" xlink:href=\"#id794\"/><use fill=\"url(#t1-1-1)\" xlink:href=\"#id794\"/><use fill=\"url(#t2-1-1)\" xlink:href=\"#id794\"/><use fill=\"url(#t3-1-1)\" xlink:href=\"#id794\"/><use fill=\"url(#t0-1-2)\" xlink:href=\"#id794\"/><use fill=\"url(#t1-1-2)\" xlink:href=\"#id794\"/><use fill=\"url(#t2-1-2)\" xlink:href=\"#id794\"/><use fill=\"url(#t3-1-2)\" xlink:href=\"#id794\"/><use fill=\"url(#t0-1-3)\" xlink:href=\"#id794\"/><use fill=\"url(#t1-1-3)\" xlink:href=\"#id794\"/><use fill=\"url(#t2-1-3)\" xlink:href=\"#id794\"/><use fill=\"url(#t3-1-3)\" xlink:href=\"#id794\"/><use fill=\"url(#t0-1-4)\" xlink:href=\"#id794\"/><use fill=\"url(#t1-1-4)\" xlink:href=\"#id794\"/><use fill=\"url(#t2-1-4)\" xlink:href=\"#id794\"/><use fill=\"url(#t3-1-4)\" xlink:href=\"#id794\"/><use fill=\"url(#t0-2-0)\" xlink:href=\"#id794\"/><use fill=\"url(#t1-2-0)\" xlink:href=\"#id794\"/><use fill=\"url(#t2-2-0)\" xlink:href=\"#id794\"/><use fill=\"url(#t3-2-0)\" xlink:href=\"#id794\"/><use fill=\"url(#t0-2-1)\" xlink:href=\"#id794\"/><use fill=\"url(#t1-2-1)\" xlink:href=\"#id794\"/><use fill=\"url(#t2-2-1)\" xlink:href=\"#id794\"/><use fill=\"url(#t3-2-1)\" xlink:href=\"#id794\"/><use fill=\"url(#t0-2-2)\" xlink:href=\"#id794\"/><use fill=\"url(#t1-2-2)\" xlink:href=\"#id794\"/><use fill=\"url(#t2-2-2)\" xlink:href=\"#id794\"/><use fill=\"url(#t3-2-2)\" xlink:href=\"#id794\"/><use fill=\"url(#t0-2-3)\" xlink:href=\"#id794\"/><use fill=\"url(#t1-2-3)\" xlink:href=\"#id794\"/><use fill=\"url(#t2-2-3)\" xlink:href=\"#id794\"/><use fill=\"url(#t3-2-3)\" xlink:href=\"#id794\"/><use fill=\"url(#t0-2-4)\" xlink:href=\"#id794\"/><use fill=\"url(#t1-2-4)\" xlink:href=\"#id794\"/><use fill=\"url(#t2-2-4)\" xlink:href=\"#id794\"/><use fill=\"url(#t3-2-4)\" xlink:href=\"#id794\"/><use fill=\"url(#t0-3-0)\" xlink:href=\"#id794\"/><use fill=\"url(#t1-3-0)\" xlink:href=\"#id794\"/><use fill=\"url(#t2-3-0)\" xlink:href=\"#id794\"/><use fill=\"url(#t3-3-0)\" xlink:href=\"#id794\"/><use fill=\"url(#t0-3-1)\" xlink:href=\"#id794\"/><use fill=\"url(#t1-3-1)\" xlink:href=\"#id794\"/><use fill=\"url(#t2-3-1)\" xlink:href=\"#id794\"/><use fill=\"url(#t3-3-1)\" xlink:href=\"#id794\"/><use fill=\"url(#t0-3-2)\" xlink:href=\"#id794\"/><use fill=\"url(#t1-3-2)\" xlink:href=\"#id794\"/><use fill=\"url(#t2-3-2)\" xlink:href=\"#id794\"/><use fill=\"url(#t3-3-2)\" xlink:href=\"#id794\"/><use fill=\"url(#t0-3-3)\" xlink:href=\"#id794\"/><use fill=\"url(#t1-3-3)\" xlink:href=\"#id794\"/><use fill=\"url(#t2-3-3)\" xlink:href=\"#id794\"/><use fill=\"url(#t3-3-3)\" xlink:href=\"#id794\"/><use fill=\"url(#t0-3-4)\" xlink:href=\"#id794\"/><use fill=\"url(#t1-3-4)\" xlink:href=\"#id794\"/><use fill=\"url(#t2-3-4)\" xlink:href=\"#id794\"/><use fill=\"url(#t3-3-4)\" xlink:href=\"#id794\"/></svg>"
},
"metadata": {}
}
],
"execution_count": 59
},
{
"id": "85507178-6279-4c60-a97c-03c9ef7e577d",
"cell_type": "markdown",
"source": "Here is how it works.\nLet's use more distinct colors and only draw the \"top\" triangles.\nThe `X_STRIDE_WIDTH_COUNT` and `Y_STRIDE_WIDTH_COUNT`set the number of rows/columns before the pattern repeats. This is a trade-off between file size and visual effect and can be adjusted.\n\nIdeally, I would have liked to shift the pattern on repetition to make it evel less obious, but I couldn't find out how.",
"metadata": {}
},
{
"id": "2cca18a9-dc04-4a96-994d-e1982086b79e",
"cell_type": "code",
"source": "dwg = Drawing(\"triangle_grid.svg\", size=(1000, 1000), profile=\"full\")\n\n# Triangle size\nsize = 100\n\npoints = [\n (0, 0),\n (0 + size, 0),\n (0 + size // 2, 0 + size // 2),\n]\n\nbg_rect = dwg.rect((0, 0), (\"100%\", \"100%\"))\ndwg.defs.add(bg_rect)\n\nfor x_offset in range(X_STRIDE_WIDTH_COUNT):\n for y_offset in range(Y_STRIDE_WIDTH_COUNT):\n triangle = dwg.polygon(points, fill=f\"rgb(0,{x_offset*90},{y_offset*90})\")\n dwg.defs.add(triangle)\n\n for rot in range(1):\n pattern = dwg.pattern(\n id=f\"t{rot}-{x_offset}-{y_offset}\",\n patternUnits=\"userSpaceOnUse\",\n x=x_offset * size,\n width=size * X_STRIDE_WIDTH_COUNT,\n y=y_offset * size,\n height=size * Y_STRIDE_WIDTH_COUNT,\n )\n pattern.rotate(rot * 90)\n pattern.add(dwg.use(triangle))\n dwg.defs.add(pattern)\n\n rect = dwg.use(bg_rect)\n rect.update(\n {\"fill\": f\"url(#t{rot}-{x_offset}-{y_offset})\"},\n )\n dwg.add(rect)\n\nSVG(data=dwg.tostring())",
"metadata": {
"trusted": true
},
"outputs": [
{
"execution_count": 57,
"output_type": "execute_result",
"data": {
"text/plain": "<IPython.core.display.SVG object>",
"image/svg+xml": "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:ev=\"http://www.w3.org/2001/xml-events\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" baseProfile=\"full\" height=\"1000\" version=\"1.1\" width=\"1000\"><defs><rect height=\"100%\" id=\"id771\" width=\"100%\" x=\"0\" y=\"0\"/><polygon fill=\"rgb(0,0,0)\" id=\"id770\" points=\"0,0 100,0 50,50\"/><pattern height=\"500\" id=\"t0-0-0\" patternTransform=\"rotate(0)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"0\" y=\"0\"><use xlink:href=\"#id770\"/></pattern><polygon fill=\"rgb(0,0,90)\" id=\"id772\" points=\"0,0 100,0 50,50\"/><pattern height=\"500\" id=\"t0-0-1\" patternTransform=\"rotate(0)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"0\" y=\"100\"><use xlink:href=\"#id772\"/></pattern><polygon fill=\"rgb(0,0,180)\" id=\"id773\" points=\"0,0 100,0 50,50\"/><pattern height=\"500\" id=\"t0-0-2\" patternTransform=\"rotate(0)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"0\" y=\"200\"><use xlink:href=\"#id773\"/></pattern><polygon fill=\"rgb(0,0,270)\" id=\"id774\" points=\"0,0 100,0 50,50\"/><pattern height=\"500\" id=\"t0-0-3\" patternTransform=\"rotate(0)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"0\" y=\"300\"><use xlink:href=\"#id774\"/></pattern><polygon fill=\"rgb(0,0,360)\" id=\"id775\" points=\"0,0 100,0 50,50\"/><pattern height=\"500\" id=\"t0-0-4\" patternTransform=\"rotate(0)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"0\" y=\"400\"><use xlink:href=\"#id775\"/></pattern><polygon fill=\"rgb(0,90,0)\" id=\"id776\" points=\"0,0 100,0 50,50\"/><pattern height=\"500\" id=\"t0-1-0\" patternTransform=\"rotate(0)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"100\" y=\"0\"><use xlink:href=\"#id776\"/></pattern><polygon fill=\"rgb(0,90,90)\" id=\"id777\" points=\"0,0 100,0 50,50\"/><pattern height=\"500\" id=\"t0-1-1\" patternTransform=\"rotate(0)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"100\" y=\"100\"><use xlink:href=\"#id777\"/></pattern><polygon fill=\"rgb(0,90,180)\" id=\"id778\" points=\"0,0 100,0 50,50\"/><pattern height=\"500\" id=\"t0-1-2\" patternTransform=\"rotate(0)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"100\" y=\"200\"><use xlink:href=\"#id778\"/></pattern><polygon fill=\"rgb(0,90,270)\" id=\"id779\" points=\"0,0 100,0 50,50\"/><pattern height=\"500\" id=\"t0-1-3\" patternTransform=\"rotate(0)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"100\" y=\"300\"><use xlink:href=\"#id779\"/></pattern><polygon fill=\"rgb(0,90,360)\" id=\"id780\" points=\"0,0 100,0 50,50\"/><pattern height=\"500\" id=\"t0-1-4\" patternTransform=\"rotate(0)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"100\" y=\"400\"><use xlink:href=\"#id780\"/></pattern><polygon fill=\"rgb(0,180,0)\" id=\"id781\" points=\"0,0 100,0 50,50\"/><pattern height=\"500\" id=\"t0-2-0\" patternTransform=\"rotate(0)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"200\" y=\"0\"><use xlink:href=\"#id781\"/></pattern><polygon fill=\"rgb(0,180,90)\" id=\"id782\" points=\"0,0 100,0 50,50\"/><pattern height=\"500\" id=\"t0-2-1\" patternTransform=\"rotate(0)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"200\" y=\"100\"><use xlink:href=\"#id782\"/></pattern><polygon fill=\"rgb(0,180,180)\" id=\"id783\" points=\"0,0 100,0 50,50\"/><pattern height=\"500\" id=\"t0-2-2\" patternTransform=\"rotate(0)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"200\" y=\"200\"><use xlink:href=\"#id783\"/></pattern><polygon fill=\"rgb(0,180,270)\" id=\"id784\" points=\"0,0 100,0 50,50\"/><pattern height=\"500\" id=\"t0-2-3\" patternTransform=\"rotate(0)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"200\" y=\"300\"><use xlink:href=\"#id784\"/></pattern><polygon fill=\"rgb(0,180,360)\" id=\"id785\" points=\"0,0 100,0 50,50\"/><pattern height=\"500\" id=\"t0-2-4\" patternTransform=\"rotate(0)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"200\" y=\"400\"><use xlink:href=\"#id785\"/></pattern><polygon fill=\"rgb(0,270,0)\" id=\"id786\" points=\"0,0 100,0 50,50\"/><pattern height=\"500\" id=\"t0-3-0\" patternTransform=\"rotate(0)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"300\" y=\"0\"><use xlink:href=\"#id786\"/></pattern><polygon fill=\"rgb(0,270,90)\" id=\"id787\" points=\"0,0 100,0 50,50\"/><pattern height=\"500\" id=\"t0-3-1\" patternTransform=\"rotate(0)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"300\" y=\"100\"><use xlink:href=\"#id787\"/></pattern><polygon fill=\"rgb(0,270,180)\" id=\"id788\" points=\"0,0 100,0 50,50\"/><pattern height=\"500\" id=\"t0-3-2\" patternTransform=\"rotate(0)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"300\" y=\"200\"><use xlink:href=\"#id788\"/></pattern><polygon fill=\"rgb(0,270,270)\" id=\"id789\" points=\"0,0 100,0 50,50\"/><pattern height=\"500\" id=\"t0-3-3\" patternTransform=\"rotate(0)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"300\" y=\"300\"><use xlink:href=\"#id789\"/></pattern><polygon fill=\"rgb(0,270,360)\" id=\"id790\" points=\"0,0 100,0 50,50\"/><pattern height=\"500\" id=\"t0-3-4\" patternTransform=\"rotate(0)\" patternUnits=\"userSpaceOnUse\" width=\"400\" x=\"300\" y=\"400\"><use xlink:href=\"#id790\"/></pattern></defs><use fill=\"url(#t0-0-0)\" xlink:href=\"#id771\"/><use fill=\"url(#t0-0-1)\" xlink:href=\"#id771\"/><use fill=\"url(#t0-0-2)\" xlink:href=\"#id771\"/><use fill=\"url(#t0-0-3)\" xlink:href=\"#id771\"/><use fill=\"url(#t0-0-4)\" xlink:href=\"#id771\"/><use fill=\"url(#t0-1-0)\" xlink:href=\"#id771\"/><use fill=\"url(#t0-1-1)\" xlink:href=\"#id771\"/><use fill=\"url(#t0-1-2)\" xlink:href=\"#id771\"/><use fill=\"url(#t0-1-3)\" xlink:href=\"#id771\"/><use fill=\"url(#t0-1-4)\" xlink:href=\"#id771\"/><use fill=\"url(#t0-2-0)\" xlink:href=\"#id771\"/><use fill=\"url(#t0-2-1)\" xlink:href=\"#id771\"/><use fill=\"url(#t0-2-2)\" xlink:href=\"#id771\"/><use fill=\"url(#t0-2-3)\" xlink:href=\"#id771\"/><use fill=\"url(#t0-2-4)\" xlink:href=\"#id771\"/><use fill=\"url(#t0-3-0)\" xlink:href=\"#id771\"/><use fill=\"url(#t0-3-1)\" xlink:href=\"#id771\"/><use fill=\"url(#t0-3-2)\" xlink:href=\"#id771\"/><use fill=\"url(#t0-3-3)\" xlink:href=\"#id771\"/><use fill=\"url(#t0-3-4)\" xlink:href=\"#id771\"/></svg>"
},
"metadata": {}
}
],
"execution_count": 57
},
{
"id": "9c40fd59-5ced-4183-8d21-6de050dac081",
"cell_type": "markdown",
"source": "",
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment