diff --git a/BlogPost.ipynb b/BlogPost.ipynb new file mode 100644 index 0000000..d7b125c --- /dev/null +++ b/BlogPost.ipynb @@ -0,0 +1,315 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "from glyphs_generator.build import initialize_generator_parameters\n", + "from glyphs_generator.data import Point, Stroke\n", + "from glyphs_generator.generate import GlyphGenerator\n", + "from glyphs_generator.rasterize import rasterize_all\n", + "\n", + "anchor_points = [\n", + " Point(-1, -1),\n", + " Point(-1, 1),\n", + " Point(1, -1),\n", + " Point(1, 1),\n", + " Point(0, 0),\n", + " Point(-1, 0),\n", + " Point(1, 0),\n", + " Point(0, 1),\n", + " Point(0, -1),\n", + "]\n", + "parameters = initialize_generator_parameters(anchor_points)\n", + "generator = GlyphGenerator(parameters)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(-0.5, 51.5, 12.5, -0.5)" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgMAAACQCAYAAACVtmiTAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAAACtElEQVR4nO3cMQ7CMBAAQYzy/y+bngK5IDhkZ+oUJ0UnrVzcmHPOBwCQ9dw9AACwlxgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABA3LH64RjjzDn4kdWDk6v/2wHLe7Df92Af72NlJ7/5v70MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIG756NAqRy/g/9jb63MYijN5GQCAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIO7YPQD/bYyxewQ+mHPuHoELsre88zIAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAuDFdJQGANC8DABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQNwLlo8eHaMnYQ8AAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from glyphs_generator.data import Stroke, Glyph\n", + "\n", + "a = Stroke(-1, -1, -1, 1)\n", + "b = Stroke(-1, -1, 1, -1)\n", + "c = Stroke(-1, 0, 1, 0)\n", + "d = Stroke(-1, -1, 1, 1)\n", + "e = Stroke(-1, 1, 1, 1)\n", + "f = Stroke(0, -1, 0, 1)\n", + "g = Stroke(1, -1, -1, 1)\n", + "h = Stroke(1, -1, 1, 1)\n", + "\n", + "glyphs = [\n", + " Glyph(strokes=[a, b]),\n", + " Glyph(strokes=[a, e]),\n", + " Glyph(strokes=[b, h]),\n", + " Glyph(strokes=[e, h]),\n", + "]\n", + "tensor = rasterize_all(glyphs=glyphs, nb_glyphs_per_row=len(glyphs), glyph_size=12)\n", + "plt.imshow(255 - 255 * tensor, cmap=\"gray\")\n", + "plt.axis(\"off\")\n", + "# plt.savefig(f\"glyph-equivalence-class.svg\", transparent=True, bbox_inches=\"tight\");" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(-0.5, 104.5, 125.5, -0.5)" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "strokes = [\n", + " Stroke(-1, -1, -1, 1),\n", + " Stroke(1, -1, 1, 1),\n", + " Stroke(-1, 1, 1, 1),\n", + " Stroke(-1, 0, 1, 0),\n", + " Stroke(0, 1, 0, -1),\n", + " Stroke(1, -1, -1, -1),\n", + "]\n", + "seed = strokes[0]\n", + "glyphs = generator.generate(strokes, seed)\n", + "tensor = rasterize_all(glyphs, glyph_size=15, margin=6, sort=True) \n", + "plt.imshow(255 - 255 * tensor, cmap=\"gray\")\n", + "plt.axis(\"off\")\n", + "# plt.savefig(f\"10-glyph.svg\", transparent=True, bbox_inches=\"tight\");" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(-0.5, 314.5, 167.5, -0.5)" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "strokes = [\n", + " Stroke(-1, -1, -1, 1),\n", + " Stroke(-1, -1, 1, -1),\n", + " Stroke(-1, 0, 1, 0),\n", + " Stroke(-1, -1, 1, 1),\n", + " Stroke(-1, 1, 1, 1),\n", + " Stroke(0, -1, 0, 1),\n", + " Stroke(1, -1, -1, 1),\n", + " Stroke(1, -1, 1, 1),\n", + "]\n", + "seed = strokes[0]\n", + "glyphs = generator.generate(strokes, seed)\n", + "tensor = rasterize_all(glyphs, glyph_size=15, margin=6, sort=True) \n", + "plt.imshow(255 - 255 * tensor, cmap=\"gray\")\n", + "plt.axis(\"off\")\n", + "# plt.savefig(f\"10-glyph.svg\", transparent=True, bbox_inches=\"tight\");" + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "from pydantic import BaseModel\n", + "\n", + "\n", + "class Coordinates(BaseModel):\n", + " x0: float\n", + " y0: float\n", + " x1: float\n", + " y1: float\n", + "\n", + "class Model(BaseModel):\n", + " strokes: list[Coordinates]\n", + "\n", + "matrix = Model.model_validate_json('{\"strokes\":[{\"x0\":-1,\"y0\":-1,\"x1\":1,\"y1\":1},{\"x0\":1,\"y0\":1,\"x1\":-1,\"y1\":1},{\"x0\":-1,\"y0\":1,\"x1\":1,\"y1\":-1},{\"x0\":1,\"y0\":-1,\"x1\":-1,\"y1\":-1},{\"x0\":-1,\"y0\":-1,\"x1\":-1,\"y1\":1},{\"x0\":1,\"y0\":-1,\"x1\":1,\"y1\":1},{\"x0\":1,\"y0\":0,\"x1\":-1,\"y1\":0},{\"x0\":0,\"y0\":-1,\"x1\":0,\"y1\":1},{\"x0\":0,\"y0\":-1,\"x1\":-1,\"y1\":0},{\"x0\":-1,\"y0\":0,\"x1\":0,\"y1\":1},{\"x0\":0,\"y0\":1,\"x1\":1,\"y1\":0},{\"x0\":1,\"y0\":0,\"x1\":0,\"y1\":-1}]}')\n", + "strokes = [Stroke(s.x0, s.y0, s.x1, s.y1) for s in matrix.strokes]\n", + "glyphs = generator.generate(strokes, strokes[0])\n", + "\n", + "def order_glyphs(glyphs):\n", + " ordered = {}\n", + " for glyph in glyphs:\n", + " k = len(glyph.strokes)\n", + " if k not in ordered:\n", + " ordered[k] = []\n", + " ordered[k].append(glyph)\n", + " return ordered\n", + "\n", + "\n", + "records = []\n", + "o = order_glyphs(glyphs)\n", + "for k, k_glyphs in o.items():\n", + " for k_glyph in k_glyphs:\n", + " sub_glyphs = generator.generate(k_glyph.strokes, k_glyph.strokes[0])\n", + " argmax = 0\n", + " last_max = 0\n", + " for i, i_glyphs in order_glyphs(sub_glyphs).items():\n", + " if len(i_glyphs) > last_max:\n", + " last_max = len(i_glyphs)\n", + " argmax = i\n", + " records.append({\"n\": k, \"most_freedom_k_glyph\": argmax})\n", + "\n", + "df = pd.DataFrame.from_records(records)" + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(0.0, 1.0)" + ] + }, + "execution_count": 81, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAAG2CAYAAACDLKdOAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAABEtklEQVR4nO3deXBc5Z3v/0/vm9StvbV7B2Pwho0dYxyWOHiAS4Y7yQyTcGP/yDJDTUICrnvDkgBDMolJMqEoAhOSTHJzb9VlQjbCJBAyjtmDw2IjwIA3bGzZ1r50t1rq7Zzz+6OltoVlYYOtlo7fryqVpKNzpEdtt86nn+f7PI/DsixLAAAANuEsdgMAAABOJsINAACwFcINAACwFcINAACwFcINAACwFcINAACwFcINAACwFcINAACwFcINAACwFcINAACwlaKGm2eeeUZXXnml6uvr5XA49Nvf/vY9r3nqqad07rnnyufzafbs2frZz352ytsJAACmjqKGm2QyqYULF+r+++8/rvP37t2rK664QhdffLFaWlp0ww036HOf+5z++Mc/nuKWAgCAqcIxWTbOdDgcevjhh3XVVVcd85ybbrpJjz76qLZt21Y49vd///fq7+/X448/PgGtBAAAk5272A04EZs3b9bq1atHHVuzZo1uuOGGY16TTqeVTqcLn5umqd7eXlVWVsrhcJyqpgIAgJPIsiwlEgnV19fL6Rx/4GlKhZv29nZFo9FRx6LRqOLxuIaGhhQIBI66ZsOGDbrzzjsnqokAAOAUam1tVWNj47jnTKlw837ccsstWr9+feHzWCym5uZmtba2KhwOF7FlAADgeMXjcTU1Nam0tPQ9z51S4aa2tlYdHR2jjnV0dCgcDo/ZayNJPp9PPp/vqOPhcJhwAwDAFHM8JSVTap2bFStWaNOmTaOObdy4UStWrChSiwAAwGRT1HAzMDCglpYWtbS0SMpP9W5padH+/fsl5YeU1q5dWzj/uuuu0549e/SVr3xF27dv17/927/pF7/4hW688cZiNB8AAExCRQ03L7/8shYvXqzFixdLktavX6/Fixfr9ttvlyS1tbUVgo4kzZgxQ48++qg2btyohQsX6nvf+57+/d//XWvWrClK+wEAwOQzada5mSjxeFyRSESxWIyaGwAApogTuX9PqZobAACA90K4AQAAtkK4AQAAtkK4AQAA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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import seaborn as sns\n", + "import matplotlib.pyplot as plt\n", + "\n", + "df[\"x\"] = df.apply(lambda x: float(x[\"most_freedom_k_glyph\"]) / float(x[\"n\"]), axis=1)\n", + "df = df[df.n > 1]\n", + "sns.lineplot(df, x=\"n\", y=\"x\")\n", + "plt.ylim([0, 1])" + ] + }, + { + "cell_type": "code", + "execution_count": 106, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 106, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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5PrzySefOLt16+YMDAx0JiUlORcsWGB0pCbHZrM5H3nkEWebNm2cQUFBzvbt2zuffvppZ1lZmdHRGrV169ZV+zv5rrvucjqdZy5Rnjp1qjMmJsYZGBjoHDJkiHPfvn3Ghm6EatvOGRkZNe4b161b1yD5LE4nt04EAADmxBwVAABgWhQVAABgWhQVAABgWhQVAABgWhQVAABgWhQVAABgWhQVAABgWhQVAABgWhQVAABgWhQVAABgWhQVAABgWjw9GYCpXHnllerRo4eCgoL0t7/9TQEBAfrjH/+oZ5991uhoAAzAERUAprNkyRKFhoZqy5Ytmj17tp5//nmtXbvW6FgADMDTkwGYypVXXim73a6vv/7aNda3b1/95je/0axZswxMBsAIHFEBYDo9evRw+zkuLk55eXkGpQFgJIoKANPx9/d3+9liscjhcBiUBoCRKCoAAMC0KCoAAMC0KCoAAMC0uOoHAACYFkdUAACAaVFUAACAaVFUAACAaVFUAACAaVFUAACAaVFUAACAaVFUAACAaVFUAACAaVFUAACAaVFUAACAaVFUAACAaf3/s2mPFt1JSgcAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "df_count = df.pivot_table(index=[\"n\", \"most_freedom_k_glyph\"], aggfunc=\"count\").reset_index()\n", + "sns.scatterplot(df_count, x='n', y='most_freedom_k_glyph', size=\"x\")\n", + "#sns.scatterplot(df, x='n', y='x', size=\"count\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "glyphs-generator-7Gg5DqOp-py3.11", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/Demo.ipynb b/Demo.ipynb index efb6ff7..4e5b306 100644 --- a/Demo.ipynb +++ b/Demo.ipynb @@ -20,7 +20,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 60, "metadata": {}, "outputs": [], "source": [ @@ -29,7 +29,7 @@ "from glyphs_generator.build import initialize_generator_parameters\n", "from glyphs_generator.data import Point, Stroke\n", "from glyphs_generator.generate import GlyphGenerator\n", - "from glyphs_generator.rasterize import rasterize_all\n", + "from glyphs_generator.rasterize import rasterize_all, rasterize\n", "\n", "anchor_points = [\n", " Point(-1, -1),\n", @@ -43,14 +43,12 @@ " Point(0, -1),\n", "]\n", "parameters = initialize_generator_parameters(anchor_points)\n", - "#with open(\"parameters_9ap.json\", \"w\") as f:\n", - "# f.write(parameters.model_dump_json())\n", "generator = GlyphGenerator(parameters)" ] }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 61, "metadata": {}, "outputs": [ { @@ -75,17 +73,15 @@ "]\n", "seed = strokes[0]\n", "glyphs = generator.generate(strokes, seed)\n", - "#print(glyphs[4])\n", - "#print(glyphs[6])\n", "\n", - "tensor = rasterize_all(glyphs, glyph_size=25, margin=10, sort=True) \n", + "tensor = rasterize_all(glyphs, glyph_size=25, margin=10, sort=True)\n", "plt.imshow(255 - 255 * tensor, cmap=\"gray\")\n", "plt.axis(\"off\");" ] }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -118,7 +114,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -151,7 +147,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 5, "metadata": {}, "outputs": [ { diff --git a/glyphs_generator/build.py b/glyphs_generator/build.py index ef694a3..08e8107 100644 --- a/glyphs_generator/build.py +++ b/glyphs_generator/build.py @@ -1,7 +1,6 @@ from typing import List, Tuple from .data import Point, Stroke, GeneratorParameters -from .generate import GlyphGenerator from .intersect import do_intersect