.. DO NOT EDIT. .. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. .. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: .. "_auto_examples/leaf_growth/plot_leaf_basipetal_unstructured.py" .. LINE NUMBERS ARE GIVEN BELOW. .. only:: html .. note:: :class: sphx-glr-download-link-note Click :ref:`here ` to download the full example code .. rst-class:: sphx-glr-example-title .. _sphx_glr__auto_examples_leaf_growth_plot_leaf_basipetal_unstructured.py: Unstructured Basipetal Leaf Growth Model ======================================== .. GENERATED FROM PYTHON SOURCE LINES 8-10 Import relevant Python modules. .. GENERATED FROM PYTHON SOURCE LINES 10-26 .. code-block:: default import sys sys.path.append("../../") import math import copy import pickle import torch import matplotlib.pyplot as plt import imodal imodal.Utilities.set_compute_backend('torch') torch.set_default_dtype(torch.float32) .. GENERATED FROM PYTHON SOURCE LINES 27-29 We load the data .. GENERATED FROM PYTHON SOURCE LINES 29-43 .. code-block:: default with open("../../data/basipetal.pickle", 'rb') as f: data = pickle.load(f) shape_source = torch.tensor(data['shape_source']).type(torch.get_default_dtype()) shape_target = torch.tensor(data['shape_target']).type(torch.get_default_dtype()) dots_source = torch.tensor(data['dots_source'], dtype=torch.get_default_dtype()) dots_target = torch.tensor(data['dots_target'], dtype=torch.get_default_dtype()) aabb_source = imodal.Utilities.AABB.build_from_points(shape_source) aabb_target = imodal.Utilities.AABB.build_from_points(shape_target) .. GENERATED FROM PYTHON SOURCE LINES 44-52 Unstructured growth using the curve information ----------------------------------------------- Intitialization ^^^^^^^^^^^^^^^ Plot source and target. .. GENERATED FROM PYTHON SOURCE LINES 52-61 .. code-block:: default plt.title("Source and target") plt.plot(shape_source[:, 0].numpy(), shape_source[:, 1].numpy(), color='black') plt.plot(shape_target[:, 0].numpy(), shape_target[:, 1].numpy(), color='red') plt.axis('equal') plt.show() .. image:: /_auto_examples/leaf_growth/images/sphx_glr_plot_leaf_basipetal_unstructured_001.png :alt: Source and target :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 62-64 We now sample the points that will be used by the local translations module for unstructured growth. .. GENERATED FROM PYTHON SOURCE LINES 64-74 .. code-block:: default # Build AABB (Axis Aligned Bounding Box) around the source shape and uniformly # sample points for the growth module. points_density = 0.05 points_translations = imodal.Utilities.fill_area_uniform_density(imodal.Utilities.area_shape, aabb_source.scale(1.3), points_density, shape=1.3*shape_source) .. GENERATED FROM PYTHON SOURCE LINES 75-77 Plot points of the local translations module. .. GENERATED FROM PYTHON SOURCE LINES 77-84 .. code-block:: default plt.plot(shape_source[:, 0].numpy(), shape_source[:, 1].numpy(), color='black') plt.plot(points_translations[:, 0].numpy(), points_translations[:, 1].numpy(), 'o', color='blue') plt.axis('equal') plt.show() .. image:: /_auto_examples/leaf_growth/images/sphx_glr_plot_leaf_basipetal_unstructured_002.png :alt: plot leaf basipetal unstructured :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 85-87 Create the deformation model which only consists of one Translations deformation module. .. GENERATED FROM PYTHON SOURCE LINES 90-92 Create and initialize local translations module. .. GENERATED FROM PYTHON SOURCE LINES 92-98 .. code-block:: default sigma = 3./points_density**(1/2) translations = imodal.DeformationModules.Translations(2, points_translations.shape[0], sigma, gd=points_translations) .. GENERATED FROM PYTHON SOURCE LINES 99-101 Define deformables used by the registration model. .. GENERATED FROM PYTHON SOURCE LINES 101-105 .. code-block:: default deformable_shape_source = imodal.Models.DeformablePoints(shape_source) deformable_shape_target = imodal.Models.DeformablePoints(shape_target) .. GENERATED FROM PYTHON SOURCE LINES 106-111 Registration ^^^^^^^^^^^^ Define the registration model. .. GENERATED FROM PYTHON SOURCE LINES 111-119 .. code-block:: default model = imodal.Models.RegistrationModel( [deformable_shape_source], [translations], [imodal.Attachment.VarifoldAttachment(2, [20., 120.])], lam=10.) .. GENERATED FROM PYTHON SOURCE LINES 120-122 Fitting using Torch LBFGS optimizer. .. GENERATED FROM PYTHON SOURCE LINES 122-131 .. code-block:: default shoot_solver = 'euler' shoot_it = 10 costs = {} fitter = imodal.Models.Fitter(model, optimizer='torch_lbfgs') fitter.fit([deformable_shape_target], 2, costs=costs, options={'shoot_solver': shoot_solver, 'shoot_it': shoot_it, 'line_search_fn': 'strong_wolfe'}) .. rst-class:: sphx-glr-script-out Out: .. code-block:: none Starting optimization with method torch LBFGS, using solver euler with 10 iterations. Initial cost={'deformation': 0.0, 'attach': 182832.109375} 1e-10 Evaluated model with costs=182832.109375 Evaluated model with costs=179701.38137418032 Evaluated model with costs=167029.2038526535 Evaluated model with costs=156970.70640945435 Evaluated model with costs=129281.19460296631 Evaluated model with costs=304576.125 Evaluated model with costs=69574.68975830078 Evaluated model with costs=54175.95245361328 Evaluated model with costs=42579.201171875 Evaluated model with costs=12281.86767578125 Evaluated model with costs=5417.4791259765625 Evaluated model with costs=2907.400390625 Evaluated model with costs=2257.356201171875 Evaluated model with costs=1935.48583984375 Evaluated model with costs=830857.34375 Evaluated model with costs=1854.342041015625 Evaluated model with costs=1828.0673828125 Evaluated model with costs=1822.04052734375 Evaluated model with costs=1797.1142578125 Evaluated model with costs=521929.9423828125 Evaluated model with costs=1797.47412109375 Evaluated model with costs=1797.44189453125 Evaluated model with costs=1797.1142578125 ================================================================================ Time: 2.789819064000767 Iteration: 0 Costs deformation=1538.4228515625 attach=258.69140625 Total cost=1797.1142578125 1e-10 Evaluated model with costs=1797.1142578125 Evaluated model with costs=521929.9423828125 Evaluated model with costs=1797.47412109375 Evaluated model with costs=1797.44189453125 Evaluated model with costs=1797.1142578125 ================================================================================ Time: 3.3891153300028236 Iteration: 1 Costs deformation=1538.4228515625 attach=258.69140625 Total cost=1797.1142578125 ================================================================================ Optimisation process exited with message: Convergence achieved. Final cost=1797.1142578125 Model evaluation count=28 Time elapsed = 3.389471719001449 .. GENERATED FROM PYTHON SOURCE LINES 132-137 Results visualization ^^^^^^^^^^^^^^^^^^^^^ Compute optimized deformation trajectory. .. GENERATED FROM PYTHON SOURCE LINES 137-146 .. code-block:: default intermediates = {} with torch.autograd.no_grad(): deformed = model.compute_deformed(shoot_solver, shoot_it, intermediates=intermediates) deformed_shape = deformed[0][0] translations_controls = [control[1] for control in intermediates['controls']] .. GENERATED FROM PYTHON SOURCE LINES 147-149 Plot results. .. GENERATED FROM PYTHON SOURCE LINES 149-173 .. code-block:: default plt.subplot(1, 3, 1) plt.title("Source") plt.plot(shape_source[:, 0].numpy(), shape_source[:, 1].numpy(), '-', color='black') plt.axis(aabb_target.totuple()) plt.axis('equal') plt.subplot(1, 3, 2) plt.title("Deformed source") plt.plot(deformed_shape[:, 0], deformed_shape[:, 1], '-', color='blue') plt.axis(aabb_target.totuple()) plt.axis('equal') plt.subplot(1, 3, 3) plt.title("Deformed source and target") plt.plot(shape_target[:, 0].numpy(), shape_target[:, 1].numpy(), '-', color='red') plt.plot(deformed_shape[:, 0], deformed_shape[:, 1], '-', color='blue') plt.axis(aabb_target.totuple()) plt.axis('equal') plt.tight_layout() plt.show() .. image:: /_auto_examples/leaf_growth/images/sphx_glr_plot_leaf_basipetal_unstructured_003.png :alt: Source, Deformed source, Deformed source and target :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 174-177 Recompute the learned deformation trajectory this time with the grid deformation to visualize growth. .. GENERATED FROM PYTHON SOURCE LINES 177-199 .. code-block:: default # Reset the local translations module with the learned initialization manifold. translations.manifold.fill(model.init_manifold[1]) aabb_source.scale_(1.2) # Define the deformation grid. square_size = 1. grid_resolution = [math.floor(aabb_source.width/square_size), math.floor(aabb_source.height/square_size)] deformable_source = imodal.Models.DeformablePoints(shape_source) deformable_grid = imodal.Models.DeformableGrid(aabb_source, grid_resolution) deformable_source.silent_module.manifold.fill_cotan(model.init_manifold[0].cotan) controls = [[control[1]] for control in intermediates['controls']] # Shoot. intermediates = {} with torch.autograd.no_grad(): imodal.Models.deformables_compute_deformed([deformable_source, deformable_grid], [translations], shoot_solver, shoot_it, controls=controls, intermediates=intermediates) .. GENERATED FROM PYTHON SOURCE LINES 200-202 Plot the growth trajectory. .. GENERATED FROM PYTHON SOURCE LINES 202-223 .. code-block:: default indices = [0, 3, 7, 10] plt.figure(figsize=[10.*len(indices), 10.]) for i, index in enumerate(indices): state = intermediates['states'][index] ax = plt.subplot(1, len(indices), i + 1) deformable_grid.silent_module.manifold.fill_gd(state[1].gd) grid_x, grid_y = deformable_grid.silent_module.togrid() imodal.Utilities.plot_grid(ax, grid_x, grid_y, color='xkcd:light blue', lw=0.4) plt.plot(shape_source[:, 0].numpy(), shape_source[:, 1].numpy(), color='black') plt.plot(shape_target[:, 0].numpy(), shape_target[:, 1].numpy(), color='red') plt.plot(state[0].gd[:, 0].numpy(), state[0].gd[:, 1].numpy()) plt.axis('equal') plt.axis('off') plt.tight_layout() plt.show() .. image:: /_auto_examples/leaf_growth/images/sphx_glr_plot_leaf_basipetal_unstructured_004.png :alt: plot leaf basipetal unstructured :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 224-232 Unstructured growth model using curve and dots informations ----------------------------------------------------------- Initialization ^^^^^^^^^^^^^^ Plot source and target. .. GENERATED FROM PYTHON SOURCE LINES 232-244 .. code-block:: default plt.title("Source and target") plt.plot(shape_source[:, 0].numpy(), shape_source[:, 1].numpy(), color='black') plt.plot(dots_source[:, 0].numpy(), dots_source[:, 1].numpy(), '.', color='black') plt.plot(shape_target[:, 0].numpy(), shape_target[:, 1].numpy(), color='red') plt.plot(dots_target[:, 0].numpy(), dots_target[:, 1].numpy(), '.', color='red') plt.axis('equal') plt.show() .. image:: /_auto_examples/leaf_growth/images/sphx_glr_plot_leaf_basipetal_unstructured_005.png :alt: Source and target :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 245-247 We now sample the points that will be used by the local translations module. .. GENERATED FROM PYTHON SOURCE LINES 247-257 .. code-block:: default # Build AABB (Axis Aligned Bounding Box) around the source shape and uniformly # sample points for the growth module. points_density = 0.05 aabb_source = imodal.Utilities.AABB.build_from_points(shape_source) points_translations = imodal.Utilities.fill_area_uniform_density(imodal.Utilities.area_shape, aabb_source.scale(1.3), points_density, shape=1.3*shape_source) .. GENERATED FROM PYTHON SOURCE LINES 258-260 Plot geometrical descriptor of the local translations module. .. GENERATED FROM PYTHON SOURCE LINES 260-267 .. code-block:: default plt.plot(shape_source[:, 0].numpy(), shape_source[:, 1].numpy(), color='black') plt.plot(points_translations[:, 0].numpy(), points_translations[:, 1].numpy(), 'o', color='blue') plt.axis('equal') plt.show() .. image:: /_auto_examples/leaf_growth/images/sphx_glr_plot_leaf_basipetal_unstructured_006.png :alt: plot leaf basipetal unstructured :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 268-270 Create and initialize local translations module. .. GENERATED FROM PYTHON SOURCE LINES 270-276 .. code-block:: default sigma = 3./points_density**(1/2) translations = imodal.DeformationModules.Translations(2, points_translations.shape[0], sigma, gd=points_translations) .. GENERATED FROM PYTHON SOURCE LINES 277-279 Define deformables used by the registration model. .. GENERATED FROM PYTHON SOURCE LINES 279-286 .. code-block:: default deformable_shape_source = imodal.Models.DeformablePoints(shape_source) deformable_shape_target = imodal.Models.DeformablePoints(shape_target) deformable_dots_source = imodal.Models.DeformablePoints(dots_source) deformable_dots_target = imodal.Models.DeformablePoints(dots_target) .. GENERATED FROM PYTHON SOURCE LINES 287-292 Registration ^^^^^^^^^^^^ Define the registration model. .. GENERATED FROM PYTHON SOURCE LINES 292-301 .. code-block:: default model = imodal.Models.RegistrationModel( [deformable_shape_source, deformable_dots_source], [translations], [imodal.Attachment.VarifoldAttachment(2, [20, 120.]), imodal.Attachment.EuclideanPointwiseDistanceAttachment(10.)], lam=10.) .. GENERATED FROM PYTHON SOURCE LINES 302-304 Fitting using Torch LBFGS optimizer. .. GENERATED FROM PYTHON SOURCE LINES 304-313 .. code-block:: default shoot_solver = 'euler' shoot_it = 10 costs = {} fitter = imodal.Models.Fitter(model, optimizer='torch_lbfgs') fitter.fit([deformable_shape_target, deformable_dots_target], 50, costs=costs, options={'shoot_solver': shoot_solver, 'shoot_it': shoot_it, 'line_search_fn': 'strong_wolfe'}) .. rst-class:: sphx-glr-script-out Out: .. code-block:: none Starting optimization with method torch LBFGS, using solver euler with 10 iterations. Initial cost={'deformation': 0.0, 'attach': 260650.3125} 1e-10 Evaluated model with costs=260650.3125 Evaluated model with costs=257162.85886867344 Evaluated model with costs=241777.5296883583 Evaluated model with costs=118299.703125 Evaluated model with costs=142469.24853515625 Evaluated model with costs=91831.74267578125 Evaluated model with costs=84515.73797607422 Evaluated model with costs=87440.89465332031 Evaluated model with costs=81865.4970703125 Evaluated model with costs=81149.18273925781 Evaluated model with costs=75754.69885253906 Evaluated model with costs=61147.25695800781 Evaluated model with costs=47160.357421875 Evaluated model with costs=108048.39453125 Evaluated model with costs=40211.732666015625 Evaluated model with costs=28642.213623046875 Evaluated model with costs=25995.533935546875 Evaluated model with costs=24178.60888671875 Evaluated model with costs=21795.709350585938 Evaluated model with costs=18810.078125 Evaluated model with costs=16886.185302734375 Evaluated model with costs=16451.287109375 Evaluated model with costs=100116.37170410156 Evaluated model with costs=16337.872802734375 Evaluated model with costs=15726.703247070312 ================================================================================ Time: 3.6096217459999025 Iteration: 0 Costs deformation=1507.1446533203125 attach=14219.55859375 Total cost=15726.703247070312 1e-10 Evaluated model with costs=15726.703247070312 Evaluated model with costs=15232.046752929688 Evaluated model with costs=14453.909423828125 Evaluated model with costs=15007.512451171875 Evaluated model with costs=14433.239013671875 Evaluated model with costs=14296.302734375 Evaluated model with costs=14281.444946289062 Evaluated model with costs=14170.8896484375 Evaluated model with costs=12959.585205078125 Evaluated model with costs=12739.507202148438 Evaluated model with costs=12687.0556640625 Evaluated model with costs=12601.591796875 Evaluated model with costs=12477.247436523438 Evaluated model with costs=12324.508056640625 Evaluated model with costs=12025.943481445312 Evaluated model with costs=11591.653442382812 Evaluated model with costs=11463.57958984375 Evaluated model with costs=11291.584106445312 Evaluated model with costs=11433.396118164062 Evaluated model with costs=11285.421020507812 Evaluated model with costs=11261.66943359375 Evaluated model with costs=11260.155029296875 Evaluated model with costs=11238.599609375 Evaluated model with costs=11233.166259765625 Evaluated model with costs=10909.42041015625 ================================================================================ Time: 7.170835379998607 Iteration: 1 Costs deformation=1630.66943359375 attach=9278.7509765625 Total cost=10909.42041015625 1e-10 Evaluated model with costs=10909.42041015625 Evaluated model with costs=10760.473754882812 Evaluated model with costs=10723.598266601562 Evaluated model with costs=10649.3251953125 Evaluated model with costs=10611.262451171875 Evaluated model with costs=10559.218627929688 Evaluated model with costs=11076.683227539062 Evaluated model with costs=10530.7607421875 Evaluated model with costs=10446.40185546875 Evaluated model with costs=10205.652587890625 Evaluated model with costs=9752.00146484375 Evaluated model with costs=9520.787109375 Evaluated model with costs=9389.342041015625 Evaluated model with costs=9147.64111328125 Evaluated model with costs=8922.420776367188 Evaluated model with costs=8884.953735351562 Evaluated model with costs=8860.11376953125 Evaluated model with costs=8814.686157226562 Evaluated model with costs=8762.84521484375 Evaluated model with costs=8676.981201171875 Evaluated model with costs=8413.5673828125 Evaluated model with costs=8206.728637695312 Evaluated model with costs=8068.78125 ================================================================================ Time: 10.445969016000163 Iteration: 2 Costs deformation=1695.3193359375 attach=6373.4619140625 Total cost=8068.78125 1e-10 Evaluated model with costs=8068.78125 Evaluated model with costs=7960.908447265625 Evaluated model with costs=7922.5640869140625 Evaluated model with costs=7868.310302734375 Evaluated model with costs=7791.7198486328125 Evaluated model with costs=7621.8438720703125 Evaluated model with costs=7420.255126953125 Evaluated model with costs=7181.497802734375 Evaluated model with costs=6991.524658203125 Evaluated model with costs=6891.751708984375 Evaluated model with costs=6825.6275634765625 Evaluated model with costs=6786.7158203125 Evaluated model with costs=6758.8505859375 Evaluated model with costs=6738.1510009765625 Evaluated model with costs=6707.679443359375 Evaluated model with costs=6673.4010009765625 Evaluated model with costs=6616.98046875 Evaluated model with costs=6558.87548828125 Evaluated model with costs=6503.7864990234375 Evaluated model with costs=6447.520263671875 Evaluated model with costs=6350.9755859375 ================================================================================ Time: 13.474108162998164 Iteration: 3 Costs deformation=1740.82861328125 attach=4610.14697265625 Total cost=6350.9755859375 1e-10 Evaluated model with costs=6350.9755859375 Evaluated model with costs=6286.5196533203125 Evaluated model with costs=6241.5653076171875 Evaluated model with costs=444768.513671875 Evaluated model with costs=6199.3372802734375 Evaluated model with costs=6186.8814697265625 Evaluated model with costs=6176.735107421875 Evaluated model with costs=6172.128173828125 Evaluated model with costs=6179.0970458984375 Evaluated model with costs=6170.550537109375 Evaluated model with costs=6180.369873046875 Evaluated model with costs=6169.0860595703125 Evaluated model with costs=6171.8260498046875 Evaluated model with costs=6168.0667724609375 Evaluated model with costs=6168.3201904296875 Evaluated model with costs=6168.435302734375 Evaluated model with costs=6170.990234375 Evaluated model with costs=6167.8515625 Evaluated model with costs=6288.00341796875 Evaluated model with costs=6169.5419921875 Evaluated model with costs=6169.677978515625 Evaluated model with costs=6167.8515625 Evaluated model with costs=6167.8515625 Evaluated model with costs=6167.8515625 ================================================================================ Time: 16.951740858999983 Iteration: 4 Costs deformation=1805.99365234375 attach=4361.85791015625 Total cost=6167.8515625 1e-10 Evaluated model with costs=6167.8515625 Evaluated model with costs=6288.00341796875 Evaluated model with costs=6169.5419921875 Evaluated model with costs=6169.677978515625 Evaluated model with costs=6167.8515625 Evaluated model with costs=6167.8515625 Evaluated model with costs=6167.8515625 ================================================================================ Time: 17.94131602699781 Iteration: 5 Costs deformation=1805.99365234375 attach=4361.85791015625 Total cost=6167.8515625 ================================================================================ Optimisation process exited with message: Convergence achieved. Final cost=6167.8515625 Model evaluation count=125 Time elapsed = 17.941671292999672 .. GENERATED FROM PYTHON SOURCE LINES 314-319 Result visualization ^^^^^^^^^^^^^^^^^^^^ Compute optimized deformation trajectory. .. GENERATED FROM PYTHON SOURCE LINES 319-327 .. code-block:: default intermediates = {} with torch.autograd.no_grad(): deformed = model.compute_deformed(shoot_solver, shoot_it, intermediates=intermediates) deformed_shape = deformed[0][0] deformed_dots = deformed[1][0] .. GENERATED FROM PYTHON SOURCE LINES 328-330 Plot results. .. GENERATED FROM PYTHON SOURCE LINES 330-355 .. code-block:: default plt.subplot(1, 3, 1) plt.title("Source") plt.plot(shape_source[:, 0].numpy(), shape_source[:, 1].numpy(), '-', color='black') plt.plot(dots_source[:, 0].numpy(), dots_source[:, 1].numpy(), '.', color='black') plt.axis('equal') plt.subplot(1, 3, 2) plt.title("Deformed source") plt.plot(deformed_shape[:, 0], deformed_shape[:, 1], '-', color='blue') plt.plot(deformed_dots[:, 0], deformed_dots[:, 1], '.', color='blue') plt.axis('equal') plt.subplot(1, 3, 3) plt.title("Deformed source and target") plt.plot(shape_target[:, 0].numpy(), shape_target[:, 1].numpy(), '-', color='red') plt.plot(dots_target[:, 0].numpy(), dots_target[:, 1].numpy(), '.', color='red') plt.plot(deformed_shape[:, 0], deformed_shape[:, 1], '-', color='blue') plt.plot(deformed_dots[:, 0], deformed_dots[:, 1], '.', color='blue') plt.axis('equal') plt.tight_layout() plt.show() .. image:: /_auto_examples/leaf_growth/images/sphx_glr_plot_leaf_basipetal_unstructured_007.png :alt: Source, Deformed source, Deformed source and target :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 356-359 Recompute the learned deformation trajectory this time with the grid deformation to visualize growth. .. GENERATED FROM PYTHON SOURCE LINES 359-384 .. code-block:: default # Reset the local translations module with the learned initialization manifold. translations.manifold.fill(model.init_manifold[2]) aabb_source.scale_(1.2) # Define the deformation grid. square_size = 1. grid_resolution = [math.floor(aabb_source.width/square_size), math.floor(aabb_source.height/square_size)] deformable_source = imodal.Models.DeformablePoints(shape_source) deformable_dots_source = imodal.Models.DeformablePoints(dots_source) deformable_grid = imodal.Models.DeformableGrid(aabb_source, grid_resolution) deformable_source.silent_module.manifold.fill_cotan(model.init_manifold[0].cotan) deformable_dots_source.silent_module.manifold.fill_cotan(model.init_manifold[1].cotan) controls = [[control[2]] for control in intermediates['controls']] # Shoot. intermediates = {} with torch.autograd.no_grad(): imodal.Models.deformables_compute_deformed([deformable_source, deformable_dots_source, deformable_grid], [translations], shoot_solver, shoot_it, controls=controls, intermediates=intermediates) .. GENERATED FROM PYTHON SOURCE LINES 385-387 Plot the growth trajectory. .. GENERATED FROM PYTHON SOURCE LINES 387-411 .. code-block:: default indices = [0, 3, 7, 10] plt.figure(figsize=[10.*len(indices), 10.]) for i, index in enumerate(indices): state = intermediates['states'][index] ax = plt.subplot(1, len(indices), i + 1) deformable_grid.silent_module.manifold.fill_gd(state[2].gd) grid_x, grid_y = deformable_grid.silent_module.togrid() imodal.Utilities.plot_grid(ax, grid_x, grid_y, color='xkcd:light blue', lw=0.4) plt.plot(shape_source[:, 0].numpy(), shape_source[:, 1].numpy(), color='black') plt.plot(shape_target[:, 0].numpy(), shape_target[:, 1].numpy(), color='red') plt.plot(state[0].gd[:, 0].numpy(), state[0].gd[:, 1].numpy(), color='blue') plt.plot(state[1].gd[:, 0].numpy(), state[1].gd[:, 1].numpy(), '.', color='blue') plt.axis('equal') plt.axis('off') plt.tight_layout() plt.show() .. image:: /_auto_examples/leaf_growth/images/sphx_glr_plot_leaf_basipetal_unstructured_008.png :alt: plot leaf basipetal unstructured :class: sphx-glr-single-img .. rst-class:: sphx-glr-timing **Total running time of the script:** ( 0 minutes 23.560 seconds) .. _sphx_glr_download__auto_examples_leaf_growth_plot_leaf_basipetal_unstructured.py: .. only :: html .. container:: sphx-glr-footer :class: sphx-glr-footer-example .. container:: sphx-glr-download sphx-glr-download-python :download:`Download Python source code: plot_leaf_basipetal_unstructured.py ` .. container:: sphx-glr-download sphx-glr-download-jupyter :download:`Download Jupyter notebook: plot_leaf_basipetal_unstructured.ipynb ` .. only:: html .. rst-class:: sphx-glr-signature `Gallery generated by Sphinx-Gallery `_