Disabled external gits
This commit is contained in:
5316 files changed
+4563444
-6
No files matched your search
+482
@@ -0,0 +1,482 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"id": "47a1752b-1db4-4004-9991-164388c0fd5d",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import numpy as np\n",
|
||||
"import meshplot as mp"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"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": 5,
|
||||
"id": "9c83b851-d0aa-4fb0-9030-a285ca6b2b64",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import sys\n",
|
||||
"sys.path.append('../src')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"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": 7,
|
||||
"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": [],
|
||||
"source": [
|
||||
"v1, f1, num_bdry_vx, num_intr_vx = parse_input_mesh(\"../data/two_rings_remesh.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": [
|
||||
{
|
||||
"ename": "TypeError",
|
||||
"evalue": "unsupported operand type(s) for /: 'NoneType' and 'NoneType'",
|
||||
"output_type": "error",
|
||||
"traceback": [
|
||||
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
|
||||
"\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)",
|
||||
"\u001b[0;32m/tmp/ipykernel_12039/3840203228.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mstart\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtime\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtime\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----> 2\u001b[0;31m \u001b[0mvs1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maverage_mean_curvature_list1\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcurr_mcf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrun_mean_curvature_flow\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mv1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mf1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m1000\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m5e-2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m1e-3\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 3\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Run {} iterations of unstable mean curvature flow\"\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mformat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0maverage_mean_curvature_list1\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[1;32m 4\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"took {} seconds\"\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mformat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtime\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtime\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mstart\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_3_2/notebook/../src/mean_curvature_flow.py\u001b[0m in \u001b[0;36mrun_mean_curvature_flow\u001b[0;34m(self, v, f, max_iter, epsilon1, epsilon2)\u001b[0m\n\u001b[1;32m 83\u001b[0m \u001b[0mYour\u001b[0m \u001b[0mcode\u001b[0m \u001b[0mhere\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 84\u001b[0m '''\n\u001b[0;32m---> 85\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msolve_laplace_equation\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;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 86\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mupdate_system\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;34m\u001b[0m\u001b[0m\n\u001b[1;32m 87\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
|
||||
"\u001b[0;32m/opt/notebooks/assignment_3_2/notebook/../src/mean_curvature_flow.py\u001b[0m in \u001b[0;36msolve_laplace_equation\u001b[0;34m(self, v, f)\u001b[0m\n\u001b[1;32m 44\u001b[0m '''\n\u001b[1;32m 45\u001b[0m \u001b[0;31m# Construct the LHS and RHS of the linear solve.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 46\u001b[0;31m \u001b[0mlhs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mL\u001b[0m\u001b[0;34m/\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mM\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnum_bdry_vx\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 47\u001b[0m \u001b[0mrhs\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[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnum_intr_vx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 48\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
|
||||
"\u001b[0;31mTypeError\u001b[0m: unsupported operand type(s) for /: 'NoneType' and 'NoneType'"
|
||||
]
|
||||
}
|
||||
],
|
||||
"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": null,
|
||||
"id": "652d1fa7-ad74-4c50-85c1-6a9e622b7ec8",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"plt.plot(average_mean_curvature_list1)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "14411752-e879-40f4-a3ce-928cfa2e888e",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"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": null,
|
||||
"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": null,
|
||||
"id": "dbc8d3df-ac70-4c75-a6e7-d624595d5a59",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"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": null,
|
||||
"id": "87c6c46b-36e4-4206-96da-b3f10d897387",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"plt.plot(average_mean_curvature_list2)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "db07878e-9438-413d-9eb5-a2ffb8f02118",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"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": null,
|
||||
"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": null,
|
||||
"id": "661c1cfb-3ac6-434a-b385-a94be86f2802",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"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": null,
|
||||
"id": "06d71f4a-214a-4fbc-84ee-aad174ac104f",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"plt.plot(average_mean_curvature_list3)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "4e3faeb6-3f38-43d1-a4a0-047b62e11bf3",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"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": 8,
|
||||
"id": "105532b3-69ab-4835-9768-5a03df5051af",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"blender_input_filename = \"../data/mesh.obj\""
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 9,
|
||||
"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": "c3305f3372914f049d1f00b95e75db4c",
|
||||
"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",
|
||||
"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": 10,
|
||||
"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 : - Level 0 partition with 3978 triangles split in 2 parts because poincare characteristic 2 is not 0\n",
|
||||
"Info : Model has 0 non manifold mesh edges and 3786 boundary mesh edges\n",
|
||||
"Info : Found 2 model surfaces\n",
|
||||
"Info : Found 3 model curves\n",
|
||||
"Info : Done classifying surfaces (Wall 0.0693158s, CPU 0.069573s)\n",
|
||||
"Info : Creating geometry of discrete curves...\n",
|
||||
"Info : Done creating geometry of discrete curves (Wall 0.000228139s, CPU 0.000371s)\n",
|
||||
"Info : Creating geometry of discrete surfaces...\n",
|
||||
"Info : [ 0%] Creating geometry \r",
|
||||
"Info : [ 50%] Creating geometry \r",
|
||||
"Info : Done creating geometry of discrete surfaces (Wall 0.0322831s, CPU 0.032606s)\n",
|
||||
"Info : Meshing 1D...\n",
|
||||
"Info : [ 0%] Meshing curve 5 (Discrete curve)\n",
|
||||
"Info : [ 20%] Meshing curve 6 (Discrete curve)\n",
|
||||
"Info : [ 40%] Meshing curve 7 (Discrete curve)\n",
|
||||
"Info : [ 50%] Meshing curve 8 (Discrete curve)\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Warning : Poor input mesh quality (min gamma = 0.000204069) for computing parametrization\n",
|
||||
"Warning : Poor input mesh quality (min gamma = 0.000204069) for computing parametrization\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Info : [ 70%] Meshing curve 9 (Discrete curve)\n",
|
||||
"Info : [ 90%] Meshing curve 10 (Discrete curve)\n",
|
||||
"Info : Done meshing 1D (Wall 0.100252s, CPU 0.100165s)\n",
|
||||
"Info : Meshing 2D...\n",
|
||||
"Info : [ 0%] Meshing surface 2 (Discrete surface, Frontal-Delaunay)\n",
|
||||
"Info : [ 0%] Meshing surface 2 (Discrete surface, MeshAdapt)\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Warning : 4752 elements remain invalid in surface 2\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Info : [ 50%] Meshing surface 3 (Discrete surface, Frontal-Delaunay)\n",
|
||||
"Info : Done meshing 2D (Wall 20.1908s, CPU 20.176s)\n",
|
||||
"Info : 12214 nodes 24512 elements\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Warning : ------------------------------\n",
|
||||
"Warning : Mesh generation error summary\n",
|
||||
"Warning : 1 warning\n",
|
||||
"Warning : 0 errors\n",
|
||||
"Warning : Check the full log for details\n",
|
||||
"Warning : ------------------------------\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"remesh_output_name = \"../data/remesh.obj\"\n",
|
||||
"remesh(blender_input_filename, remesh_output_name)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 11,
|
||||
"id": "245e2f45-c1ee-4f9f-86cd-e7fd9a0404de",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"application/vnd.jupyter.widget-view+json": {
|
||||
"model_id": "ddb1c83810f241d69cfb63f6c5fda32e",
|
||||
"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",
|
||||
"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": null,
|
||||
"id": "632ea182-feb9-46b0-b2b5-83b32e65f9b7",
|
||||
"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
|
||||
}
|
||||
@@ -0,0 +1,375 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"id": "bcb9c6df-0417-4d0a-9990-185ce07b918b",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import numpy as np\n",
|
||||
"import meshplot as mp"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"id": "45981306-4fde-431e-9240-3d153a016863",
|
||||
"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": "c39ddea4-e782-4c2b-a942-ec11610a4ceb",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import sys\n",
|
||||
"sys.path.append('../src')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"id": "f58fb451-bdcf-49d7-a928-4992ab599761",
|
||||
"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, plot_directions\n",
|
||||
"from mean_curvature_flow import MCF\n",
|
||||
"import smooth_surfaces"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"id": "bb26ed62-f404-437f-977a-8ff22a19f840",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"from fitting import compute_mesh_principal_curvatures"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "8b12d84d-06a1-4315-87b2-d8bb4a6b4360",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Closed Surface Example"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"id": "cf187b60-2fbf-4f0b-9924-efe4939bafae",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Warning: readOBJ() ignored non-comment line 3:\n",
|
||||
" o Mesh\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"v, f, num_bdry_vx, num_intr_vx = parse_input_mesh(\"../data/bob_tri.obj\")\n",
|
||||
"curr_mcf = MCF(num_bdry_vx, num_intr_vx)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 7,
|
||||
"id": "dcf12908-b20c-4a1c-adcf-492d23a54011",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"k1, k2, d1, d2 = compute_mesh_principal_curvatures(v, f)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "b3294e38-ccac-4fbc-8661-71403e472cc6",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Gaussian Curvature"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 8,
|
||||
"id": "cf601268-72af-4964-940d-211719f3123c",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"ename": "TypeError",
|
||||
"evalue": "unsupported operand type(s) for +: 'NoneType' and 'NoneType'",
|
||||
"output_type": "error",
|
||||
"traceback": [
|
||||
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
|
||||
"\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)",
|
||||
"\u001b[0;32m/tmp/ipykernel_12120/1640637150.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mgaussian_curvature\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mk1\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0mk2\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mgaussian_curvature\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0mnum_bdry_vx\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[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mgp\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mplot\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[0mget_diverging_colors\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgaussian_curvature\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;31mTypeError\u001b[0m: unsupported operand type(s) for +: 'NoneType' and 'NoneType'"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"gaussian_curvature = k1+k2\n",
|
||||
"gaussian_curvature[:num_bdry_vx] *= 0\n",
|
||||
"gp = mp.plot(v, f, get_diverging_colors(gaussian_curvature))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "4a3a46af-15b0-4b8c-afd4-14159774a646",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Mean Curvature"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "003d4541-fff5-414d-bacf-36a8a45fb412",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"mean_curvature = (k1+k2)/2\n",
|
||||
"mean_curvature[:num_bdry_vx] *= 0\n",
|
||||
"gp = mp.plot(v, f, get_diverging_colors(mean_curvature))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "3e30eb7f-4c81-461a-a9db-c1df00eb30ec",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Principal Curvature Direction"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "433424ef-f93c-485f-9929-17b84fd96026",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"plot_directions(v, f, d1, d2, scale=0.08)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "5a8c19a9-a4ff-4fcf-99f8-017c4cc97b7b",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Asymptotic Direction"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "08194caa-c825-4445-afcb-c11ae7c87b10",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"a1, a2 = smooth_surfaces.compute_asymptotic_directions(k1, k2, d1, d2)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "d2b75928-f37e-4342-bebc-bcf00fcd9fbb",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"plot_directions(v, f, a1, a2, scale=0.08)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "c6675cc3-281d-4de0-96e9-b679c19bea56",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Minimal Surface Example"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "10519def-3402-401f-ad08-8c2e120d11e2",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"epsilon1 = 5e-2\n",
|
||||
"epsilon2 = 1e-3"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "9d97b409-968f-4398-a28e-749ae1af28d3",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"v2, f2, num_bdry_vx, num_intr_vx = parse_input_mesh(\"../data/two_rings_remesh.obj\")\n",
|
||||
"curr_mcf = MCF(num_bdry_vx, num_intr_vx)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "887806bf-1c10-44b7-b0f8-acd398187678",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"start = time.time()\n",
|
||||
"vs, average_mean_curvature_list1 = 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_list1)))\n",
|
||||
"print(\"took {} seconds\".format(time.time() - start))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "d0cd92a5-8848-4a7e-9b93-34b4b9d0967b",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"k1, k2, d1, d2 = compute_mesh_principal_curvatures(vs[-1], f2)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "6c3bb956-62d0-43f7-a0a0-30571933c97a",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Gaussian Curvature"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "785540b8-03ed-4620-9a8f-ad7f9ec4d154",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"gaussian_curvature = k1+k2\n",
|
||||
"gaussian_curvature[:num_bdry_vx] *= 0\n",
|
||||
"gp = mp.plot(vs[-1], f2, get_diverging_colors(gaussian_curvature, percentile=80))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "a84dcd14-6dd4-44fe-93e8-440d78127643",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Mean Curvature"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "b3333375-fc84-4e10-85e0-5b744a3e585a",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"mean_curvature = (k1+k2)/2\n",
|
||||
"mean_curvature[:num_bdry_vx] *= 0\n",
|
||||
"gp = mp.plot(vs[-1], f2, get_diverging_colors(mean_curvature))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "4345e08f-cd16-4644-915d-270d5788bf88",
|
||||
"metadata": {
|
||||
"tags": []
|
||||
},
|
||||
"source": [
|
||||
"### Principal Curvature Direction"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "d7b85256-915e-489f-ad7b-f9d2faa9036f",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"plot_directions(vs[-1], f2, d1, d2, scale=0.08)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "8f7831fe-b870-4ee5-b1e8-6a1081bd17f7",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Asymptotic Direction"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "9674731a-d083-46cf-8ddd-f135538e8217",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"a1, a2 = smooth_surfaces.compute_asymptotic_directions(k1, k2, d1, d2)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "634c2079-e22a-4458-a126-851a87562015",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"plot_directions(v2, f2, a1, a2, scale=0.08)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "8fd20a1f-fa62-4762-9697-864874c55a7a",
|
||||
"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
|
||||
}
|
||||
@@ -0,0 +1,749 @@
|
||||
{
|
||||
"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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 truncated
|
||||
"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": "iVBORw0KGgoAAAANSUhEUgAAAYAAAAD6CAYAAACoCZCsAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8/fFQqAAAACXBIWXMAAAsTAAALEwEAmpwYAAAnM0lEQVR4nO3dd3RUZf7H8fc3DQgdCYgU6b0T6SS6EJol4loAV1gbIiIlW9TtbnXdNRRFELBhARFREGlBdxM6hN4h9N6lKqE8vz8y7C/GKBNIMpmZz+ucOZN773Mz3+fAmc/cZ2a+MeccIiISfEJ8XYCIiPiGAkBEJEgpAEREgpQCQEQkSCkARESClAJARCRIeRUAZtbVzLaYWZqZPZ/NcTOzkZ7ja82seaZjg81svZltMLMhmfaXMbMkM9vmuS+dKzMSERGv2LW+B2BmocBWIA7YBywHejnnNmYa0x14FugOtAJGOOdamVlDYBLQEkgHZgNPO+e2mdnLwAnn3EueUCntnHvux2opW7asq1q16vXNVEQkSK1YseKYcy4q6/4wL85tCaQ553YAmNkkIB7YmGlMPDDBZaTJEjMrZWYVgHrAEufcec+5yUAP4GXPObd7zn8X+C/wowFQtWpVUlNTvShZRESuMrPd2e33ZgmoIrA30/Y+zz5vxqwHYszsJjOLJOMKobJnTHnn3EEAz305L2oREZFc4s0VgGWzL+u6UbZjnHObzOyfQBJwFlgDXMpJgWbWD+gHUKVKlZycKiIiP8KbK4B9/P+rdoBKwAFvxzjn3nTONXfOxQAngG2eMYc9y0R47o9k9+DOubHOuWjnXHRU1PeWsERE5Dp5EwDLgVpmVs3MIoCewPQsY6YDfTyfBmoNnLq6vGNm5Tz3VYD7gImZzunr+bkvMO2GZiIiIjlyzSUg59wlMxsIzAFCgbeccxvMrL/n+BhgJhnr+2nAeeDRTL/iEzO7CbgIPOOcO+nZ/xIw2cweB/YAD+TSnERExAvX/BhoQRIdHe30KSARkZwxsxXOueis+/VNYBGRIBUUAbBkx3HeXLCTy1f852pHRCSvBUUAfLH2IH+ZsZH7xyxi2+Ezvi5HRKRACIoA+HN8A4Y/1JRdx85x58gFjPxyG+mXrvi6LBERnwqKADAz7m1WkaSEWLo0vJnEpK3c89oC1u772teliYj4TFAEwFVlixXi1V7NGNcnmpPn07l31EL+MXMT36Rf9nVpIiL5LqgC4Kq4+uWZOzSWh26rzBspO+g2IoUlO477uiwRkXwVlAEAULJIOP+4rzEfPtGKKw56jl3Cbz9dx5lvL/q6NBGRfBG0AXBV25plmT2kA0+0r8bEZXvoPCyFrzYf9nVZIiJ5LugDACAyIozf3VWfT55uS/HCYTz2TipDJq3ixLl0X5cmIpJnFACZNKtSmhnPdmBwx1p8se4gnRKTmb7mAP7ULkNExFsKgCwiwkIYGlebz59tT+XSRRg0cRVPTkjl0KlvfV2aiEiuUgD8gLo3l2DqgHb8tns9FqQdIy4xmYnL9uhqQEQChgLgR4SGGE/GVGf24BgaVCzBC1PX0XvcUnYfP+fr0kREbpgCwAtVyxblwyda84/7GrF+/ym6DE9h/Pwdai4nIn5NAeClkBCjV8sqJCXE0r5mWf76xSbuG72ILYfUXE5E/JMCIIduLlmYcX2iGdmrGXtPnOeuV+czLGmrmsuJiN9RAFwHM+OeJrcwLyGW7o0qMOLLbdz16nxW7/3a16WJiHhNAXADyhSNYETPZrzZN5rT31zivtcX8tcZG9VcTkT8ggIgF3SsV565CTH0bFmF8Qt20mV4Cou2H/N1WSIiP0oBkEtKFA7n7z0aMfHJ1oQY9B63lBemruW0msuJSAGlAMhlbWrcxKzBMTwVU52Plu8lLjGZpI1qLiciBY8CIA8UiQjlhe71+OyZdpSOjODJCakM/HAlx85e8HVpIiL/owDIQ40rlWL6wPYkxNVmzoZDxCUm89mq/WonISIFggIgj0WEhTCoYy2+GNSBW28qypCPVvP4u6kc+PobX5cmIkFOAZBPapcvzidPt+X3d9Vn8fbjdB6WwvtLdnNF7SRExEcUAPkoNMR4vH015gyJoUnlkvzus/X0GreEncfUXE5E8p8CwAeq3BTJ+4+34uWfNmbjwdN0HZ7CG8nbuXRZ7SREJP8oAHzEzHjwtsrMS4glpnYU/5i1mR6vL2LjgdO+Lk1EgoQCwMfKlyjM2EdaMKp3cw6e+oZ7XlvAK3O3cOGS2kmISN7yKgDMrKuZbTGzNDN7PpvjZmYjPcfXmlnzTMeGmtkGM1tvZhPNrLBn/5/MbL+ZrfbcuufetPyLmXFn4wokDY3lnia38OpXadw5cgErdp/0dWkiEsCuGQBmFgqMAroB9YFeZlY/y7BuQC3PrR8w2nNuRWAQEO2cawiEAj0znTfMOdfUc5t5o5Pxd6WLRpD4UFPefvQ2zl+4xP1jFvHi5xs4n37J16WJSADy5gqgJZDmnNvhnEsHJgHxWcbEAxNchiVAKTOr4DkWBhQxszAgEjiQS7UHrDvqlGNuQiyPtL6VtxfuovOwFBZsU3M5Ecld3gRARWBvpu19nn3XHOOc2w/8G9gDHAROOefmZho30LNk9JaZlc5x9QGsWKEw/hzfkMlPtSE8NISfvbmUX09Zw6nzai4nIrnDmwCwbPZl/fZStmM8T+rxQDXgFqComf3Mc3w0UANoSkY4vJLtg5v1M7NUM0s9evSoF+UGlpbVyjBrcAeevr0Gn6zcT6dhycxef8jXZYlIAPAmAPYBlTNtV+L7yzg/NKYTsNM5d9Q5dxGYCrQFcM4dds5dds5dAcaRsdT0Pc65sc65aOdcdFRUlDdzCjiFw0N5rmtdPhvQjrLFCtH//RU888FKjp5RczkRuX7eBMByoJaZVTOzCDLexJ2eZcx0oI/n00CtyVjqOUjG0k9rM4s0MwM6ApsAMr1HANADWH+Dcwl4jSqVZPrAdvyqSx2SNh6mU2Iyn6zYp+ZyInJdrhkAzrlLwEBgDhlP3pOdcxvMrL+Z9fcMmwnsANLIeDU/wHPuUmAKsBJY53m8sZ5zXjazdWa2FrgDGJprswpg4aEhPHNHTWYO7kDNcsX4xcdr+Pnby9mv5nIikkPmT68eo6OjXWpqqq/LKDCuXHFMWLyLl+dswYDnutXlZ61uJSQku7dkRCRYmdkK51x01v36JrAfCwkxft4uo7lc81tL84dpG3ho7GK2Hz3r69JExA8oAAJA5TKRTHisJf+6vzFbDp2h24j5vP7fNC6quZyI/AgFQIAwMx6Irsy8X8TykzrleHn2Fu4dtZD1+0/5ujQRKaAUAAGmXPHCjHmkBaMfbs7h0xeIH7WQf83ZzLcX1VxORL5LARCgujWqwLyEGHo0q8io/2yn+8j5pO464euyRKQAUQAEsFKREfz7gSZMeKwlFy5e4YE3FvOn6Rs4d0HN5UREARAUYmpHMXdoDH3bVOXdxRnN5ZK3Bl9bDRH5LgVAkChaKIw/3dOAj59qQ6HwEPq+tYxfTF7D1+fTfV2aiPiIAiDIRFctw8xBHRh4R00+W72fTokpzFp30NdliYgPKACCUOHwUH7ZpQ7TB7ajfIlCPP3BSvq/t4Ijp7/1dWkiko8UAEGswS0lmfZMO57rWpevthyhU2IyH6fuVXM5kSChAAhyYaEhPH17DWYN7kCdm4vzqylr6fPWMvaeOO/r0kQkjykABIAaUcX4qF8b/hLfgJW7T9JleApvL9zJ5Su6GhAJVAoA+Z+QEOORNlWZMzSG26qW4cXPN/LgG4tJO3LG16WJSB5QAMj3VCodyTuP3kbig03YfvQs3Ucs4LWvtqm5nEiAUQBItsyM+5pXImloLHENyvPvuVu55zU1lxMJJAoA+VFRxQsxqndz3nikBcfOZjSXe2mWmsuJBAIFgHilS4ObmTc0lvubV2JM8na6j5jPsp1qLifizxQA4rWSkeH88/7GvP94K9IvX+HBNxbz+8/Wc+bbi74uTUSugwJAcqx9rbLMHRrDY+2q8f7S3XQZlsJ/thzxdVkikkMKALkukRFh/OHu+kzp35aihcJ49O3lJHy0mpPn1FxOxF8oAOSGtLi1NDMGtWfQT2oyfc0BOiUmM2PtAbWTEPEDCgC5YYXCQknoXIfPn23PLaWKMPDDVfR7bwWH1VxOpEBTAEiuqVehBJ8OaMsL3eqSsvUonRKT+Wj5Hl0NiBRQCgDJVWGhITwVW4PZQ2KoV6EEz32yjofHL2XPcTWXEyloFACSJ6qVLcqkJ1vztx4NWbvvFF2Gp/DmAjWXEylIFACSZ0JCjIdb3UpSQgxtatzEX2Zs5KejF7H1sJrLiRQECgDJcxVKFuHNvtGM6NmU3cfPcefI+Yz8chvpl9RcTsSXFACSL8yM+KYVmZcQS9eGFUhM2so9ry1gzd6vfV2aSNBSAEi+uqlYIV7t1YxxfaI5eT6dHq8v5O8zN/FNuprLieQ3rwLAzLqa2RYzSzOz57M5bmY20nN8rZk1z3RsqJltMLP1ZjbRzAp79pcxsyQz2+a5L51705KCLq5+eZISYnnotsqMTdlBtxEpLN5+3NdliQSVawaAmYUCo4BuQH2gl5nVzzKsG1DLc+sHjPacWxEYBEQ75xoCoUBPzznPA18652oBX3q2JYiUKBzOP+5rzIdPtOKKg17jlvCbT9dxWs3lRPKFN1cALYE059wO51w6MAmIzzImHpjgMiwBSplZBc+xMKCImYUBkcCBTOe86/n5XeDe65+G+LO2NcsyZ0gMT3aoxqRle+icmMJXmw/7uiyRgOdNAFQE9mba3ufZd80xzrn9wL+BPcBB4JRzbq5nTHnn3EEAz325nJcvgaJIRCi/vbM+Uwe0o2SRcB57J5XBk1Zx/OwFX5cmErC8CQDLZl/Wb/NkO8azrh8PVANuAYqa2c9yUqCZ9TOzVDNLPXr0aE5OFT/UtHIpPn+2PUMLine truncated
|
||||
"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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 truncated
|
||||
"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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 truncated
|
||||
"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
|
||||
}
|
||||
Reference in new issue
Block a user