Example a/snake: Snake: fitting a curve to digitise along

This example shows how to use cmgui to fit a curve through data points. The curve is then written out to an exnode file. This file can be used to generate a sequence of digitisation planes, one for each node.

Created by Peter Bier, September 2002.

Data points Fitted curve

Screenshot of example a/snake


The comfile run by this example is as follows:

# This examples fits a curve through user defined data points using snake

# The curve created is then written out to use as a line of digitisation 
# for MRI data of the vocal tract during voicing of the vowel a

sub create_curve
{
# Create new_curve from all selected data points
# A density of 0 gives approximately equal element spacing
# A stiffness must be set if you have more specified the curve to have more 
# elements than there are data points
# Note you must select at least two data points to create a curve


# Command updated by fixcom.pl on Thu Apr 13 15:10:47 2006
# Old command:   gfx create snake coord coordinates dest new_curve num $num_elements density 0 stiffness 0.01
  gfx create snake number_of_fitting_fields 1 fitting_fields coordinates  coord coordinates dest new_curve number_of_elements $num_elements density 0 stiffness 0.01
  gfx write node group new_curve curve.exnode

}


# For convenience store the number of elements to use along the curve
# at the top of the file.
# Note that there will be one more node than the number of elements specified
# Each node is used to generate one digitisation plane so for 20 planes
# we use 19 elements
$num_elements = 19;

# Load up one mri slice as a reference image.  This image can then be used to 
# determine where to place the initial data points that the curve will be
# fitted through.

# Create a volume texture
gfx create texture tract image dcm:$example/middle_slice.ima  width 256 height 256 distortion 0 0 0 colour 0 0 0 alpha 0 decal linear_filter resize_nearest_filter clamp_wrap;

# Next create a material containing the texture so that we can display it on
# an element
gfx create material tract texture tract

# Create some other useful materials to colour things
gfx create material purple ambient 0 0 0 diffuse 0.55 0.35 1 emission 0 0 0 specular 0.5 0.5 0.5 alpha 1 shininess 0.5 
gfx create material bluey ambient 0 0.25 0.5 diffuse 0 0.4 1 emission 0 0 0 specular 0.5 0.5 0.5 alpha 1 shininess 0.3
gfx create material red ambient 1 0 0 diffuse 1 0 0
gfx create material green ambient 0 1 0 diffuse 0 1 0

# Read in a plane to view the texture on
gfx read nodes $example/middle_slice.exnode
gfx read elements $example/middle_slice.exelem

# Draw the texture on the plane
gfx modify g_element middle_slice surfaces material tract texture_coordinates coordinates selected_material default_selected render_shaded;

# Create a group to put the curve data points into
gfx create dgroup new_curve

# Create a field to represent the derivatives of the curve at each node
gfx define field dx_ds1 coordinate_system rectangular_cartesian node_value fe_field coordinates d/ds1 version 1

if($TESTING) {

# read in some data points to test fitting a curve
gfx read data $example/test.exdata
gfx select data 1..10
create_curve

} else {	
	
# Create the window with a special view 

gfx create window 1
gfx modify window 1 view parallel eye_point 128 128 738.522 interest_point 128 128 0 up_vector 0 1 0 view_angle 31.391 near_clipping_plane 7.38522 far_clipping_plane 2639.22 relative_viewport ndc_placement -1 1 2 2 viewport_coordinates 0 0 1 1;


# Set the data_tool as the current tool in the window
gfx modify win 1 set data_tool

# Enable editing and creating of data by the data tool - with the new
# coordinate field and group
gfx data_tool edit define create coordinate_field coordinates group new_curve constrain_to_surface;

# Make sure new_curve data is visible once created
gfx modify g_element new_curve general clear circle_discretization 6 element_discretization "16*16*16" native_discretization none

gfx modify g_element new_curve data_points glyph sphere general size "4*4*4" centre 0,0,0 label cmiss_number select_on material green selected_material default_selected

gfx modify g_element new_curve node_points glyph sphere general size "4*4*4" centre 0,0,0 label cmiss_number select_on material default selected_material default_selected

gfx modify g_element new_curve node_points glyph arrow_solid general size "0*2*2" centre 0,0,0 label cmiss_number orientation dx_ds1 scale_factors "0.5*0*0" select_on material default selected_material default_selected

gfx modify g_element new_curve cylinder constant_radius 0.4 select_on material green selected_material default_selected

}

#Don't do these steps automatically but allow the user to double click them in the command window history.
if (0)
{
# By default the curve will follow the data points in the same order that you
# created them.  If you want a different order then you will need to renumber them.
# You can renumber your data points and sort them by any other field, i.e. to
# sort them by the x coordinate.
  gfx change_id data_offset 1000 sort_by coordinates.x;
#
# Example instructions:
#
# Create your data points by clicking on the image.
#
# When finished select all data points (to do this double click on data
# to bring up the data tool menu and deselect create - you can now select
# multiple points by dragging a box around them) or type
  gfx select data all;
# To fit a curve through the selected data points and then write the
# curve to a file run the sub routine create_curve by typing
  create_curve;
# at the cmgui command line
}


Files used by this example are:

Name                 Modified     Size

snake.com 17-Mar-2014 5.1k COPYRIGHT 17-Mar-2014 504 middle_slice.exelem 17-Mar-2014 1.5k middle_slice.exnode 17-Mar-2014 358 middle_slice.ima 17-Mar-2014 134k test.exdata 17-Mar-2014 814

Download the entire example:

Name                     Modified     Size

examples_a_snake.tar.gz 09-Mar-2016 504k

Testing status by version:

StatusTestedReal time (s)
i686-linux
cmgui-wxFailureSun Mar 6 00:05:52 20160
last breakMon Aug 25 13:12:00 20141
cmgui-wx-debugFailureSun Mar 6 00:05:53 20161
last breakMon Aug 25 13:12:00 20141
cmgui-wx-debug-memorycheckFailureSun Mar 6 00:05:53 20161
last breakMon Aug 25 13:12:00 20141
cmgui-wx-debug-valgrindFailureSun Mar 6 00:34:18 201616
last breakTue Feb 24 00:04:00 201515
x86_64-linux
cmgui-wxFailureSun Mar 6 00:01:33 20161
last breakFri Aug 15 00:41:00 20140
cmgui-wx-debugFailureSun Mar 6 00:01:33 20161
last breakFri Aug 15 00:41:00 20141
cmgui-wx-debug-memorycheckFailureSun Mar 6 00:01:33 20160
last breakFri Aug 15 00:41:00 20140
cmgui-wx-debug-valgrindFailureSun Mar 6 00:03:55 201614
last breakSun Mar 6 00:03:00 201614
cmgui-wx-gcc-cad-debug-valgrindSuccessThu Jan 7 00:04:17 201612

Testing status by file:


Html last generated: Wed Mar 9 16:02:39 2016

Input last modified: Wed Mar 9 15:49:44 2016


CMISS Help / Examples / a / snake