750 lines
61 KiB
Plaintext
750 lines
61 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 1,
|
|
"id": "47a1752b-1db4-4004-9991-164388c0fd5d",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"import numpy as np\n",
|
|
"import meshplot as mp"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 2,
|
|
"id": "0f4900fe-ce65-410a-b8d3-088e7e0804a5",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"import igl\n",
|
|
"import scipy as sp\n",
|
|
"import numpy as np\n",
|
|
"from meshplot import plot, subplot, interact\n",
|
|
"import time\n",
|
|
"import copy\n",
|
|
"import matplotlib.pyplot as plt"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 3,
|
|
"id": "9c83b851-d0aa-4fb0-9030-a285ca6b2b64",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"import sys\n",
|
|
"sys.path.append('../src')"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 4,
|
|
"id": "43cb9cef-4959-4c9b-98ef-3a603f57bcb2",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"import importlib, utils, laplacian_utils, mean_curvature_flow, remesher_helper\n",
|
|
"importlib.reload(utils)\n",
|
|
"importlib.reload(laplacian_utils)\n",
|
|
"importlib.reload(mean_curvature_flow)\n",
|
|
"importlib.reload(remesher_helper)\n",
|
|
"from utils import parse_input_mesh, normalize_area, get_diverging_colors, remesh\n",
|
|
"from mean_curvature_flow import MCF"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 5,
|
|
"id": "2570faf5-9582-42ac-ace4-ca82c781a806",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"epsilon1 = 5e-2\n",
|
|
"epsilon2 = 1e-3\n",
|
|
"mesh_color = np.array([0,0.7,1])"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "e8d2f669-864f-4c8e-8519-5672862cc024",
|
|
"metadata": {},
|
|
"source": [
|
|
"### Example 1"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 6,
|
|
"id": "7a65d5c7-d774-4d5a-946c-69d730f19519",
|
|
"metadata": {
|
|
"tags": []
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Warning: readOBJ() ignored non-comment line 3:\n",
|
|
" o BezierCircle.002_Mesh.002\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"v1, f1, num_bdry_vx, num_intr_vx = parse_input_mesh(\"../data/mesh.obj\")\n",
|
|
"curr_mcf = MCF(num_bdry_vx, num_intr_vx)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 7,
|
|
"id": "a82f1487-56e3-4ecb-b71c-b3f59d4070be",
|
|
"metadata": {
|
|
"tags": []
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"/opt/notebooks/assignment_3_2/notebook/../src/laplacian_utils.py:83: RuntimeWarning: divide by zero encountered in true_divide\n",
|
|
" cotan = np.sum(a*b,axis=1) / np.sqrt(np.sum(np.cross(a, b)**2, axis=-1))\n",
|
|
"/opt/notebooks/assignment_3_2/notebook/../src/mean_curvature_flow.py:35: RuntimeWarning: divide by zero encountered in true_divide\n",
|
|
" Minv = sp.sparse.diags(1/self.M.diagonal())\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"0 True False\n",
|
|
"Run 1001 iterations of unstable mean curvature flow\n",
|
|
"took 4.51453971862793 seconds\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"start = time.time()\n",
|
|
"vs1, average_mean_curvature_list1 = curr_mcf.run_mean_curvature_flow(v1, f1, 1000, 5e-2, 1e-3)\n",
|
|
"print(\"Run {} iterations of unstable mean curvature flow\".format(len(average_mean_curvature_list1)))\n",
|
|
"print(\"took {} seconds\".format(time.time() - start))"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 8,
|
|
"id": "652d1fa7-ad74-4c50-85c1-6a9e622b7ec8",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"[<matplotlib.lines.Line2D at 0x7fde6cf98820>]"
|
|
]
|
|
},
|
|
"execution_count": 8,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
},
|
|
{
|
|
"data": {
|
|
"image/png": "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\n",
|
|
"text/plain": [
|
|
"<Figure size 432x288 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {
|
|
"needs_background": "light"
|
|
},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"plt.plot(average_mean_curvature_list1)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 9,
|
|
"id": "14411752-e879-40f4-a3ce-928cfa2e888e",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"application/vnd.jupyter.widget-view+json": {
|
|
"model_id": "c0cdcc78349b4af19da435cb31d9a177",
|
|
"version_major": 2,
|
|
"version_minor": 0
|
|
},
|
|
"text/plain": [
|
|
"Renderer(camera=PerspectiveCamera(aspect=1.5, children=(DirectionalLight(color='white', intensity=0.6, positio…"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
},
|
|
{
|
|
"data": {
|
|
"application/vnd.jupyter.widget-view+json": {
|
|
"model_id": "c064b33d7a5140f48dd8ebc45c4a1898",
|
|
"version_major": 2,
|
|
"version_minor": 0
|
|
},
|
|
"text/plain": [
|
|
"interactive(children=(IntSlider(value=0, description='level', max=1000), Output()), _dom_classes=('widget-inte…"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"p1 = mp.plot(vs1[0], f1, shading={\"wireframe\": False,\"width\": 900, \"height\": 600}, return_plot=True, c=mesh_color)\n",
|
|
"\n",
|
|
"@interact(level=(0, len(vs1)-1))\n",
|
|
"def mcf(level=0):\n",
|
|
" p1.update_object(vertices=vs1[level])"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "baf4bc95-68df-4a4b-967f-a2b555d4947c",
|
|
"metadata": {},
|
|
"source": [
|
|
"### Example 2"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 10,
|
|
"id": "147b044e-4491-4e45-bf91-df58f870429f",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"v2, f2, num_bdry_vx, num_intr_vx = parse_input_mesh(\"../data/half_cube_remesh.obj\")\n",
|
|
"curr_mcf = MCF(num_bdry_vx, num_intr_vx)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 11,
|
|
"id": "dbc8d3df-ac70-4c75-a6e7-d624595d5a59",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"0 False False\n",
|
|
"Insufficient improvement from the previous iteration!\n",
|
|
"Run 2 iterations of unstable mean curvature flow\n",
|
|
"took 0.16465258598327637 seconds\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"start = time.time()\n",
|
|
"vs2, average_mean_curvature_list2 = curr_mcf.run_mean_curvature_flow(v2, f2, 1000, epsilon1, epsilon2)\n",
|
|
"print(\"Run {} iterations of unstable mean curvature flow\".format(len(average_mean_curvature_list2)))\n",
|
|
"print(\"took {} seconds\".format(time.time() - start))"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 12,
|
|
"id": "87c6c46b-36e4-4206-96da-b3f10d897387",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"[<matplotlib.lines.Line2D at 0x7fde649cd100>]"
|
|
]
|
|
},
|
|
"execution_count": 12,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
},
|
|
{
|
|
"data": {
|
|
"image/png": "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\n",
|
|
"text/plain": [
|
|
"<Figure size 432x288 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {
|
|
"needs_background": "light"
|
|
},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"plt.plot(average_mean_curvature_list2)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 13,
|
|
"id": "db07878e-9438-413d-9eb5-a2ffb8f02118",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"application/vnd.jupyter.widget-view+json": {
|
|
"model_id": "7151634c238b430d8c5ef8e8302a82bc",
|
|
"version_major": 2,
|
|
"version_minor": 0
|
|
},
|
|
"text/plain": [
|
|
"Renderer(camera=PerspectiveCamera(children=(DirectionalLight(color='white', intensity=0.6, position=(0.0, -0.0…"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
},
|
|
{
|
|
"data": {
|
|
"application/vnd.jupyter.widget-view+json": {
|
|
"model_id": "3cd498374b2e4f5f8889891bfed74ffa",
|
|
"version_major": 2,
|
|
"version_minor": 0
|
|
},
|
|
"text/plain": [
|
|
"interactive(children=(IntSlider(value=0, description='level', max=0), Output()), _dom_classes=('widget-interac…"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"p2 = mp.plot(vs2[0], f2, shading={\"wireframe\": False, \"flat\": True}, c=mesh_color)\n",
|
|
"\n",
|
|
"@interact(level=(0, len(vs2)-2))\n",
|
|
"def mcf(level=0):\n",
|
|
" p2.update_object(vertices=vs2[level])"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "613b0257-40c3-4f8f-8840-ea9dccccefa9",
|
|
"metadata": {},
|
|
"source": [
|
|
"### Example 3"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 20,
|
|
"id": "ddd60020-bc75-4984-937f-ab30359b559c",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"v3, f3, num_bdry_vx, num_intr_vx = parse_input_mesh(\"../data/cube_remesh.obj\")\n",
|
|
"curr_mcf = MCF(num_bdry_vx, num_intr_vx)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 21,
|
|
"id": "661c1cfb-3ac6-434a-b385-a94be86f2802",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"0 False False\n",
|
|
"Insufficient improvement from the previous iteration!\n",
|
|
"Run 3 iterations of unstable mean curvature flow\n",
|
|
"took 0.43959999084472656 seconds\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"start = time.time()\n",
|
|
"vs3, average_mean_curvature_list3 = curr_mcf.run_mean_curvature_flow(v3, f3, 1000, epsilon1, epsilon2)\n",
|
|
"print(\"Run {} iterations of unstable mean curvature flow\".format(len(average_mean_curvature_list3)))\n",
|
|
"print(\"took {} seconds\".format(time.time() - start))"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 22,
|
|
"id": "06d71f4a-214a-4fbc-84ee-aad174ac104f",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"[<matplotlib.lines.Line2D at 0x7ff33eae6910>]"
|
|
]
|
|
},
|
|
"execution_count": 22,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
},
|
|
{
|
|
"data": {
|
|
"image/png": "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\n",
|
|
"text/plain": [
|
|
"<Figure size 432x288 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {
|
|
"needs_background": "light"
|
|
},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"plt.plot(average_mean_curvature_list3)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 23,
|
|
"id": "4e3faeb6-3f38-43d1-a4a0-047b62e11bf3",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"application/vnd.jupyter.widget-view+json": {
|
|
"model_id": "784a5819fbab4817aa5a7c1f69d24287",
|
|
"version_major": 2,
|
|
"version_minor": 0
|
|
},
|
|
"text/plain": [
|
|
"Renderer(camera=PerspectiveCamera(children=(DirectionalLight(color='white', intensity=0.6, position=(0.0, 0.0,…"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
},
|
|
{
|
|
"data": {
|
|
"application/vnd.jupyter.widget-view+json": {
|
|
"model_id": "006a6c74d2cf4e1e9d435ab4425e62ea",
|
|
"version_major": 2,
|
|
"version_minor": 0
|
|
},
|
|
"text/plain": [
|
|
"interactive(children=(IntSlider(value=0, description='level', max=1), Output()), _dom_classes=('widget-interac…"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"p3 = mp.plot(vs3[0], f3, shading={\"wireframe\": False, \"flat\": True}, c=mesh_color)\n",
|
|
"\n",
|
|
"@interact(level=(0, len(vs3)-2))\n",
|
|
"def mcf(level=0):\n",
|
|
" p3.update_object(vertices=vs3[level])"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "d92f7eea-e7f0-4a92-b557-21637eb7f939",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Your Own Minimal Surface!"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "242feed4-775d-4c68-aadb-707382dde2f5",
|
|
"metadata": {},
|
|
"source": [
|
|
"### Visualize your blender output\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 12,
|
|
"id": "105532b3-69ab-4835-9768-5a03df5051af",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"blender_input_filename = \"../data/mesh.obj\"\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 14,
|
|
"id": "c9e2c901-d3f9-4a2f-bb3b-27a8be7b2311",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Warning: readOBJ() ignored non-comment line 3:\n",
|
|
" o BezierCircle.002_Mesh.002\n"
|
|
]
|
|
},
|
|
{
|
|
"data": {
|
|
"application/vnd.jupyter.widget-view+json": {
|
|
"model_id": "41947aa5491d4b5e9dc8aa2664d32471",
|
|
"version_major": 2,
|
|
"version_minor": 0
|
|
},
|
|
"text/plain": [
|
|
"Renderer(camera=PerspectiveCamera(aspect=1.5, children=(DirectionalLight(color='white', intensity=0.6, positio…"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"v,f = igl.read_triangle_mesh(blender_input_filename)\n",
|
|
"\n",
|
|
"p1 = plot(v, f, shading={\"wireframe\": True,\"width\": 900, \"height\": 600}, return_plot=True, c=mesh_color)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "264e0ee7-8a7d-44b0-8221-fc15b38ce77e",
|
|
"metadata": {},
|
|
"source": [
|
|
"### Remesh"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "b6905f01-bc8b-4421-b2fb-5fa2b0b79a90",
|
|
"metadata": {},
|
|
"source": [
|
|
"The input should be a triangle mesh or a quad mesh. This might takes a while depends on your design. You can adjust the `mesh_size` parameter in the `remesh` function."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 15,
|
|
"id": "4ba2345b-dac3-45e6-a28e-123929f70b93",
|
|
"metadata": {
|
|
"scrolled": true,
|
|
"tags": []
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Info : Classifying surfaces (angle: 180)...\n",
|
|
"Info : Splitting triangulations to make them parametrizable:\n",
|
|
"Info : Model has 0 non manifold mesh edges and 3784 boundary mesh edges\n",
|
|
"Info : Found 1 model surfaces\n",
|
|
"Info : Found 1 model curves\n",
|
|
"Info : Done classifying surfaces (Wall 0.0727004s, CPU 0.072207s)\n",
|
|
"Info : Creating geometry of discrete curves...\n",
|
|
"Info : Done creating geometry of discrete curves (Wall 0.000467486s, CPU 0.000622s)\n",
|
|
"Info : Creating geometry of discrete surfaces...\n",
|
|
"Info : [ 0%] Creating geometry \r",
|
|
"Info : Done creating geometry of discrete surfaces (Wall 0.0390655s, CPU 0.038785s)\n",
|
|
"Info : Meshing 1D...\n",
|
|
"Info : Meshing curve 3 (Discrete curve)\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Warning : Poor input mesh quality (min gamma = 0.000204069) for computing parametrization\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Info : Done meshing 1D (Wall 0.314341s, CPU 0.311509s)\n",
|
|
"Info : Meshing 2D...\n",
|
|
"Info : Meshing surface 2 (Discrete surface, Frontal-Delaunay)\n",
|
|
"Info : Meshing surface 2 (Discrete surface, MeshAdapt)\n",
|
|
"Info : Done meshing 2D (Wall 40.6868s, CPU 40.2294s)\n",
|
|
"Info : 12169 nodes 24337 elements\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"blender_input_filename = \"../data/mesh.obj\"\n",
|
|
"remesh_output_name = \"../data/remesh.obj\"\n",
|
|
"remesh(blender_input_filename, remesh_output_name)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 16,
|
|
"id": "245e2f45-c1ee-4f9f-86cd-e7fd9a0404de",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"application/vnd.jupyter.widget-view+json": {
|
|
"model_id": "94aa5a02f7f84de09ccca26a5f783181",
|
|
"version_major": 2,
|
|
"version_minor": 0
|
|
},
|
|
"text/plain": [
|
|
"Renderer(camera=PerspectiveCamera(aspect=1.5, children=(DirectionalLight(color='white', intensity=0.6, positio…"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"# v,f = igl.read_triangle_mesh(remesh_output_name)\n",
|
|
"v, f, num_bdry_vx, num_intr_vx = parse_input_mesh(remesh_output_name)\n",
|
|
"curr_mcf = MCF(num_bdry_vx, num_intr_vx)\n",
|
|
"\n",
|
|
"p2 = plot(v, f, shading={\"wireframe\": True,\"width\": 900, \"height\": 600}, return_plot=True, c=mesh_color)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "117e73d7-f291-4aa1-b783-cf8e2ae70a21",
|
|
"metadata": {},
|
|
"source": [
|
|
"### Run optimization"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 17,
|
|
"id": "632ea182-feb9-46b0-b2b5-83b32e65f9b7",
|
|
"metadata": {
|
|
"scrolled": false
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"0 False False\n",
|
|
"Insufficient improvement from the previous iteration!\n",
|
|
"Run 3 iterations of unstable mean curvature flow\n",
|
|
"took 0.14172720909118652 seconds\n",
|
|
"607 11562\n"
|
|
]
|
|
},
|
|
{
|
|
"data": {
|
|
"application/vnd.jupyter.widget-view+json": {
|
|
"model_id": "38a95bd1258a4e3d8c9693b2458cb87b",
|
|
"version_major": 2,
|
|
"version_minor": 0
|
|
},
|
|
"text/plain": [
|
|
"Renderer(camera=PerspectiveCamera(aspect=1.5, children=(DirectionalLight(color='white', intensity=0.6, positio…"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
},
|
|
{
|
|
"data": {
|
|
"image/png": "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\n",
|
|
"text/plain": [
|
|
"<Figure size 432x288 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {
|
|
"needs_background": "light"
|
|
},
|
|
"output_type": "display_data"
|
|
},
|
|
{
|
|
"data": {
|
|
"application/vnd.jupyter.widget-view+json": {
|
|
"model_id": "8ad4b5e8dcab47cf9a267b363204b3f8",
|
|
"version_major": 2,
|
|
"version_minor": 0
|
|
},
|
|
"text/plain": [
|
|
"interactive(children=(IntSlider(value=0, description='level', max=2), Output()), _dom_classes=('widget-interac…"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"start = time.time()\n",
|
|
"vs, average_mean_curvature_list = curr_mcf.run_mean_curvature_flow(v, f, 1000, 5e-2, 1e-3)\n",
|
|
"print(\"Run {} iterations of unstable mean curvature flow\".format(len(average_mean_curvature_list)))\n",
|
|
"print(\"took {} seconds\".format(time.time() - start))\n",
|
|
"print(num_bdry_vx, num_intr_vx)\n",
|
|
"plt.plot(average_mean_curvature_list)\n",
|
|
"p = mp.plot(vs[0], f, shading={\"wireframe\": False,\"width\": 900, \"height\": 600}, return_plot=True, c=mesh_color)\n",
|
|
"\n",
|
|
"@interact(level=(0, len(vs)-1))\n",
|
|
"def mcf(level=0):\n",
|
|
" p.update_object(vertices=vs[level])"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 18,
|
|
"id": "b5f784cc",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"True"
|
|
]
|
|
},
|
|
"execution_count": 18,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"igl.write_obj(\"../data/final.obj\", vs[-1], f.astype('int64'))"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "36712dd0",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": []
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "81477473",
|
|
"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": 5
|
|
}
|