|
|
|
@@ -0,0 +1,937 @@
|
|
|
|
|
{
|
|
|
|
|
"cells": [
|
|
|
|
|
{
|
|
|
|
|
"cell_type": "code",
|
|
|
|
|
"execution_count": 1,
|
|
|
|
|
"metadata": {},
|
|
|
|
|
"outputs": [],
|
|
|
|
|
"source": [
|
|
|
|
|
"import numpy as np\n",
|
|
|
|
|
"import sys\n",
|
|
|
|
|
"import json\n",
|
|
|
|
|
"from matplotlib import pyplot as plt\n",
|
|
|
|
|
"import meshplot as mp\n",
|
|
|
|
|
"import cv2\n",
|
|
|
|
|
"import svgwrite\n",
|
|
|
|
|
"import igl\n",
|
|
|
|
|
"sys.path.append(\"../src\")"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"cell_type": "markdown",
|
|
|
|
|
"metadata": {},
|
|
|
|
|
"source": [
|
|
|
|
|
"# 1. BFGS Approximated Hessian Matirx and its Inverse Matrix"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"cell_type": "code",
|
|
|
|
|
"execution_count": 2,
|
|
|
|
|
"metadata": {},
|
|
|
|
|
"outputs": [],
|
|
|
|
|
"source": [
|
|
|
|
|
"def f(x):\n",
|
|
|
|
|
" return np.linalg.norm(x) ** 2\n",
|
|
|
|
|
"\n",
|
|
|
|
|
"def grad_f(x):\n",
|
|
|
|
|
" return 2 * x"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"cell_type": "code",
|
|
|
|
|
"execution_count": 3,
|
|
|
|
|
"metadata": {},
|
|
|
|
|
"outputs": [],
|
|
|
|
|
"source": [
|
|
|
|
|
"from bfgs import compute_approximate_hessian_matrix\n",
|
|
|
|
|
"x = np.array([1, 1])\n",
|
|
|
|
|
"p = -grad_f(x)\n",
|
|
|
|
|
"alpha = 1.0\n",
|
|
|
|
|
"y = x + alpha * p\n",
|
|
|
|
|
"sk = (y - x).reshape(2, 1)\n",
|
|
|
|
|
"yk = (grad_f(y) - grad_f(x)).reshape(2, 1)\n",
|
|
|
|
|
"Bk = np.identity(2)\n",
|
|
|
|
|
"Bnew = compute_approximate_hessian_matrix(sk, yk, Bk)"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"cell_type": "code",
|
|
|
|
|
"execution_count": 4,
|
|
|
|
|
"metadata": {},
|
|
|
|
|
"outputs": [],
|
|
|
|
|
"source": [
|
|
|
|
|
"from bfgs import compute_inverse_approximate_hessian_matrix\n",
|
|
|
|
|
"x = np.array([1, 1])\n",
|
|
|
|
|
"p = -grad_f(x)\n",
|
|
|
|
|
"alpha = 1.0\n",
|
|
|
|
|
"y = x + alpha * p\n",
|
|
|
|
|
"sk = (y - x).reshape(2, 1)\n",
|
|
|
|
|
"yk = (grad_f(y) - grad_f(x)).reshape(2, 1)\n",
|
|
|
|
|
"invBk = np.identity(2)\n",
|
|
|
|
|
"invBnew = compute_inverse_approximate_hessian_matrix(sk, yk, invBk)\n"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"cell_type": "markdown",
|
|
|
|
|
"metadata": {},
|
|
|
|
|
"source": [
|
|
|
|
|
"The matrix multiplation of the two matrix should be indentity matrix."
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"cell_type": "code",
|
|
|
|
|
"execution_count": 5,
|
|
|
|
|
"metadata": {},
|
|
|
|
|
"outputs": [
|
|
|
|
|
{
|
|
|
|
|
"name": "stdout",
|
|
|
|
|
"output_type": "stream",
|
|
|
|
|
"text": [
|
|
|
|
|
"[[1. 0.]\n",
|
|
|
|
|
" [0. 1.]]\n"
|
|
|
|
|
]
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"source": [
|
|
|
|
|
"print(Bnew @ invBnew)"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"cell_type": "markdown",
|
|
|
|
|
"metadata": {},
|
|
|
|
|
"source": [
|
|
|
|
|
"# 2. Gradient Descent with Backtracking Line Search "
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"cell_type": "code",
|
|
|
|
|
"execution_count": 6,
|
|
|
|
|
"metadata": {},
|
|
|
|
|
"outputs": [],
|
|
|
|
|
"source": [
|
|
|
|
|
"with open('../data/dinosaur.json', 'r') as infile:\n",
|
|
|
|
|
" [V, F] = json.load(infile)\n",
|
|
|
|
|
" V = np.array(V)\n",
|
|
|
|
|
" F = np.array(F)"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"cell_type": "code",
|
|
|
|
|
"execution_count": 7,
|
|
|
|
|
"metadata": {},
|
|
|
|
|
"outputs": [],
|
|
|
|
|
"source": [
|
|
|
|
|
"from geometry import compute_mesh_centroid\n",
|
|
|
|
|
"\n",
|
|
|
|
|
"shader = {\"flat\":True, # Flat or smooth shading of triangles\n",
|
|
|
|
|
" \"wireframe\": True, \"wire_width\": 0.03, \"wire_color\": \"black\", # Wireframe rendering\n",
|
|
|
|
|
" \"width\": 600, \"height\": 600, # Size of the viewer canvas\n",
|
|
|
|
|
" \"antialias\": True, # Antialising, might not work on all GPUs\n",
|
|
|
|
|
" \"scale\": 2.0, # Scaling of the model\n",
|
|
|
|
|
" \"side\": \"DoubleSide\", # FrontSide, BackSide or DoubleSide rendering of the triangles\n",
|
|
|
|
|
" \"colormap\": \"viridis\", \"normalize\": [None, None], # Colormap and normalization for colors\n",
|
|
|
|
|
" \"background\": \"#ffffff\", # Background color of the canvas\n",
|
|
|
|
|
" \"line_width\": 1.0, \"line_color\": \"black\", # Line properties of overlay lines\n",
|
|
|
|
|
" \"bbox\": False, # Enable plotting of bounding box\n",
|
|
|
|
|
" \"point_color\": \"red\", \"point_size\": 0.01 # Point properties of overlay points\n",
|
|
|
|
|
" }\n",
|
|
|
|
|
"\n",
|
|
|
|
|
"def draw_meshes_comparison(V1, F1, V2, F2, color1, color2):\n",
|
|
|
|
|
" mesh_plot = mp.plot(V1, F1, c = color1, return_plot=True)\n",
|
|
|
|
|
" mesh_plot.add_mesh(V2, F2, c = color2, shading=shader)\n",
|
|
|
|
|
" \n",
|
|
|
|
|
" center0 = np.array(compute_mesh_centroid(V2, F2))\n",
|
|
|
|
|
" center1 = center0.copy()\n",
|
|
|
|
|
" center1[1] = 0\n",
|
|
|
|
|
" vertices = np.vstack([center0, center1])\n",
|
|
|
|
|
" mesh_plot.add_points(vertices, shading={\"point_color\": \"black\", \"point_size\": 0.1})\n",
|
|
|
|
|
" mesh_plot.add_edges(vertices, np.array([[0, 1]]), shading={\"line_color\": \"black\", \"line_width\" : 0.5});"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"cell_type": "code",
|
|
|
|
|
"execution_count": 15,
|
|
|
|
|
"metadata": {},
|
|
|
|
|
"outputs": [
|
|
|
|
|
{
|
|
|
|
|
"data": {
|
|
|
|
|
"application/vnd.jupyter.widget-view+json": {
|
|
|
|
|
"model_id": "4360d9c4eb7044e193bea27ba4cdcb2f",
|
|
|
|
|
"version_major": 2,
|
|
|
|
|
"version_minor": 0
|
|
|
|
|
},
|
|
|
|
|
"text/plain": [
|
|
|
|
|
"Renderer(camera=PerspectiveCamera(children=(DirectionalLight(color='white', intensity=0.6, position=(0.5046897…"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
"metadata": {},
|
|
|
|
|
"output_type": "display_data"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"name": "stdout",
|
|
|
|
|
"output_type": "stream",
|
|
|
|
|
"text": [
|
|
|
|
|
"0.3092501163482666\n"
|
|
|
|
|
]
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"source": [
|
|
|
|
|
"from geometry import compute_center_support_line\n",
|
|
|
|
|
"from linesearch import gradient_descent_with_line_search\n",
|
|
|
|
|
"x_csl = compute_center_support_line(V)\n",
|
|
|
|
|
"[V1, F, objective, running_time] = gradient_descent_with_line_search(V, F, x_csl, w = 10, obj_tol = 1E-8, theta = 1.0, beta = 0.5, c = 0.02, iter = 10000)\n",
|
|
|
|
|
"\n",
|
|
|
|
|
"mesh_plot = draw_meshes_comparison(V, F, V1, F, np.array([0.3, 0.3, 0.3]), np.array([1.0, 1.0, 0]))\n",
|
|
|
|
|
"print(running_time)"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"cell_type": "code",
|
|
|
|
|
"execution_count": 16,
|
|
|
|
|
"metadata": {},
|
|
|
|
|
"outputs": [
|
|
|
|
|
{
|
|
|
|
|
"data": {
|
|
|
|
|
"image/png": "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 truncated
|
|
|
|
|
"text/plain": [
|
|
|
|
|
"<Figure size 432x288 with 1 Axes>"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
"metadata": {
|
|
|
|
|
"needs_background": "light"
|
|
|
|
|
},
|
|
|
|
|
"output_type": "display_data"
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"source": [
|
|
|
|
|
"fig = plt.figure()\n",
|
|
|
|
|
"plt.plot(objective)\n",
|
|
|
|
|
"plt.xlabel(\"number of iteration\")\n",
|
|
|
|
|
"plt.ylabel(\"objective energy\")\n",
|
|
|
|
|
"plt.show()"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"cell_type": "markdown",
|
|
|
|
|
"metadata": {},
|
|
|
|
|
"source": [
|
|
|
|
|
"# 3. BGFS with Backtracking Line Search "
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"cell_type": "code",
|
|
|
|
|
"execution_count": 19,
|
|
|
|
|
"metadata": {},
|
|
|
|
|
"outputs": [
|
|
|
|
|
{
|
|
|
|
|
"ename": "KeyboardInterrupt",
|
|
|
|
|
"evalue": "",
|
|
|
|
|
"output_type": "error",
|
|
|
|
|
"traceback": [
|
|
|
|
|
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
|
|
|
|
|
"\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)",
|
|
|
|
|
"\u001b[0;32m/tmp/ipykernel_629/1214273749.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mbfgs\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mbfgs_with_line_search\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mx_csl\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcompute_center_support_line\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mV\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0;34m[\u001b[0m\u001b[0mV1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mF\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mobjective\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrunning_time\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mbfgs_with_line_search\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mV\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mF\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx_csl\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mw\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m10\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mobj_tol\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m1E-8\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtheta\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m1.0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbeta\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0.5\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mc\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0.02\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0miter\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m10\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0mmesh_plot\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdraw_meshes_comparison\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mV\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mF\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mV1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mF\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0.3\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m0.3\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m0.3\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1.0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m1.0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
|
|
|
|
|
"\u001b[0;32m/opt/notebooks/assignment_1_3/notebook/../src/bfgs.py\u001b[0m in \u001b[0;36mbfgs_with_line_search\u001b[0;34m(V, F, x_csl, w, obj_tol, theta, beta, c, iter)\u001b[0m\n\u001b[1;32m 164\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 165\u001b[0m \u001b[0mf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mlambda\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mcompute_optimization_objective\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0munflatten\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mF\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mE\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx_csl\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mL0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mw\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 166\u001b[0;31m \u001b[0malpha\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mbacktracking_line_search\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0mgradf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgradf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtheta\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbeta\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 167\u001b[0m \u001b[0mx_cm\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcompute_mesh_centroid\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mV\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mF\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 168\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
|
|
|
|
|
"\u001b[0;32m/opt/notebooks/assignment_1_3/notebook/../src/linesearch.py\u001b[0m in \u001b[0;36mbacktracking_line_search\u001b[0;34m(p, grad, x, theta, beta, c, f, *arg)\u001b[0m\n\u001b[1;32m 71\u001b[0m \u001b[0malpha\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtheta\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 72\u001b[0m \u001b[0mx1\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mx\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0malpha\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mp\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 73\u001b[0;31m \u001b[0;32mwhile\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mevaluate_armijo_rule\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0marg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0marg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mp\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgrad\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0malpha\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 74\u001b[0m \u001b[0malpha\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mbeta\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0malpha\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 75\u001b[0m \u001b[0mx1\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0malpha\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mp\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
|
|
|
|
|
"\u001b[0;32m/opt/notebooks/assignment_1_3/notebook/../src/bfgs.py\u001b[0m in \u001b[0;36m<lambda>\u001b[0;34m(x)\u001b[0m\n\u001b[1;32m 163\u001b[0m \u001b[0munflatten\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mlambda\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconcatenate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreshape\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mV\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mzeros\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mV\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 164\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 165\u001b[0;31m \u001b[0mf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mlambda\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mcompute_optimization_objective\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0munflatten\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mF\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mE\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx_csl\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mL0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mw\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 166\u001b[0m \u001b[0malpha\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mbacktracking_line_search\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0mgradf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgradf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtheta\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbeta\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 167\u001b[0m \u001b[0mx_cm\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcompute_mesh_centroid\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mV\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mF\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
|
|
|
|
|
"\u001b[0;32m/opt/notebooks/assignment_1_3/notebook/../src/optimization.py\u001b[0m in \u001b[0;36mcompute_optimization_objective\u001b[0;34m(V, F, E, x_csl, L0, w)\u001b[0m\n\u001b[1;32m 32\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 33\u001b[0m \u001b[0mE_eq\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcompute_equilibrium_energy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mV\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mF\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx_csl\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 34\u001b[0;31m \u001b[0mE_sh\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcompute_shape_energy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mV\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mE\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mL0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 35\u001b[0m \u001b[0mobj\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mE_eq\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mw\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mE_sh\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 36\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
|
|
|
|
|
"\u001b[0;32m/opt/notebooks/assignment_1_3/notebook/../src/energies.py\u001b[0m in \u001b[0;36mcompute_shape_energy\u001b[0;34m(V, E, L)\u001b[0m\n\u001b[1;32m 110\u001b[0m \u001b[0mThe\u001b[0m \u001b[0menergy\u001b[0m \u001b[0mE_sh\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mthe\u001b[0m \u001b[0mcurrent\u001b[0m \u001b[0mconfiguration\u001b[0m \u001b[0mV\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 111\u001b[0m \"\"\"\n\u001b[0;32m--> 112\u001b[0;31m \u001b[0ml\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcompute_edges_length\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mV\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mE\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 113\u001b[0m \u001b[0mLf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mL\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 114\u001b[0m \u001b[0me_vec\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mE\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
|
|
|
|
|
"\u001b[0;32m/opt/notebooks/assignment_1_3/notebook/../src/energies.py\u001b[0m in \u001b[0;36mcompute_edges_length\u001b[0;34m(V, E)\u001b[0m\n\u001b[1;32m 61\u001b[0m \"\"\"\n\u001b[1;32m 62\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 63\u001b[0;31m \u001b[0ml\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlinalg\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnorm\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mV\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mE\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mV\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mE\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 64\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0ml\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 65\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
|
|
|
|
|
"\u001b[0;32m<__array_function__ internals>\u001b[0m in \u001b[0;36mnorm\u001b[0;34m(*args, **kwargs)\u001b[0m\n",
|
|
|
|
|
"\u001b[0;32m/opt/conda/envs/gc_course_env/lib/python3.9/site-packages/numpy/linalg/linalg.py\u001b[0m in \u001b[0;36mnorm\u001b[0;34m(x, ord, axis, keepdims)\u001b[0m\n\u001b[1;32m 2559\u001b[0m \u001b[0;31m# special case for speedup\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2560\u001b[0m \u001b[0ms\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconj\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreal\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2561\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0msqrt\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0madd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreduce\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ms\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0maxis\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkeepdims\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mkeepdims\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2562\u001b[0m \u001b[0;31m# None of the str-type keywords for ord ('fro', 'nuc')\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2563\u001b[0m \u001b[0;31m# are valid for vectors\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
|
|
|
|
|
"\u001b[0;31mKeyboardInterrupt\u001b[0m: "
|
|
|
|
|
]
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"source": [
|
|
|
|
|
"from geometry import compute_center_support_line\n",
|
|
|
|
|
"from bfgs import bfgs_with_line_search\n",
|
|
|
|
|
"x_csl = compute_center_support_line(V)\n",
|
|
|
|
|
"[V1, F, objective, running_time] = bfgs_with_line_search(V, F, x_csl, w = 10, obj_tol = 1E-8, theta = 1.0, beta = 0.5, c = 0.02, iter = 10)\n",
|
|
|
|
|
"\n",
|
|
|
|
|
"mesh_plot = draw_meshes_comparison(V, F, V1, F, np.array([0.3, 0.3, 0.3]), np.array([1.0, 1.0, 0]))\n",
|
|
|
|
|
"print(running_time)"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"cell_type": "code",
|
|
|
|
|
"execution_count": 20,
|
|
|
|
|
"metadata": {},
|
|
|
|
|
"outputs": [
|
|
|
|
|
{
|
|
|
|
|
"data": {
|
|
|
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAZUAAAEJCAYAAABc/7oDAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAAAcUUlEQVR4nO3df5RX9X3n8ecrIEFtLCpjl/IjEJcxG3OI2q8MbSRVGq2yaTGb7NYmUWK7y2ICJvFolxybk+yP5CjdbXJorCzpTlcasyyeqjsmpmqy0aQ1wAwKyGDYjmjWCWwYkhyiooPIe/+4n9Evw3e+3zvMvTN8ndfjnHvm3vv5fO73/ZmvzpvP/dwfigjMzMyK8JaxDsDMzN48nFTMzKwwTipmZlYYJxUzMyuMk4qZmRXGScXMzApTalKRdKWk3ZJ6JK2qUS5Ja1L5DkkX5WkraWUq65a0umr/PEk/TPufkjS5zP6ZmdmxJpZ1YEkTgDuAy4FeoFNSR0Tsqqp2FTA3LW3AnUBbvbaSLgOWAPMiol/SOenzJgJfB66NiO2SzgZeLat/ZmZ2vNKSCjAf6ImIPQCSNpAlg+qksgRYH9kdmJskTZE0DZhdp+0NwG0R0Q8QEfvTsa4AdkTE9rT/Z40CnDp1asyePXuk/TQzG1e2bt16ICJaapWVmVSmA89XbfeSjUYa1ZneoG0rsFDSF4FXgJsjojPtD0kPAS3AhohYzSCSlgHLAGbNmkVXV9eJ9c7MbJyS9OOhysqcU1GNfYOfCTNUnXptJwJnAguAW4CNkpT2XwJ8NP38oKTfOe4gEesiohIRlZaWmonWzMxOUJlJpReYWbU9A9ibs069tr3AvZHZAhwFpqb9j0XEgYg4BDwIXISZmY2aMpNKJzBX0hxJk4BrgI5BdTqA69JVYAuAgxGxr0Hb+4FFAJJagUnAAeAhYJ6k09Kk/W9z7PyNmZmVrLQ5lYg4ImkF2R/7CUB7RHRLWp7K15KNJhYDPcAh4Pp6bdOh24F2STuBw8DSNNH/C0l/TpaQAngwIr5VVv/MzOx4Gs+Pvq9UKuGJejOz4ZG0NSIqtcp8R72ZmRXGScXMzArjpGJmZoVxUjEzs8I4qZiZWWGcVMzMrDBOKmZmVhgnFTMzK4yTipmZFcZJxczMCuOkYmZmhXFSMTOzwjipmJlZYZxUzMysME4qZmZWGCcVMzMrjJOKmZkVxknFzMwK46RiZmaFcVIxM7PCOKmYmVlhnFTMzKwwTipmZlaYUpOKpCsl7ZbUI2lVjXJJWpPKd0i6KE9bSStTWbek1WnfbEkvS9qWlrVl9s3MzI43sawDS5oA3AFcDvQCnZI6ImJXVbWrgLlpaQPuBNrqtZV0GbAEmBcR/ZLOqTreMxFxQVl9MjOz+socqcwHeiJiT0QcBjaQJYNqS4D1kdkETJE0rUHbG4DbIqIfICL2l9gHMzMbhjKTynTg+art3rQvT516bVuBhZI2S3pM0sVV9eZIejLtX1grKEnLJHVJ6urr6xt+r8zMbEhlJhXV2Bc569RrOxE4E1gA3AJslCRgHzArIi4EbgK+IemM4w4SsS4iKhFRaWlpydcTMzPLpcyk0gvMrNqeAezNWade217g3nTKbAtwFJgaEf0R8TOAiNgKPEM2qjEzs1FSZlLpBOZKmiNpEnAN0DGoTgdwXboKbAFwMCL2NWh7P7AIQFIrMAk4IKklTfAj6R1kk/97SuyfmZkNUtrVXxFxRNIK4CFgAtAeEd2SlqfytcCDwGKgBzgEXF+vbTp0O9AuaSdwGFgaESHpfcB/kHQEeA1YHhE/L6t/ZmZ2PEUMnuYYPyqVSnR1dY11GGZmTUXS1oio1CrzHfVmZlYYJxUzMyuMk4qZmRXGScXMzArjpGJmZoVxUjEzs8I4qZiZWWGcVMzMrDBOKmZmVhgnFTMzK4yTipmZFcZJxczMCuOkYmZmhXFSMTOzwjipmJlZYZxUzMysME4qZmZWGCcVMzMrjJOKmZkVxknFzMwK46RiZmaFcVIxM7PClJpUJF0pabekHkmrapRL0ppUvkPSRXnaSlqZyrolrR5UNkvSi5JuLq9nZmZWy8SyDixpAnAHcDnQC3RK6oiIXVXVrgLmpqUNuBNoq9dW0mXAEmBeRPRLOmfQR38Z+HZZ/TIzs6GVOVKZD/RExJ6IOAxsIEsG1ZYA6yOzCZgiaVqDtjcAt0VEP0BE7B84mKSrgT1Ad4n9MjOzIZSZVKYDz1dt96Z9eerUa9sKLJS0WdJjki4GkHQ68O+Af18vKEnLJHVJ6urr6xtml8zMrJ4yk4pq7Iucdeq1nQicCSwAbgE2ShJZMvlyRLxYL6iIWBcRlYiotLS01KtqZmbDVNqcCtnoYmbV9gxgb846k+q07QXujYgAtkg6Ckwlm5P5cJq4nwIclfRKRHy1mO6YmVkjZY5UOoG5kuZImgRcA3QMqtMBXJeuAlsAHIyIfQ3a3g8sApDUSpaADkTEwoiYHRGzga8AX3JCMTMbXaWNVCLiiKQVwEPABKA9IrolLU/la4EHgcVAD3AIuL5e23TodqBd0k7gMLA0jVrMzGyMqdHfY0lnRcTPRymeUVWpVKKrq2uswzAzayqStkZEpVZZntNfmyXdI2lxmhA3MzOrKU9SaQXWAdcCPZK+lOYyzMzMjtEwqaQbEx+JiD8E/jWwlOyqq8ck/WbpEZqZWdNoOFEv6WzgY2QjlZ8CK8muxLoAuAeYU2J8ZmbWRPJc/fVD4G+AqyOit2p/l6S15YRlZmbNKE9SOW+oS3Yj4vaC4zEzsyaWJ6n8rxoXfR0EuoD/GhGvFB6VmZk1pTxXfz0LvAh8LS2/JJtbaU3bZmZmQL6RyoUR8b6q7QckfT8i3ifJj5g3M7PX5RmptEiaNbCR1qemzcOlRGVmZk0pz0jlJuDvJT1D9kj6OcAn0vtL7iozODMzay51k4qktwBvI3vd7zvJksqPqibnv1JqdGZm1lTqnv6KiKPAiojoj4jtEbHNV3uZmdlQ8sypPCLpZkkzJZ01sJQemZmZNZ08cyp/lH5+smpfAO8oPhwzM2tmDZNKRPjZXmZmlkvD01+STpP0p5LWpe25kj5QfmhmZtZs8syp/DXZ/Si/lbZ7gf9UWkRmZta08iSVcyNiNfAqQES8THZpsZmZ2THyJJXDkk4lm5xH0rlAf6lRmZlZU8pz9dfngb8DZkq6G3gv8PEygzIzs+aU5+qvRyQ9ASwgO+31qYg4UHpkZmbWdPKMVAAmA79I9d8liYj4fnlhmZlZM8pzSfHtwD8AtwK3pOXmPAeXdKWk3ZJ6JK2qUS5Ja1L5DkkX5WkraWUq65a0Ou2bL2lbWrZL+mCeGM3MrDh5RipXk71SeFiT85ImAHcAl5NdhtwpqSMidlVVu4rsYZVzgTbgTqCtXltJlwFLgHkR0S/pnHSsnUAlIo5ImgZsl/RARBwZTtxmZnbi8lz9tQc45QSOPR/oiYg9EXEY2ECWDKotAdZHZhMwJSWEem1vAG4bSHIRsT/9PFSVQCaTrlYzM7PRk2ekcgjYJum7VF1KHBE3Nmg3HXi+aruXbDTSqM70Bm1bgYWSvgi8AtwcEZ0AktqAduDtwLW1RimSlgHLAGbNmjW42MzMRiBPUulIy3DVukFy8OhhqDr12k4EziS7Gu1iYKOkd6TRzmbgfEn/DLhL0rcHP6o/ItYB6wAqlYpHM2ZmBcpzSfFd6ebHWRGxexjH7gVmVm3PAPbmrDOpTtte4N6ICGCLpKNkrzfuq4r5aUkvAe8GuoYRs5mZjUCeq79+D9hGdgMkki6QlGfk0gnMlTRH0iTgGo4f8XQA16WrwBYAByNiX4O29wOLUiytZAnoQKo7Me1/O3Ae8FyOOM3MrCB5Tn99gWzi/FGAiNgmqeHj8NNVWCuAh4AJQHtEdEtansrXAg8Ci4Eesrmb6+u1TYduB9ol7SR70OXSiAhJlwCrJL0KHAU+4Zs0zcxGl7KzSHUqSJsjok3SkxFxYdq3IyLmjUqEJapUKtHV5bNjZmbDIWlrRFRqleUZqeyU9BFggqS5wI3A40UGaGZmbw557lNZCZxPdjnxN4CDwKdLjMnMzJpUnqu/DpE9ouXW8sMxM7NmlmekYmZmlouTipmZFcZJxczMCpPn5sdWSd9N94UgaZ6kPy0/NDMzazZ5RipfAz4LvAoQETvI7nA3MzM7Rp6kclpEbBm0z+8oMTOz4+RJKgcknUt6SrCkDwP7So3KzMyaUp476j9J9qj4d0r6CfAs8NFSozIzs6aUJ6n8OCLeL+l04C0R8ULZQZmZWXPKc/rrWUnryF6K9WLJ8ZiZWRPLk1TOA75DdhrsWUlfTY+ZNzMzO0bDpBIRL0fExoj4F8CFwBnAY6VHZmZmTSfXHfWSflvSXwJPAJOBf1VqVGZm1pQaTtRLepbsdcIbgVsi4qWygzIzs+aU5+qv90TEL0uPxMzMmt6QSUXSn0TEauCLko5753BE3FhqZGZm1nTqjVSeTj/9EnczM8tlyKQSEQ+k1UMRcU91maR/WWpUZmbWlPJc/fXZnPvMzGycqzenchWwGJguaU1V0Rn4KcVmZlZDvZHKXrL5lFeArVVLB/C7eQ4u6UpJuyX1SFpVo1yS1qTyHZIuytNW0spU1i1pddp3uaStkp5KPxflidHMzIpTb05lO7Bd0n3ASxHxGoCkCcBbGx041bsDuBzoBToldUTErqpqVwFz09IG3Am01Wsr6TJgCTAvIvolnZOOdQD4vYjYK+ndwEPA9Ny/CTMzG7E8cyoPA6dWbZ9K9iywRuYDPRGxJyIOAxvIkkG1JcD6yGwCpkia1qDtDcBtEdEPEBH7088nI2JvqtMNTJbUMPmZmVlx8iSVyRHx+tOJ0/ppOdpNB56v2u7l+JHDUHXqtW0FFkraLOkxSRfX+OwPAU8OJJ5qkpZJ6pLU1dfXl6MbZmaWV56k8tKguY7fAF7O0U419g2+iXKoOvXaTgTLine truncated
|
|
|
|
|
"text/plain": [
|
|
|
|
|
"<Figure size 432x288 with 1 Axes>"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
"metadata": {
|
|
|
|
|
"needs_background": "light"
|
|
|
|
|
},
|
|
|
|
|
"output_type": "display_data"
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"source": [
|
|
|
|
|
"fig = plt.figure()\n",
|
|
|
|
|
"plt.plot(objective)\n",
|
|
|
|
|
"plt.xlabel(\"number of iteration\")\n",
|
|
|
|
|
"plt.ylabel(\"objective energy\")\n",
|
|
|
|
|
"plt.show()"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"cell_type": "markdown",
|
|
|
|
|
"metadata": {},
|
|
|
|
|
"source": [
|
|
|
|
|
"# 4. Create your own Mesh"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"cell_type": "markdown",
|
|
|
|
|
"metadata": {},
|
|
|
|
|
"source": [
|
|
|
|
|
"# 4.1 Load the image"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"cell_type": "code",
|
|
|
|
|
"execution_count": 21,
|
|
|
|
|
"metadata": {},
|
|
|
|
|
"outputs": [
|
|
|
|
|
{
|
|
|
|
|
"data": {
|
|
|
|
|
"image/png": "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 truncated
|
|
|
|
|
"text/plain": [
|
|
|
|
|
"<Figure size 720x720 with 1 Axes>"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
"metadata": {
|
|
|
|
|
"needs_background": "light"
|
|
|
|
|
},
|
|
|
|
|
"output_type": "display_data"
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"source": [
|
|
|
|
|
"#read the image\n",
|
|
|
|
|
"image_path = \"../data/dance.png\"\n",
|
|
|
|
|
"img = cv2.imread(image_path, 1) \n",
|
|
|
|
|
"\n",
|
|
|
|
|
"# convert the image to grey scale\n",
|
|
|
|
|
"imgrey = 255 - cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)\n",
|
|
|
|
|
"\n",
|
|
|
|
|
"# show image\n",
|
|
|
|
|
"plt.figure(figsize = (10, 10))\n",
|
|
|
|
|
"plt.imshow(imgrey)\n",
|
|
|
|
|
"plt.show()"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"cell_type": "markdown",
|
|
|
|
|
"metadata": {},
|
|
|
|
|
"source": [
|
|
|
|
|
"# 4.2 Make Flat Bottom Line"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"cell_type": "code",
|
|
|
|
|
"execution_count": 22,
|
|
|
|
|
"metadata": {},
|
|
|
|
|
"outputs": [
|
|
|
|
|
{
|
|
|
|
|
"data": {
|
|
|
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAY8AAAJCCAYAAAA4BEsQAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAABzCklEQVR4nO3dd3ydZf3/8dfnvs/IXk2b7r0ohVIolCnKVlCGivwUQQRxIKAIIu4tiiKK+lVABBwgoEyVIUtmS4EWugdd6W7TZifnnPu+fn+ccyd30iTNSU5yRj7Px6Mkuc+67nByv8+1xRiDUkoplQwr3QVQSimVfTQ8lFJKJU3DQymlVNI0PJRSSiVNw0MppVTSNDyUUkolbdDDQ0TOEJFVIrJWRL422K+vlFKq/2Qw53mIiA2sBk4FqoHXgf9njFk+aIVQSinVb4Nd8zgKWGuMedcYEwHuA84e5DIopZTqp8Agv94YYLPv52pgfuc7icjlwOUANvYRBZQMTumUUkOK2BYto/IpL26keV0QE4m23xawATAxJ13FS7sWGomYVunqtsEOj64KsV+7mTHmNuA2gBKpMPPl5IEul1JqiJFAgN2fOpK7v3kzm2OjueWjH8EsWQnGxZ41naZftrJxUyUzv7gUNxIFd+iFyALzTLe3DXazVTUwzvfzWGDrIJdBKTXUiWCPG8P7vvAao23D8pYx2Nt2x4NjWAU7bjTcf9BfKalsBNsG46a7xBlnsMPjdWCaiEwSkRBwAfDoIJdBKTXESSDI2stGc/3wl7BEuHXBSbj7akEstlw4g0fm3EnEGNyXyzGtrekubkYa1GYrY0xMRL4IPAnYwJ3GmGWDWQal1NAmgQCx42bzvY/ch42wNBJm4v3gRqLYMyZzziUvUCgWf6qdzbhHduAC6Orj+xnsPg+MMf8G/j3Yr6uUGsIk0d0qFvbIKsy3dvL+wq2A8JWV51P+0gqkqJAV15RxT8VC9rmGO/5+BuPXL8I4Q6+vozd0hrlSKvcZg9g29rAKVv5kBHdNuw+ArTGDuXc4OA5bL57Nk6fdgo1w5fqPMunODZhY9ABPPHRpeCilcp8IduUwVvxkAi+ceCsFlo2N8JNtZzDsibXUnzWHr1/5V0bbNo81jqf5+6NxduxEbDvdJc9Yg95spZRSg0IEJP752J45hW03Cq8cdgvFVgALiwYT5c1HZlP6XoeLv/8Yp+ZvY6tjuOmP5zPmfwsxsViaTyCzaXgopXJPoo9DbJvWkw5lzo8Xc8+IFwiKjYPBwWGPIzROi/DDS+/jlPzdNBnDB176ItP/sBTH1Q7yA9HwUErlJCscZteFc7nq2gc4u2gzrhFsBCcxL3lcwOLN035NUCwcDDdsOZ3p36/Hqa/X0VW9oOGhlMotItgV5ay9bgZ/+divmRGMNz95IWF3WujCwXDbvtlsun4a1urFaShwdtLwUErlhkQfR2D8GNbcWMZ/j72J0kTHuFfb8H/vebxxLI9942Ty//e61jiSoOGhlMp+IohtY+bNIv+mrbw08V4KJNAhKPzfe7WPx5vG8pvvfpTSfy1iMLenyAUaHkqprCe2TcvpcznlJy9yZcVbuCYeDp2bqDxR4/JAw1Tu+dYHKfnn6xhduyppGh5Kqexm2dSeP4/Pf/tBzi7aHA8MYb/mKWhvtrqj9hD+dd1JFD65KL7oodY6kqbhoZTKDiIdL/KJpqrdnzqSb17/Z07J382BFhJxMNy8Zx4vXXM04efe7HmZdW9JEw2WLml4KKWyQ+fgCATZ/rl5/OJLf2B+uLGtptFVjQPitY7v7TyGxVfNIfDK4p6XWfcHh2UPyb08DkTDQymVPRIjqiQYYMvVR/Dbz/2OOaHmA9Y4AHY4MZ777dFUvvY6hng/iXENYnXqF0nMSscSTDSme3l0Q8NDKZU9xMLKz2PDtXP4+yU3MyHQPm+juxqHp9gSKj+xiQ3jjwLADRncoMENGUyei5UfI68gQklBCyWhVva25MP9lVTc9yYmEtHmq040PJRSmcnfdJSocViFBaz7+mwe//hNjLbtthrHgYIDoEBsHpz+D5je8bj/sa4xWNJeE7l57Dxef7wKpybS37PJObqqrlIq8/gu4F5w2OWlrPrhwfz3EzdRZVsH7OPoLL6mlTng3A8bwTWGJtfhngXHYppbtNbRBQ0PpVRmSwTHih9P4flzf06p1f9l0v0zzv3NXmEJEDUuG2M2xz7xZWZ9ZzNuc3O/Xy8XabOVUirzeKOcALu0hBU3TuGF039JhRVoW5+qtzWOrniP95qpXGNYEwvyhx3v49nFs5jwmGHm/1YSa2hI1RnlHA0PpVTmEQHjYuXns+aGmbxw+k0HrHF0teChjRBNjJbyFkYEaDEOa6N5PFR7BI+sOYTQa8WMfLWR4PrtzNizGBONoGOseqbhoZTKON4OfjsvnMM/zv9lW3AcqJ+j86q5TcZhZbSQBU1TeKN2Aku2jsFZV0TpKqhY0Uigeg8Tt68AwDgOMdD+jV7S8FBKZRzjGtzjDuULX36IyQF6NY8jalyCYrHVcbhl58k8sWAOVS8LpWsasGsaMHtrmVC/AuOa+KQ/EWIk5ns4zn6TEDVEeqbhoZTKLCJY+XnsvLaZjxVv6NVDvD6LT71xCcP+WkjJaxuZvusNjGswxqVtQ1lv2K/3PXTcbtYLDQ2OA9LwUEpljsSw3OYTZ3HHob9tq0105nV42wibYy4XLf0UBb8vY8KzSzGRCLGe9h/vKRg0NHpNw0MplTmMAYFNH7CYGnSwsXocXfXjXUfx3E3HMvzx5Tj1a+Kd3BoAg0LDQymVOUSwCgs4Y/6SDrWLzsHhYLindiavX3UEJS+/juNff0pXwx0UOklQKZU5xELGjuS9pSuIGrdDgPg1uQ6333km1stvd73irQbHgNPwUEpllFh5AcPshrY1pjrvQe4aw2ON0xn72I74irf+Tm7t7B402myllMoosaIgxVYL0PV8jqBYvFo7BbbvGuyiKR+teSilModxaR4WYLTd2u1dLCxW7xuO29Q0iAVTnWl4KKUyh1jsm2ZRbNkdVrn1OBhcXHbWlMQn9qm00fBQSmWGxJ7kZnZ9lyOsvBCJGhenJhzf8U/7N9JGw0MplTGs0mIunPl6l3tu+Eddhfb4FknUAEkLDQ+lVGYQi8ajp3BW8ZL9bvLvuREUi7zdg1041ZmGh1Iq/RJNVptPtZgQ6Lovwx8g+bvd+DBdlTYaHkqpjGCVFnPWcW9giXS5N4fXfFXrOuTv6WHtKjUoNDyUUuknFk3zJ/PpYS/hHqAPY7sTJlAfHaSCqe5oeCil0k4sYfPJNhMCDmEJ7DfSyjWmbXb55ugw7Mbu54GowaHhoZRKLxGs8nI+eOIigmIRxdmv2cpbqsQSYXO0AquhJR0lVT4aHkqptGucP4lPVbzc9nNXczy8Y5tbKjCNTTpEN810bSulVFpJIEj1SRaTgi4OHUdVefxzPDY2VWDqG9JRVOWjNQ+lVPqIYJUW88ETFwFdB4fHwWBhsbG2ArdF+zzSTcNDKZVWjcdMaWuy8obkdu7zgHiwRHHYs6eo6z081KDS8FBKpY3YNtUnxycGdl4A0c9/m7U71L5boEobDQ+lVHpYNlZZKeecsBBLut6j3M+7Pbzbii+KqNJK/w8opdKm8ZgpfLLi1QPez7+TYMEOo0uTZAAND6VUWnhNVpOCBw4Cr9lqnxujcFtMh+lmAA0PpdTg80ZZnbAoqYdVx/IJ79WRVplAw0MplRaNR09pW8uqq9FVfl6z1epIFXa9hkcm0PBQSg06CQSpPtlitO0QFOuAneXeulbrWquQWp0gmAk0PJRSg0sEq6yUM094gzyxu53X4edtArW+aRimQcMjE2h4KKUGT2J+RuP8SXx62EsHrHH4WVisq63EbWweqNKpJGh4KKUGjzEd1rLy9CZEXFx27CnFRCMDWULVSxoeSqnBIdLWZOWtZdVbXrOWu1dnl2cKDQ+l1OBIzM1oOmoinx72Utthm/23ne1OcJ/OLs8U+n9BKTU4RBJNVjbjbLfHtaw6a1uaZK/WOjKFhodSatBYJUWc9p7FHdaySqbTPLTPIJYGSCbQ8FBKDbxEP0XL3ElcNOzlA9x5f95OguE6F+Pq0iSZQMNDKTUoxLbZ+p4QU4PJ7z/uYGg1LsFGXRAxU2h4KKUGheTnM/mEjUl1kHtshIgx2K2urqibITQ8lFKDwkwdzxXjnu3VciSdORiiBsQ1uqJuhtDwUEoNim0nlnJ4aHevliPpSp5ALN8egJKpvtDwUEoNOCs/n9gJtRRYdp+CA6DYCrB3ehAsDZBMoOGhlBpYIlhVw7l61nNto6aSbbbyHjfunPVYhQUDVFCVDA0PpdTAEouaY0bx3oI1AH2ueQBs2leGadaFETOBhodSakCJbbPjGMNoO97c1Nc+DxuhdWlZikun+krDQyk1oCQvzKxDNiXdVNVZjRtj5AIH4zgpKpnqDw0PpdSAsooK+VDVkqTWsurMwfDP+tkUrtyd6uKpPtLwUEoNHBGcscOZGd4K9K/J6k9rjsHdtCXVJVR9pOGhlEo9b88NsWiuymeY1dzn4ABoMQ7ybDlok1XG0PBQSqVeYha4WEK0yCIoye0a2NmC1mGMfLkWE4ulrIiqfzQ8lMoUIkgwhARD6S5JyhjHwQkKwUStwwuO3tRA/Pe5ddPJyOpN8RqNLk+SETQ8lEo3b3vW/Hw2fmMe7/7gCAKjRoJlI4EAVkEBVl5efGZ14r4dtmLN8G1Z3QDYiSJ6gXCg2kfnoNn4/ATchgYNjgwSSHcBlBryjAHLpvXYg/jDRb9jcqCB98+4nHHX5cO+Olb8ZDJWvc2MH63G2VsLxkUScyaM42T8BdUNJv8p1d8/8mYkj7HPNsW3nzXa55EpNDyUygASDLDp/UEOCTYRlADPzbudWx48mtf3TOCFab/EMXCqey0zbtmMqasnOmcK4hqsRSswkUhmBkiiRuSGhFCLine truncated
|
|
|
|
|
"text/plain": [
|
|
|
|
|
"<Figure size 720x720 with 1 Axes>"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
"metadata": {
|
|
|
|
|
"needs_background": "light"
|
|
|
|
|
},
|
|
|
|
|
"output_type": "display_data"
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"source": [
|
|
|
|
|
"#cut from Y = maxX\n",
|
|
|
|
|
"maxX = 940\n",
|
|
|
|
|
"imcut = imgrey.copy()\n",
|
|
|
|
|
"imcut[maxX : imcut.shape[0] + 1, :] = 0\n",
|
|
|
|
|
"\n",
|
|
|
|
|
"# show image\n",
|
|
|
|
|
"plt.figure(figsize = (10, 10))\n",
|
|
|
|
|
"plt.imshow(imcut)\n",
|
|
|
|
|
"plt.show()"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"cell_type": "markdown",
|
|
|
|
|
"metadata": {},
|
|
|
|
|
"source": [
|
|
|
|
|
"# 4.3 Extract and Simplify the Boundary Curves"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"cell_type": "markdown",
|
|
|
|
|
"metadata": {},
|
|
|
|
|
"source": [
|
|
|
|
|
"To simplfy the boundary curves of the final mesh, we collapse the edge if its edge length is smaller than edge_length_tot."
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"cell_type": "code",
|
|
|
|
|
"execution_count": 23,
|
|
|
|
|
"metadata": {},
|
|
|
|
|
"outputs": [],
|
|
|
|
|
"source": [
|
|
|
|
|
"edge_length_tot = 10.0"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"cell_type": "code",
|
|
|
|
|
"execution_count": 24,
|
|
|
|
|
"metadata": {},
|
|
|
|
|
"outputs": [
|
|
|
|
|
{
|
|
|
|
|
"data": {
|
|
|
|
|
"text/plain": [
|
|
|
|
|
"<matplotlib.image.AxesImage at 0x7fdbafdb8f40>"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
"execution_count": 24,
|
|
|
|
|
"metadata": {},
|
|
|
|
|
"output_type": "execute_result"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"data": {
|
|
|
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAY8AAAJCCAYAAAA4BEsQAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAABy10lEQVR4nO3dd3hUVf7H8feZkkkjISTUUAMJvSNNVBSxoDQFFysWBLGXdS27+3N31VXXXigi2EFEsWIXu9Kl11BDIBBqeiZTzu+PGe4kJCQkmWRmku/reXgy5+beO+dqMp+cc+49R2mtEUIIISrDFOgKCCGECD0SHkIIISpNwkMIIUSlSXgIIYSoNAkPIYQQlSbhIYQQotJqPTyUUhcppbYqpbYrpR6s7fcXQghRfao2n/NQSpmBbcBwIB1YAVyptd5Ua5UQQghRbbXd8ugPbNda79RaFwHzgdG1XAchhBDVZKnl90sE9hYrpwMDTt5JKTUZmAxgxtw3kpjaqZ0QQngpswlXTATmvCJ0kSPQ1QmIQvIo0nZV1vdqOzzKqkSpfjOt9SxgFkCMaqQHqGE1XS8hhPAwmTl2XX+Sbt7K860+4/O8Tnx6Xg+cGQcCXbNat0wvPuX3ajs80oFWxcotgf21XAchRH1mMmPqksz2a+OwZivavb4T97HjuAsLwWTm4G0D+Oz+/9HaEg1EMzFmDy9dN4bEp+pfeJSntsNjBZCslGoH7AMmAFfVch2EEPWVycy+vw3g3SnP08tmw64dbJikGf/rLaTcvJEDk/sWCw6P7wsa0GZeGs4AVjsY1eqAudbaCdwOfANsBhZorTfWZh2EEPWUNzh+uO1petlsANiUlb62MD45ezpbX+xZKjjSnLn85z834EzfF6haB61avVW3KmTMQwhRbSYz6Q8M4Mdbn6aJOeq0Dzt342jCRx70dGnVQ8v0YrL10TIHzOUJcyFEnec6u2eJ4HBpN/nuonKPSXPm4ni1Wb0NjopIeAgh6i6TGXPnZDo9vbFEcPRcdi1jt15W7qETt15Ng0Vra6OWIam2B8yFEKJ2eLuq5tz8MgPDzYAnOHosvZYWL4Ux8+35QHSZh24sKsAxsxlhhXtqscKhRVoeQoi6xzs4/uOtT5cKjjY3pWPOc9DQVPbHn0u7uWzuvUR9tLw2axxyJDyEEHWLUsZdVcW7qrovuY42N6XjOp4Fa7dxwdrrsevST46P2DKK9i/tgCC/mSjQJDyEEHWHUqQ/OKhUcHT7YyJtb0zzBAegHUU0mZLLsPV/KXH4xqIC8qcl4jqYWetVDzUSHkKIOkHZbKQ/OIifi91V9UshpHxwK+1u2oMrO7vUMX0S9pYoX/bOvUR+LN1Vp0MGzIUQIc+cnESjt47ydqunSSgWHP+4dzIdPlmK6+QDlGLLU035osWXxqbhm0fSYdpOnNJddVqk5SGECGnm5CQ6vLeXd9v+VKLF8Y97JxPxSRmtCKU4PHkg3571srFpc1E+ha+0wHngYG1VO+RJeAghQtaJ4HipxQpj2y+F8Pf7ppQdHIDq25X3Hn6G9lbfbbpj376PyI+X1Xh96xIJDyFESCorOH4vdPOPeyefMgjMTZtgevooKVbfFCXDNo2i/fSdNV7fukbCQwgRcszJSSTN21cqOB6695ZTtjgAMsZ34POURUZ5fk4c4ROd0l1VBTJgLoQIKeYO7Uiat49XEn2tiyt2DiPj2Q5EfnLqrifVrxvv3/80ZuVrdTyyYALtMlehLBa0UyZdrwxpeQghQoNS5EwYSIf56SWCo+Ov15E7wlHhmMXB/jG0t0SU2Db9qlmMXJtBhyVmDt45mGMTB2EKD0dZ5O/qish/ISFE8FOK9IcG8ePUklOqd/z1OtrfvLvMZzhOFpXpwokLc7G/mYdFuBgWsRca7oUHl5HrLuStB5LZmt+MX94aTLOlOegV62vkkkKdrOchhAhupwiOTr9dS9Kksh/+K4spKoptj3ane99dvN9hESZMWJW53GOeOpLMz2e1MJ5Mr29kPQ8hRGjyU3AAuPPy6HDvUuwX53DpX25m8D9uL3Nuq+KuiFlN7tCOVa5+XSbdVkKI4OSv4FC+P5yLLuhLbqKVolHHua3jt9iU9ZSHubSbR/aPIOq7jbirfBF1l4SHECL4KMXehwfx0y0lJzjs8tv1FY9xKIWlWVMOXdjOc9zlRxjbZh0Al8e8ROewyFMe6tJunjrSmXnb+9FkejgRWw/izkv333XVIRIeQoigkzt+QIng+KUQ7n/kNtp/uvGUwWFJbMGh89tg+sshbmz3B5Njvy5jr9LBke7M5abUCezLiqXJzAgiNmWQmL4RALl599QkPIQQwcVkpuntO0q0OO7/1200fGdJ6QkOAfvFZ2C/8yg3tF3C5Ngvy9ijtDRnLpO3/4X9X7Sh2ZI81JJ1JGpPC0MC4/RIeAghgoq5fRuua/6tUZ6892ziP9lYZnBk3jqYjx74H+2sZS8nu82Rx907xwOw63A8zV+zgVtjyXei/lhLc/bVxCXUCxIeQoigcvC8poyJyjXKP6zvTEr2ilL7nSo4Nhflc//uy9n3YTsar8pDLVkLQGv212zF6xkJDyFE8DCZaXP1dqPo0m7azyvd5jg5ODYWFfD3PWPYs6A9jf/0BEYTMmqt2vWRhIcQImiYk1pzXfPvjPLkvWcTtnpHiS4rxwX9SrU4xq+8mVbjNtAEmeCwtshDgkKIoHFgeLNSXVYnP92de1dWieA4c91ltJ0qoVHbJDyEEEHJpd10eLfkvU9FF/bj/W5vGOUz111G7LU5uA4dqu3q1XsSHkKIoJHbxvd60t5zsK4tuUhTYSNLiVaHeUaCBEeASHgIIYKCsli4Y6TvOY3U443LnZBwc1E+tiNFtVE1UQYJDyFEyHBefdR4/ei+SzD9tiZwlannJDyEEEHB3CqRFtZjgGe8o2h+01L7DG2RWtvVEqcg4SGECAr7RyRyebRn3io3mtjtBQGukSiPhIcQIuCUxULzcbuN8roiF5ZcGc8IZhIeQoiAM7dsweSWvxjl27dciXvNpgDWSFREwkMIEVhKkTol0Xg40KXdOBc0KbWb4/y+3Bz/m1HesLBzrVVRlCbhIYQIKBUWxl/HfGqUJ+89m8afbS21X35TKylW34qCcdtk8vRAkvAQQgRUzqhejIjaZpR/2NgJ15Gj5RwhgoGEhxAicJTiUF8TLS2ep8bt2kHyHEeAKyVOh4SHECJgVFgYD49ZaJRv3Xsulq17A1gjcbokPIQQAZMzqhfnR/rmr1pzqMVpdVmlOXOx5sqYRyBJeAghAianldnosnJoF+rT+FPve1mO8fpve0dh/unPmq6eKIeEhxAiIJQ1jOaXpBnlzQ4HjZcfO+X+lyZtNF67tarRuomKSXgIIQLC3KIpd7b53ihfv24i7nVbAlgjURkSHkKIgNg7rhWXRBYCni4r02eNAlwjURkSHkKIWqesYTQd4burqqIuKxF8JDyEELUud3Rv5iS/Z5RH/3hbuV1W5rg4Eqy+AfONX3Ss0fqJikl4CCFql1Jk9jPR2nuXVa67kJQZ5c+ge3RER+6N863l0XitPEgYaBIeQohaZYqI4JGxC4zyPfuGYd65v9xjtElhVvJxFUzk/4YQolbljOjOWRF7jPL3GzrjOnwkgDUSVSHhIYSoPWV0WXWcaQ9wpURVSHgIIWqNKTKS/4ydb5T3ODWm/IpXDLQ39D0UeNiVh7nQXSP1E6dPwkMIUWtMcQ1pZM41ylesmoRr07ZyjgCUYtj1S43i7WkjsfwoU5MEmoSHEKLW7LmmDcMiPN1Udu0g/NsY0LrC4yLMvrurilzm0zpG1CwJDyFE7VCKolht3DVVqJ00WXo8sHUSVSbhIYSoFaboaP5zmW+846GMc1H7DwewRqI6JDyEELUid3gXBoT7piT5al03XIcOBbBGojokPIQQNU8pDvQ30c7quUU3y11AxxmFAa6UqA4JDyFEjTM3aMCjxW7R/XvGUEx7DgawRqK6JDyEEDVONYimmSXLKH+T2lm6rEKchIcQosbtvq4tZ4V71hzPdxcR/XtkgGskqkvCQwhRo0zh4TQ854Bxi266y0HzH6TVEeokPIQQNcoU34gnUj4yyqOW3YJr684A1kj4g4SHEKJG7bq+LWfaPHNR5buLiPilAbhdAa6VqC4JDyFEjXI08D1Vnq8dNP9BHgysCyQ8hBA1xtwwtsQtulluDS6ZEbcukPAQQtQcZSpxi+4ly6biSt0VwAoJf5HwEELUmLwhybSxZBtlh91S6fEOFRaGVckYSbCR8BBC1JgDA8zGlCT57iKiV0ZU+hzZY3tzf/wao7xuRXt/VU9Ug4SHEKJWZLmLSPy28s93ZJztJtIUBnjWAGn9jdPfVRNVYAl0BYQQPqYGDVBmz990rqzser/okbKGcdOQX4zyTXuGE/bzeur3f5XgIOEhRBAwRUaSfnsvbpr4JV1s+3Bg5s7PryfsmCdIlIa27x9Ep2fgzs8PcG1rT/blfbi70QtAOABLlnaig31puceI2iHhIUSAKYuFLdM6s+WCF7Epq3erg0v+MrPEfr/f4ObljPNZ91Uv2i44iE7bh7uwbk9rfmCIJtrkCQ67dtD2C0cFR4jaImMeQgRY0Xm9WHTuK8WCo2xnhpuY3+4HNt06nQe/Xkj8D+EcmzgIU1QUKFVLtT19ymYjvNtxozzt6CDUsexTH3Dy8dYwJp39k1G+ac9wwn7f6McaiuqQ8BAigMxxcYx9/ju6hnnuQsp1F9Jz+ZV0+Ol6lha6OOzK47ArD5cu+WDd2eHwbtuf+PKxZ5i6ZjWpL/bH3DkZU3h4IC6jTKboKF7u8Z5RnremP84Dp7+Gx7Er+3Jno7VGecmyTnW+pRVKpNtKiABR1jA2P9uejxt+C3haHWeuvIHm43egHUX8J3k8hFnRSrF1Siw9euzmjaSPiTGFG9N9JJijGBWVz6hxr/LLpfBG5llsnNGbuLeXhvZLine truncated
|
|
|
|
|
"text/plain": [
|
|
|
|
|
"<Figure size 720x720 with 1 Axes>"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
"metadata": {
|
|
|
|
|
"needs_background": "light"
|
|
|
|
|
},
|
|
|
|
|
"output_type": "display_data"
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"source": [
|
|
|
|
|
"# Extrac Boundary\n",
|
|
|
|
|
"ret, thresh = cv2.threshold(imcut, 127, 255, 0)\n",
|
|
|
|
|
"contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)\n",
|
|
|
|
|
"plt.figure(figsize = (10, 10))\n",
|
|
|
|
|
"imContour = np.zeros(imcut.shape)\n",
|
|
|
|
|
"\n",
|
|
|
|
|
"# Compute Point With Highest Y coordinate\n",
|
|
|
|
|
"maxY = 0\n",
|
|
|
|
|
"for k, _ in enumerate(contours):\n",
|
|
|
|
|
" current_points = contours[k][:, 0]\n",
|
|
|
|
|
" for pt in current_points:\n",
|
|
|
|
|
" maxY = max(pt[1], maxY)\n",
|
|
|
|
|
" \n",
|
|
|
|
|
"boundary_points = []\n",
|
|
|
|
|
"\n",
|
|
|
|
|
"# draw countour\n",
|
|
|
|
|
"for k, _ in enumerate(contours):\n",
|
|
|
|
|
" trimmed_points = []\n",
|
|
|
|
|
" current_points = contours[k][:, 0]\n",
|
|
|
|
|
" prev_pt = np.array(current_points[-1])\n",
|
|
|
|
|
" for pt in current_points:\n",
|
|
|
|
|
" curr_pt = np.array(pt)\n",
|
|
|
|
|
" if np.linalg.norm(prev_pt - curr_pt) > edge_length_tot or pt[1] == maxY:\n",
|
|
|
|
|
" prev_pt = curr_pt\n",
|
|
|
|
|
" trimmed_points.append([pt[0], pt[1]])\n",
|
|
|
|
|
" \n",
|
|
|
|
|
" contours[k] = np.array([trimmed_points])\n",
|
|
|
|
|
" if contours[k].shape[1] > 0:\n",
|
|
|
|
|
" imContour = cv2.drawContours(imContour, contours, k, (255, 255, 255), 6)\n",
|
|
|
|
|
" boundary_points.append(trimmed_points)\n",
|
|
|
|
|
"\n",
|
|
|
|
|
" \n",
|
|
|
|
|
"# scale boundary points\n",
|
|
|
|
|
"scale = max(imcut.shape[0], imcut.shape[1])\n",
|
|
|
|
|
"for pts in boundary_points:\n",
|
|
|
|
|
" for pt in pts:\n",
|
|
|
|
|
" pt[0] /= scale\n",
|
|
|
|
|
" pt[1] = (maxY - pt[1]) / scale\n",
|
|
|
|
|
" \n",
|
|
|
|
|
"plt.imshow(imContour)"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"cell_type": "markdown",
|
|
|
|
|
"metadata": {},
|
|
|
|
|
"source": [
|
|
|
|
|
"# 4.4 Find Holes"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"cell_type": "markdown",
|
|
|
|
|
"metadata": {},
|
|
|
|
|
"source": [
|
|
|
|
|
"Some curves stored in boundary_points refers to holes in the mesh, we put their indices in to holes_indices array to compute the centroid of the holes for late remeshing. If the image has no hole, just set holes_indices to be empty list."
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"cell_type": "code",
|
|
|
|
|
"execution_count": 25,
|
|
|
|
|
"metadata": {},
|
|
|
|
|
"outputs": [],
|
|
|
|
|
"source": [
|
|
|
|
|
"holes_indices = [1]"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"cell_type": "code",
|
|
|
|
|
"execution_count": 26,
|
|
|
|
|
"metadata": {},
|
|
|
|
|
"outputs": [],
|
|
|
|
|
"source": [
|
|
|
|
|
"Holes = []\n",
|
|
|
|
|
"for k in holes_indices:\n",
|
|
|
|
|
" ct = np.array([0, 0], dtype = float)\n",
|
|
|
|
|
" for pt in boundary_points[k]:\n",
|
|
|
|
|
" ct += np.array(pt, dtype = float)\n",
|
|
|
|
|
" ct /= len(boundary_points[k])\n",
|
|
|
|
|
" Holes.append([ct[0], ct[1]])"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"cell_type": "markdown",
|
|
|
|
|
"metadata": {},
|
|
|
|
|
"source": [
|
|
|
|
|
"# 4.5 Draw Mesh"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"cell_type": "code",
|
|
|
|
|
"execution_count": 27,
|
|
|
|
|
"metadata": {},
|
|
|
|
|
"outputs": [],
|
|
|
|
|
"source": [
|
|
|
|
|
"from geometry import compute_mesh_centroid, compute_center_support_line\n",
|
|
|
|
|
"def draw_mesh(V, F):\n",
|
|
|
|
|
" shading = {\"flat\":True, # Flat or smooth shading of triangles\n",
|
|
|
|
|
" \"wireframe\":True, \"wire_width\": 0.03, \"wire_color\": \"black\", # Wireframe rendering\n",
|
|
|
|
|
" \"width\": 600, \"height\": 600, # Size of the viewer canvas\n",
|
|
|
|
|
" \"antialias\": True, # Antialising, might not work on all GPUs\n",
|
|
|
|
|
" \"scale\": 2.0, # Scaling of the model\n",
|
|
|
|
|
" \"side\": \"DoubleSide\", # FrontSide, BackSide or DoubleSide rendering of the triangles\n",
|
|
|
|
|
" \"colormap\": \"viridis\", \"normalize\": [None, None], # Colormap and normalization for colors\n",
|
|
|
|
|
" \"background\": \"#ffffff\", # Background color of the canvas\n",
|
|
|
|
|
" \"line_width\": 1.0, \"line_color\": \"black\", # Line properties of overlay lines\n",
|
|
|
|
|
" \"bbox\": False, # Enable plotting of bounding box\n",
|
|
|
|
|
" \"point_color\": \"red\", \"point_size\": 0.01 # Point properties of overlay points\n",
|
|
|
|
|
" }\n",
|
|
|
|
|
" p = mp.plot(V, F, shading=shading, return_plot=True)\n",
|
|
|
|
|
" center0 = np.array(compute_mesh_centroid(V, F))\n",
|
|
|
|
|
" center1 = center0.copy()\n",
|
|
|
|
|
" center1[1] = 0\n",
|
|
|
|
|
" vertices = np.vstack([center0, center1])\n",
|
|
|
|
|
" p.add_points(vertices, shading={\"point_color\": \"black\", \"point_size\": 0.1})\n",
|
|
|
|
|
" p.add_edges(vertices, np.array([[0, 1]]), shading={\"line_color\": \"black\", \"line_width\" : 0.5});"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"cell_type": "code",
|
|
|
|
|
"execution_count": 28,
|
|
|
|
|
"metadata": {
|
|
|
|
|
"pycharm": {
|
|
|
|
|
"name": "#%%\n"
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
"outputs": [
|
|
|
|
|
{
|
|
|
|
|
"data": {
|
|
|
|
|
"application/vnd.jupyter.widget-view+json": {
|
|
|
|
|
"model_id": "2d78d5509cd3442db7397fb4bd8b570f",
|
|
|
|
|
"version_major": 2,
|
|
|
|
|
"version_minor": 0
|
|
|
|
|
},
|
|
|
|
|
"text/plain": [
|
|
|
|
|
"Renderer(camera=PerspectiveCamera(children=(DirectionalLight(color='white', intensity=0.6, position=(0.3245370…"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
"metadata": {},
|
|
|
|
|
"output_type": "display_data"
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"source": [
|
|
|
|
|
"from utility import triangulate_mesh\n",
|
|
|
|
|
"[V, F] = triangulate_mesh(boundary_points, Holes, 0.001)\n",
|
|
|
|
|
"draw_mesh(V, F)"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"cell_type": "markdown",
|
|
|
|
|
"metadata": {},
|
|
|
|
|
"source": [
|
|
|
|
|
"# 4.6 Save as SVG"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"cell_type": "markdown",
|
|
|
|
|
"metadata": {},
|
|
|
|
|
"source": [
|
|
|
|
|
"The following code is for outputing the svg files.\n",
|
|
|
|
|
"\n",
|
|
|
|
|
"The unit in the following svg file is mm. A point (100, 100) refers to a point (10 cm, 10 cm).\n",
|
|
|
|
|
"\n",
|
|
|
|
|
"You have to write code to generate slits by yourself to provide off-plane stability for your laser cutting model."
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"cell_type": "code",
|
|
|
|
|
"execution_count": 29,
|
|
|
|
|
"metadata": {},
|
|
|
|
|
"outputs": [],
|
|
|
|
|
"source": [
|
|
|
|
|
"dwg = svgwrite.Drawing('dance.svg')\n",
|
|
|
|
|
"for Es in igl.boundary_facets(F):\n",
|
|
|
|
|
" p0 = V[Es[0]]\n",
|
|
|
|
|
" p1 = V[Es[1]]\n",
|
|
|
|
|
" dwg.add(dwg.line((p0[0], p0[1]), (p1[0], p1[1])))\n",
|
|
|
|
|
"dwg.save()"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"cell_type": "markdown",
|
|
|
|
|
"metadata": {},
|
|
|
|
|
"source": [
|
|
|
|
|
"# 5. Design your own Mesh"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"cell_type": "markdown",
|
|
|
|
|
"metadata": {},
|
|
|
|
|
"source": [
|
|
|
|
|
"Please design 3 different meshes that are original not equilibrium.\n",
|
|
|
|
|
"\n",
|
|
|
|
|
"Try to optimize them to be equilibrium and report it in your pdf handin."
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"cell_type": "code",
|
|
|
|
|
"execution_count": 30,
|
|
|
|
|
"metadata": {},
|
|
|
|
|
"outputs": [],
|
|
|
|
|
"source": [
|
|
|
|
|
"def handle_img(name,holes_count=0): \n",
|
|
|
|
|
" #read the image\n",
|
|
|
|
|
" image_path = \"../data/\"+name+\".png\"\n",
|
|
|
|
|
" img = cv2.imread(image_path, 1) \n",
|
|
|
|
|
"\n",
|
|
|
|
|
" # convert the image to grey scale\n",
|
|
|
|
|
" imgrey = 255 - cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)\n",
|
|
|
|
|
"\n",
|
|
|
|
|
" # show image\n",
|
|
|
|
|
" plt.figure(figsize = (10, 10))\n",
|
|
|
|
|
" plt.imshow(imgrey)\n",
|
|
|
|
|
" plt.show()\n",
|
|
|
|
|
" #cut from Y = maxX\n",
|
|
|
|
|
" maxX = 995\n",
|
|
|
|
|
" imcut = imgrey.copy()\n",
|
|
|
|
|
" imcut[maxX : imcut.shape[0] + 1, :] = 0\n",
|
|
|
|
|
"\n",
|
|
|
|
|
" # show image\n",
|
|
|
|
|
" plt.figure(figsize = (10, 10))\n",
|
|
|
|
|
" plt.imshow(imcut)\n",
|
|
|
|
|
" plt.show()\n",
|
|
|
|
|
" edge_length_tot = 5.0\n",
|
|
|
|
|
" # Extrac Boundary\n",
|
|
|
|
|
" ret, thresh = cv2.threshold(imcut, 127, 255, 0)\n",
|
|
|
|
|
" contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)\n",
|
|
|
|
|
" plt.figure(figsize = (10, 10))\n",
|
|
|
|
|
" imContour = np.zeros(imcut.shape)\n",
|
|
|
|
|
"\n",
|
|
|
|
|
" # Compute Point With Highest Y coordinate\n",
|
|
|
|
|
" maxY = 0\n",
|
|
|
|
|
" for k, _ in enumerate(contours):\n",
|
|
|
|
|
" current_points = contours[k][:, 0]\n",
|
|
|
|
|
" for pt in current_points:\n",
|
|
|
|
|
" maxY = max(pt[1], maxY)\n",
|
|
|
|
|
" \n",
|
|
|
|
|
" boundary_points = []\n",
|
|
|
|
|
"\n",
|
|
|
|
|
" # draw countour\n",
|
|
|
|
|
" for k, _ in enumerate(contours):\n",
|
|
|
|
|
" trimmed_points = []\n",
|
|
|
|
|
" current_points = contours[k][:, 0]\n",
|
|
|
|
|
" prev_pt = np.array(current_points[-1])\n",
|
|
|
|
|
" for pt in current_points:\n",
|
|
|
|
|
" curr_pt = np.array(pt)\n",
|
|
|
|
|
" if np.linalg.norm(prev_pt - curr_pt) > edge_length_tot or pt[1] == maxY:\n",
|
|
|
|
|
" prev_pt = curr_pt\n",
|
|
|
|
|
" trimmed_points.append([pt[0], pt[1]])\n",
|
|
|
|
|
" \n",
|
|
|
|
|
" contours[k] = np.array([trimmed_points])\n",
|
|
|
|
|
" if contours[k].shape[1] > 0:\n",
|
|
|
|
|
" imContour = cv2.drawContours(imContour, contours, k, (255, 255, 255), 6)\n",
|
|
|
|
|
" boundary_points.append(trimmed_points)\n",
|
|
|
|
|
"\n",
|
|
|
|
|
" \n",
|
|
|
|
|
" # scale boundary points\n",
|
|
|
|
|
" scale = max(imcut.shape[0], imcut.shape[1])\n",
|
|
|
|
|
" for pts in boundary_points:\n",
|
|
|
|
|
" for pt in pts:\n",
|
|
|
|
|
" pt[0] /= scale\n",
|
|
|
|
|
" pt[1] = (maxY - pt[1]) / scale\n",
|
|
|
|
|
" \n",
|
|
|
|
|
" plt.imshow(imContour)\n",
|
|
|
|
|
" \n",
|
|
|
|
|
" holes_indices = np.arange(holes_count)\n",
|
|
|
|
|
" Holes = []\n",
|
|
|
|
|
" for k in holes_indices:\n",
|
|
|
|
|
" ct = np.array([0, 0], dtype = float)\n",
|
|
|
|
|
" for pt in boundary_points[k]:\n",
|
|
|
|
|
" ct += np.array(pt, dtype = float)\n",
|
|
|
|
|
" ct /= len(boundary_points[k])\n",
|
|
|
|
|
" Holes.append([ct[0], ct[1]])\n",
|
|
|
|
|
" \n",
|
|
|
|
|
" \n",
|
|
|
|
|
" [V, F] = triangulate_mesh(boundary_points, Holes, 0.001)\n",
|
|
|
|
|
" draw_mesh(V, F)\n",
|
|
|
|
|
" \n",
|
|
|
|
|
" dwg = svgwrite.Drawing('../data/'+name+'.svg')\n",
|
|
|
|
|
" for Es in igl.boundary_facets(F):\n",
|
|
|
|
|
" p0 = V[Es[0]]\n",
|
|
|
|
|
" p1 = V[Es[1]]\n",
|
|
|
|
|
" dwg.add(dwg.line((p0[0], p0[1]), (p1[0], p1[1])))\n",
|
|
|
|
|
" dwg.save()"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"cell_type": "code",
|
|
|
|
|
"execution_count": 31,
|
|
|
|
|
"metadata": {
|
|
|
|
|
"scrolled": false
|
|
|
|
|
},
|
|
|
|
|
"outputs": [
|
|
|
|
|
{
|
|
|
|
|
"data": {
|
|
|
|
|
"image/png": "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 truncated
|
|
|
|
|
"text/plain": [
|
|
|
|
|
"<Figure size 720x720 with 1 Axes>"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
"metadata": {
|
|
|
|
|
"needs_background": "light"
|
|
|
|
|
},
|
|
|
|
|
"output_type": "display_data"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"data": {
|
|
|
|
|
"image/png": "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 truncated
|
|
|
|
|
"text/plain": [
|
|
|
|
|
"<Figure size 720x720 with 1 Axes>"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
"metadata": {
|
|
|
|
|
"needs_background": "light"
|
|
|
|
|
},
|
|
|
|
|
"output_type": "display_data"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"data": {
|
|
|
|
|
"application/vnd.jupyter.widget-view+json": {
|
|
|
|
|
"model_id": "0d379ea2132843419b9678842b7dc320",
|
|
|
|
|
"version_major": 2,
|
|
|
|
|
"version_minor": 0
|
|
|
|
|
},
|
|
|
|
|
"text/plain": [
|
|
|
|
|
"Renderer(camera=PerspectiveCamera(children=(DirectionalLight(color='white', intensity=0.6, position=(0.2763888…"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
"metadata": {},
|
|
|
|
|
"output_type": "display_data"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"data": {
|
|
|
|
|
"image/png": "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 truncated
|
|
|
|
|
"text/plain": [
|
|
|
|
|
"<Figure size 720x720 with 1 Axes>"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
"metadata": {
|
|
|
|
|
"needs_background": "light"
|
|
|
|
|
},
|
|
|
|
|
"output_type": "display_data"
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"source": [
|
|
|
|
|
"handle_img(\"drawA\",15)"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"cell_type": "code",
|
|
|
|
|
"execution_count": 32,
|
|
|
|
|
"metadata": {
|
|
|
|
|
"scrolled": false
|
|
|
|
|
},
|
|
|
|
|
"outputs": [
|
|
|
|
|
{
|
|
|
|
|
"data": {
|
|
|
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAY8AAAJCCAYAAAA4BEsQAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAABiKUlEQVR4nO3dd3Qc1d3G8e/d2VUvlmxJli3bso27DQYbbHrvvYYWCCWEAAkphJKQ5CUhAUJCh9B775heTAeDwb33JltustW10u7Mff+QcGwsl1UbSft8ztGRNDuz+xtpd5+dO/feMdZaREREYhHwuwAREel4FB4iIhIzhYeIiMRM4SEiIjFTeIiISMwUHiIiErM2Dw9jzFHGmHnGmIXGmGvb+vFFRKT5TFuO8zDGOMB84HCgCPgOOMtaO7vNihARkWZr6yOPvYCF1trF1to64HngxDauQUREminYxo/XE1ix2e9FwJgfr2SMuQS4BMDBGZVCRttUJyIim4Spos7WmsZua+vwaKyIrdrNrLUPAg8CZJhsO8Yc2tp1iYjIj3xrx2/ztrZutioCem32ewGwqo1rEBGRZmrr8PgOGGCM6WuMSQDOBMa1cQ0iItJMbdpsZa2NGmOuAN4HHOBRa+2stqxBRESar63PeWCtfQd4p60fV0REWo5GmIuISMwUHiIiEjOFh4iIxEzhISIiMVN4iIhIzBQeIiISM4WHiIjETOEhIiIxU3iIiEjMFB4iIhIzhYeIiMRM4SEiIjFTeIiISMwUHiIiEjOFh4iIxEzhISIiMVN4iIhIzBQeIiISM4WHiIjETOEhIiIxU3iIiEjMFB4iIhIzhYeIiMRM4SEiIjFTeIiISMwUHiIiEjOFh4iIxEzhISIiMVN4iIhIzBQeIiISM4WHiIjETOEhIiIxU3iIiEjMFB4iIhIzhYeIiMRM4SEiIjFTeIiISMwUHiIiEjOFh4iIxEzhISIiMVN4iIhIzBQeIiISM4WHiIjETOEhIiIxU3iIiEjMFB4iIhIzhYeIiMRM4SEiIjFTeIiISMwUHiIiEjOFh4iIxEzhISIiMVN4iIhIzBQeIiISM4WHiIjETOEhIiIxU3iIiEjMFB4iIhIzhYeIiMRM4SEiIjFTeIiISMwUHiIiEjOFh4iIxEzhISIiMVN4iIhIzBQeIiISM4WHiIjETOEhIiIxU3iIiEjMFB4iIhIzhYeIiMRM4SEiIjFTeIiISMwUHiIiEjOFh4iIxEzhISIiMVN4iIhIzBQeIiISM4WHiIjETOEhIiIxU3iIiEjMFB4iIhIzhYeIiMRM4SEiIjFTeIiISMwUHiIiEjOFh4iIxEzhISIiMVN4iIhIzBQeIiISM4WHiIjETOEhIiIxa3J4GGN6GWM+McbMMcbMMsZc2bA82xjzoTFmQcP3rM22uc4Ys9AYM88Yc2RL7ICIiLS95hx5RIHfW2uHAGOBy40xQ4FrgfHW2gHA+IbfabjtTGAYcBRwnzHGaU7xIiLijyaHh7W22Fo7ueHnCmAO0BM4EXiiYbUngJMafj4ReN5aW2utXQIsBPZq6uOLiIh/WuSchzGmENgd+BbIs9YWQ33AALkNq/UEVmy2WVHDssbu7xJjzPfGmO8j1LZEiSIi0oKaHR7GmDTgFeA31try7a3ayDLb2IrW2gettaOttaNDJDa3RBERaWHNCg9jTIj64HjGWvtqw+I1xpj8htvzgbUNy4uAXpttXgCsas7ji4iIP5rT28oAjwBzrLW3bXbTOOD8hp/PB97YbPmZxphEY0xfYAAwsamPLyIi/gk2Y9t9gZ8CM4wxUxuW/RG4GXjRGHMRsBw4HcBaO8sY8yIwm/qeWpdba91mPL6IiPjEWNvoaYd2I8Nk2zHmUL/LEBGJO9/a8ZTbDY2dr9YIcxERiZ3CQ0REYqbwEBGRmCk8REQkZgoPERGJmcJDRERipvAQEZGYKTxERCRmCg8REYmZwkNERGKm8BARkZgpPEREJGYKDxERiZnCQ0REYqbwEBGRmCk8REQkZgoPERGJmcJDRERipvAQEZGYKTxERCRmCg8REYmZwkNERGKm8BARkZgpPEREJGYKDxERiZnCQ0REYqbwEBGRmCk8REQkZgoPERGJmcJDRERipvAQEZGYKTxERCRmCg8REYmZwkNERGKm8BARkZgpPEREJGYKDxERiZnCQ0REYqbwEBGRmCk8REQkZgoPERGJmcJDRERipvAQEZGYKTxERCRmCg8REYmZwkNERGKm8BARkZgpPEREJGYKDxERiZnCQ0REYqbwEBGRmCk8REQkZgoPERGJmcJDRERipvAQEZGYKTxERCRmCg8REYmZwkNERGKm8BARkZgpPEREJGYKDxERiZnCQ0REYqbwEBGRmCk8REQkZgoPERGJmcJDRERipvAQEZGYKTxERCRmCg8REYmZwkNERGKm8BARkZgpPEREJGYKDxERiZnCQ0REYqbwEBGRmAX9LkCkRRkDJoAJGHAcAslJmC6Z2MQE2FCGSQhBYgI2MYSXlADBAIGyamxSCJsYwjoGpzyMqQ4DYJMTYX0pWA9bE8ZGo/XLI1GwXv1jWuvTzor4R+EhHU/AwcnMwCQmQCgEoSDVA3MIZztEUgzRFEMkFaKplrqedYwZuIRkJ8Lk1QV0T68gL2UD2QnV9EzcSLZTxaTKQrJDVRQkbCBkXJbXdWVORXeSnAjZCdV8vrI/4boQdXVBzPJkjAeJpYbEjRbjQtdp5QTKa2BDKTZci62txbquQkU6NWPb+RM8w2TbMeZQv8sQPwQcjOMQyEjDZKRTV5BNed8kKnsaagbV0rVbBV1TqhiYsZZDMucwKLSWJOORZCA9ECTZJOCYlm2ZrbURgjiUe2FKvfojjydL98LD8NbyYWxYk0HqggTSVnqkr6glWBomsL4MW1WFV1WDjdS1aD0irelbO55yu8E0dpvCQ9oHYzCOgwkGYWAh0Ywk1u+aQrgb5O23igGZ6zi16/cMTSgh3QRICyQSMo7fVW/FtR5r3Wo2eA6z6rqzpDaX+VV5TCgqxJ2TTv43UUzUkjKrmOiq1fUbea6/RYtsg8JD2idjcLp1w6SlUD0olzWjQ9QURDls91nsnzmPg1KW0i2QQEogwe9Kmy1i6wNiQq1DtZfIjQuPpfST7hgL+V9VE5yxGK8mXN/cpTCRdkLhIe2GSUwk0LsnlcO6UZ3jED66nJHdV3Ju7gQOTa4mgGnxpqb2KmJdPDyeq+jJDZ+fSKgkSGqRIf/jdXiLl4Pr6tyJ+ErhIf4xhkBaGu6IftRlJrB6bIhDjpnMGdkTyXGqGBhKaJfNT23NtR4elo1emP9bfSjjP9idULkha4FLxtdLia5dryMSaXMKD2lzJpRAoE9PNu6Vx5qj6rhw5NcMTy7iiOQNnaIZqrX9cFQyIZzIXxaeSMW4fPI/XIO3rAhb13DSvZ2/dqXjU3hI6zMGJz0dcrsSzctk5QEp9D1yCTf0eYORCcG4aYpqLcXRSv5SfCSffDmCLnMMKetd0r5agluyQUck0moUHtJqTCgBJy+HsjEFrDzK4/jdpzI8dSU/SV9EmklUaLSwMq+GNa7HajeVm5cdQ9GbhRS8tx5v0TJsba3f5Ukno/CQFhdIScEb3p/i/dPpd8IiLu35KYcmV+v8RRubU1fNAyUH8PaHe1L4Vg2hmUtwy8rVpCUtQuEhLSfg4Azoy4KLcjjl8An8quuXFATT/K4q7pV5NTxdPpD75+1P+gsZZH2xHHfN2k3TqYg0hcJDmqehx5Qd2Jvi/TLJPWEFd/R/kWEJyX5XJj8SsS4LI7Vct+xk5n/Qnz5vboCFy/Gqq/0uTToghYc0jTEEu+dROao3y0+w/GzMV/wy+zu6BpJ1LqMDmB+p4sWyUTzx3sEMvHsF0RVFfpckHYzCQ2JjDIGUFKK7D2DDNdX8bcg4DkwqJS2Q5Hdl0gRTa2s57etL6fWkQ/LkZeqhJTtN4SE7zcnLpWqvQpaf4nLGyEn8MWcCmQE1T3V01V4dr1Xlc8/ig4i8kkveRytxV67WRI2yXQoP2aFAejp2YG/mn5fOHcc8ydEpFeo51UktilTyz+Kj+OaNXenz31m4pWV+lyTt1PbCo9kN18YYxxgzxRjzVsPv2caYD40xCxq+Z2227nXGmIXGmHnGmCOb+9jSfCYYJNirgCVXjWC3h2cx/dQ7OCFVXW47s/6hNB7p/SU3Xfg4C64bit1nN5yMDL/Lkg6mJc56XgnM2ez3a4Hx1toBwPiG3zHGDAXOBIYBRwH3GaN3KD85XbNZ+bu92PBgIq+d/29uyZuq8xpx5ITUaqacczvHP/QpSx7pA2N3rb8So8hOaFZ4GGMKgGOBhzdbfCLwRMPPTwAnbbb8eWttrbV2CbAQ2Ks5jy9NE0hPp+akvZj7twE8/ss7+HLXlxiSkOJ3WeKDtEASv8paxjd7P0jd38uo+MkYgj171F9XRWQ7mvsMuQO4GkjfbFmetbYYwFpbbIzJbVjeE/hms/WKGpZtxRhzCXAJQBJ6U2sxxuAMGcDSU7vxz/Oe1CSFsklmIJmPhr7G1Jui/HHxKVTfM4rUt6bohLpsU5OPPIwxxwFrrbWTdnaTRpY1erbeWvugtXa0tXZ0iMSmliibcTIyqD5pL1b8I8gHP/8XJ6VWKjhkC44JMCoxgdcGvcqo6yex/OrRBEYOhYBal2VrzTny2Bc4wRhzDJAEZBhjngbWGGPyG4468oG1DesXAb02274AWNWMx5edYQzO0IEsPaUrt53/CAcnV5JoNJ2IbFtKIIE78r9n46Wfc9GRJ1J64+4kfTMft7zc79KkHWnykYe19jprbYG1tpD6E+EfW2vPBcYB5zesdj7wRsPP44AzjTGJxpi+wABgYpMrlx1yMjIoP2sM6//l8ebF/+KolFoSTcjvsqSDyHJSeLLfmxx469fM+c8gnF366oS6bNIaZ8VuBl40xlwELAdOB7DWzjLGvAjMBqLA5dZLine truncated
|
|
|
|
|
"text/plain": [
|
|
|
|
|
"<Figure size 720x720 with 1 Axes>"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
"metadata": {
|
|
|
|
|
"needs_background": "light"
|
|
|
|
|
},
|
|
|
|
|
"output_type": "display_data"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"data": {
|
|
|
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAY8AAAJCCAYAAAA4BEsQAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAABAKklEQVR4nO3deXhcZf3+8fdnlkz2tOmaNt0obenCUlrZQaDsIiCIAiIoYL8qfkUFEZSv/lBUBEUU3BAUcGNRkLLIYkFB9gIFWrrvadMlTbMnk5k5z++PjBqxtD2ZJCczc7+uq1cmJ5PM/fRKcuec85znmHMOERERP0JBBxARkeyj8hAREd9UHiIi4pvKQ0REfFN5iIiIbyoPERHxrd/Lw8xOMrNlZrbSzK7q79cXEZHMWX9e52FmYWA5cDxQA7wKnOuce6ffQoiISMb6e8/jIGClc261c64TuAc4vZ8ziIhIhiL9/HqjgQ3d3q8BDn73k8xsLjAXIEx4VjHl/ZNORET+pYNWOl3cdvax/i6PnYX4r+NmzrnbgNsAyq3SHWxz+jqXiIi8y8tu/nt+rL8PW9UAY7q9Xw1s6ucMIiKSof4uj1eBSWY2wcwKgHOAef2cQUREMtSvh62cc0kz+xzwBBAGfuWcW9yfGUREJHP9fc4D59xjwGP9/boiItJ7dIW5iIj4pvIQERHfVB4iIuKbykNERHxTeYiIiG8qDxER8U3lISIivqk8RETEN5WHiIj4pvIQERHfVB4iIuKbykNERHxTeYiIiG8qDxER8U3lISIivqk8RETEN5WHiIj4pvIQERHfVB4iIuKbykNERHxTeYiIiG8qDxER8U3lISIivqk8RETEN5WHiIj4pvIQERHfVB4iIuKbykNERHxTeYiIiG8qDxER8U3lISIivqk8RETEN5WHiIj4pvIQERHfVB4iIuKbykNERHxTeYiIiG8qDxER8U3lISIivqk8RETEN5WHiIj4pvIQERHfVB4iIuKbykNERHxTeYiIiG8qDxER8U3lISIivqk8RETEN5WHiIj4pvIQERHfVB4iIuKbykNERHxTeYiIiG8qDxER8U3lISIivqk8RETEN5WHiIj4pvIQERHfVB4iIuKbykNERHxTeYiIiG8qDxER8U3lISIivqk8RETEN5WHiIj4pvIQERHfVB4iIuKbykNERHxTeYiIiG8qDxER8U3lISIivqk8RETEN5WHiIj4pvIQERHfVB4iIuKbykNERHxTeYiIiG8qDxER8U3lISIivqk8RETEN5WHiIj4pvIQERHfVB4iIuKbykNERHxTeYiIiG8qDxER8U3lISIivqk8RETEN5WHiIj4pvIQERHfVB4iIuKbykNERHzrcXmY2Rgze8bMlpjZYjO7LL290syeMrMV6beDu33O1Wa20syWmdmJvTEAERHpf5nseSSBy51zU4FDgEvNbBpwFTDfOTcJmJ9+n/THzgGmAycBPzWzcCbhRUQkGD0uD+dcrXPu9fTjZmAJMBo4Hbgr/bS7gDPSj08H7nHOxZ1za4CVwEE9fX0REQlOr5zzMLPxwEzgZWCEc64WugoGGJ5+2mhgQ7dPq0lv29nXm2tmC8xsQYJ4b0QUEZFelHF5mFkp8CfgC865pl09dSfb3M6e6Jy7zTk32zk3O0os04giItLLMioPM4vSVRy/c849kN68xcyq0h+vAramt9cAY7p9ejWwKZPXFxGRYGQy28qAO4Alzrmbun1oHnBh+vGFwEPdtp9jZjEzmwBMAl7p6euLiEhwIhl87uHAx4G3zWxhettXgeuB+8zsYmA9cDaAc26xmd0HvEPXTK1LnXOpDF5fREQCYs7t9LTDgFFule5gmxN0DBGRvPOym0+Tq9/Z+WpdYS4iIv6pPERExDeVh4iI+KbyEBER31QeIiLim8pDRER8U3mIiIhvKg8REfFN5SEiIr6pPERExDeVh4iI+KbyEBER31QeIiLim8pDRER8U3mIiIhvKg8REfFN5SEiIr6pPERExDeVh4iI+KbyEBER31QeIiLim8pDRER8U3mIiIhvKg8REfFN5SEiIr6pPERExDeVh4iI+KbyEBER31QeIiLim8pDRER8U3mIiIhvKg8REfFN5SEiIr6pPERExDeVh4iI+KbyEBER31QeIiLim8pDRER8U3mIiIhvKg8REfFN5SEiIr6pPERExDeVh4iI+KbyEBER31QeIiLim8pDRER8U3mIiIhvKg8REfFN5SEiIr6pPERExDeVh4iI+KbyEBER31QeIiLim8pDRER8U3mIiIhvKg8REfFN5SEiIr6pPERExDeVh4iI+KbyEBER31QeIiLim8pDRER8U3mIiIhvKg8REfFN5SEiIr6pPERExDeVh4iI+KbyEBER31QeIiLim8pD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 truncated
|
|
|
|
|
"text/plain": [
|
|
|
|
|
"<Figure size 720x720 with 1 Axes>"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
"metadata": {
|
|
|
|
|
"needs_background": "light"
|
|
|
|
|
},
|
|
|
|
|
"output_type": "display_data"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"data": {
|
|
|
|
|
"application/vnd.jupyter.widget-view+json": {
|
|
|
|
|
"model_id": "42e80256f1384245ac4c2971fb58067b",
|
|
|
|
|
"version_major": 2,
|
|
|
|
|
"version_minor": 0
|
|
|
|
|
},
|
|
|
|
|
"text/plain": [
|
|
|
|
|
"Renderer(camera=PerspectiveCamera(children=(DirectionalLight(color='white', intensity=0.6, position=(0.2819444…"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
"metadata": {},
|
|
|
|
|
"output_type": "display_data"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"data": {
|
|
|
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAY8AAAJCCAYAAAA4BEsQAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAABM10lEQVR4nO3dd3xUVf7/8deZSSMNAkhH6V2kSVFXWbEgsthXFBVdFXvvrr913e/ay6pYULH37rKWVRdFRKkK0pu0UEMJpLeZ8/sjw00Cody0m5l5Px8PHrnnzJ3M51Ly5pxzi7HWIiIi4obP6wJERCT8KDxERMQ1hYeIiLim8BAREdcUHiIi4prCQ0REXKvz8DDGDDfGLDPGrDTG3FnXny8iItVn6vI6D2OMH1gOnAisB2YD51lrF9dZESIiUm11PfIYCKy01q6y1hYB7wGn1XENIiJSTTF1/HmtgfRy7fXAoD13MsaMA8YB+PH3TyS1bqoTERFHAbkU2UJT2Wt1HR6VFbHXvJm19kXgRYBU09gOMsNquy4REdnDTDt5n6/V9bTVeqBtuXYbYGMd1yAiItVU1+ExG+hsjGlvjIkDRgOT6rgGERGppjqdtrLWlhhjrgW+BvzAK9baRXVZg4iIVF9dr3lgrf0S+LKuP1dERGqOrjAXERHXFB4iIuKawkNERFxTeIiIiGsKDxERcU3hISIirik8RETENYWHiIi4pvAQERHXFB4iIuKawkNERFxTeIiIiGsKDxERcU3hISIirik8RETENYWHiIi4pvAQERHXFB4iIuKawkNERFxTeIiIiGsKDxERcU3hISIirik8RETENYWHiIi4pvAQERHXFB4iIuKawkNERFxTeIiIiGsKDxERcU3hISIirik8RETENYWHiIi4pvAQERHXFB4iIuKawkNERFxTeIiIiGsKDxERcU3hISIirik8RETENYWHiIi4pvAQERHXFB4iIuKawkNERFxTeIiIiGsKDxERcU3hISIirik8RETENYWHiIi4pvAQERHXFB4iIuKawkNERFxTeIiIiGsKDxERcU3hISIirik8RETENYWHiIi4pvAQERHXFB4iIuKawkNERFxTeIiIiGsKDxERcU3hISIirik8RETENYWHiIi4pvAQERHXFB4iIuKawkNERFxTeIiIiGsKDxERcU3hISIirik8RETENYWHiIi4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 truncated
|
|
|
|
|
"text/plain": [
|
|
|
|
|
"<Figure size 720x720 with 1 Axes>"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
"metadata": {
|
|
|
|
|
"needs_background": "light"
|
|
|
|
|
},
|
|
|
|
|
"output_type": "display_data"
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"source": [
|
|
|
|
|
"handle_img(\"drawB\",0)"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"cell_type": "code",
|
|
|
|
|
"execution_count": 33,
|
|
|
|
|
"metadata": {
|
|
|
|
|
"scrolled": false
|
|
|
|
|
},
|
|
|
|
|
"outputs": [
|
|
|
|
|
{
|
|
|
|
|
"data": {
|
|
|
|
|
"image/png": "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 truncated
|
|
|
|
|
"text/plain": [
|
|
|
|
|
"<Figure size 720x720 with 1 Axes>"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
"metadata": {
|
|
|
|
|
"needs_background": "light"
|
|
|
|
|
},
|
|
|
|
|
"output_type": "display_data"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"data": {
|
|
|
|
|
"image/png": "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 truncated
|
|
|
|
|
"text/plain": [
|
|
|
|
|
"<Figure size 720x720 with 1 Axes>"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
"metadata": {
|
|
|
|
|
"needs_background": "light"
|
|
|
|
|
},
|
|
|
|
|
"output_type": "display_data"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"data": {
|
|
|
|
|
"application/vnd.jupyter.widget-view+json": {
|
|
|
|
|
"model_id": "37ed4fb9119744e0801ffac1c894695c",
|
|
|
|
|
"version_major": 2,
|
|
|
|
|
"version_minor": 0
|
|
|
|
|
},
|
|
|
|
|
"text/plain": [
|
|
|
|
|
"Renderer(camera=PerspectiveCamera(children=(DirectionalLight(color='white', intensity=0.6, position=(0.2930555…"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
"metadata": {},
|
|
|
|
|
"output_type": "display_data"
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"data": {
|
|
|
|
|
"image/png": "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 truncated
|
|
|
|
|
"text/plain": [
|
|
|
|
|
"<Figure size 720x720 with 1 Axes>"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
"metadata": {
|
|
|
|
|
"needs_background": "light"
|
|
|
|
|
},
|
|
|
|
|
"output_type": "display_data"
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"source": [
|
|
|
|
|
"handle_img(\"drawC\",4)"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"cell_type": "markdown",
|
|
|
|
|
"metadata": {},
|
|
|
|
|
"source": [
|
|
|
|
|
"## Notes & Remarks"
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"cell_type": "markdown",
|
|
|
|
|
"metadata": {},
|
|
|
|
|
"source": [
|
|
|
|
|
"This week results are impacted from the same issue as last week that still couldnt be resolved unfortunately... Hence, this weeks implementations passes the provided tests but the renders have similarly, excessivly large energy values."
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"cell_type": "code",
|
|
|
|
|
"execution_count": null,
|
|
|
|
|
"metadata": {},
|
|
|
|
|
"outputs": [],
|
|
|
|
|
"source": []
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"cell_type": "code",
|
|
|
|
|
"execution_count": null,
|
|
|
|
|
"metadata": {},
|
|
|
|
|
"outputs": [],
|
|
|
|
|
"source": []
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"metadata": {
|
|
|
|
|
"kernelspec": {
|
|
|
|
|
"display_name": "Python 3 (ipykernel)",
|
|
|
|
|
"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.9.7"
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
"nbformat": 4,
|
|
|
|
|
"nbformat_minor": 4
|
|
|
|
|
}
|