{ "cells": [ { "cell_type": "markdown", "id": "f6ff25ff", "metadata": {}, "source": [ "# Tutorial 4 - Bspline\n", "\n", "DiffinyTrace uses B-splines by default for freeform lenses. They are represented as explicit functions by mapping the local physical space to the parametric domain." ] }, { "cell_type": "code", "execution_count": null, "id": "ee354977", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import sys\n", "import os\n", "\n", "sys.path.insert(0, os.path.abspath(\"..\"))\n", "\n", "import diffinytrace as dit\n", "from diffinytrace.basis_functions.bspline import basis_2D\n", "import torch\n", "\n", "\n", "U1 = torch.tensor([0., 0.2, 0.4, 0.6, 0.8, 1])\n", "Us = [U1, U1]\n", "ps = [3, 3]\n", "ns = [3, 3]\n", "\n", "side_points = 100\n", "_x = torch.linspace(0, 1, side_points)\n", "_y = torch.linspace(0, 1, side_points)\n", "grid_y, grid_x = torch.meshgrid(_y, _x, indexing='ij')\n", "points = torch.cat([grid_x.reshape(-1, 1), grid_y.reshape(-1, 1)], dim=-1)\n", "\n", "N2D = basis_2D(points,Us, ps, ns,torch.tensor([0,1]),torch.tensor([0,1]))\n", "\n", "xi = 0\n", "yi = 2\n", "dit.plotting.quantity2D.plot(\n", " N2D[:, yi, xi].reshape(side_points, side_points),\n", " \"basis fun\",\n", " [0, 1],\n", " [0, 1],\n", " xlabel=\"x\",\n", " ylabel=\"y\"\n", ")" ] }, { "cell_type": "code", "execution_count": null, "id": "f1fcaa12", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "working", "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.12.0" } }, "nbformat": 4, "nbformat_minor": 5 }