| NEWS | R Documentation | 
News for Package 'Morpho'
Changes in Morpho version 2.13 (2025-09-04)
- NEW: inscribeEllipse/inscribeEllipseRot: fit a maximum area ellipse into a 2D outline. Published in Torres et al. (2025) 
- NEW: ILDS, ILDSR2: functions to assess meaningful subsets of interlandmark distances (Cardini et al (2025) - under review). 
- icpmat: add functionality to avoid excessive scaling in case of similarity transform. 
- meshDist: fix heatmap colors for case matrix 
Changes in Morpho version 2.12 (2023-12-06)
- Fixed compiler complaints by CRAN 
- bindArr: check for input as array 
Changes in Morpho version 2.11 (2023-01-26)
- crossProduct: added option normalize. 
- Replace rgl.* calls with *3d calls. (#33) 
- read.slicerjson: read undefined landmarks from json info instead of checking position values 
- read.slicerjson: read orientation from file instead of generic lps2ras matrix 
- read.slicerjson: allow to read undefined landmarks 
- write.slicerjson: allow export of NA values for Slicer >=5.0 
Changes in Morpho version 2.10 (2022-09-09)
- read.fcsv: optimize handling of fiducial names 
- NEW: computeArea: function computing projected area enclosed by set of ordered landmarks. 
- pls2B: fixed CV and permutest for univariate cases. 
- pls2B: Added RV-coefficient (and permutation test) 
- getPLSCommonShape: fixed common sd calculation in example 
- procSym/align2procSym: support use.lm option in align2procSym 
- restoreShapes: add option meanlogCS / procSym add meanlogCS as output in case sizeshape=TRUE 
- restoreShapes: add option origsize. 
- restoreShapes: add option sizeshape 
- readallTPS: add scale to allow scaling by included scale factor. 
Changes in Morpho version 2.9 (2021-09-01)
- deformGrid2d: added option lty 
- read.slicerjson: add option to specify na values. 
- rotonto: return correctly dimensioned matrices in NA cases. 
- NEW: getPointAlongOutline and resampleCurve 
- meshDist: added option titleplot for customizing heatmap axis. 
- procSym: Add numbering to PC-Variance table. 
- groupPCA: remove misleading combinedVar table from output 
- mirror: added option to mirror on plane, using it as a wrapper for mirror2plane. 
- fixed arguments in deprecated function showPC 
- deprecated: showPC 
- getSides: set default values for pcAlign and icpiter 
- NEW: getSides to find bilateral landmarks. 
- NEW: updateIndices: update a vector of indices after removel of some of the indexed items 
- NEW: restoreFromPCA: retrieve data back from a pca space. 
- slider3d: new option smoothnormals to obtain tangent plains from smoothed normals 
- read.slicer.json: added option lps2ras to automatically convert lps 2 ras space on import 
- read.fcsv: add option lps2ras to allow an automatic conversion to RAS space if coordinates are recorded in LPS (as of Slicer > 4.11). 
Changes in Morpho version 2.8 (2020-03-04)
- classify: added option newdata to predict class affinity for new data 
- NEW: added predict functions for CVA and groupPCA 
- warpmovie3d: supports now colored meshes 
- changed mesh coloring to new rgl default of per-vertex color vector 
- deformGrid3d: fixed correct position of grid 
- typprob: fix mean matrix for single cases 
- computeTransform: fix checking for NA Landmarks in all transform types 
- angleTest: if values exceed system max for doubles, set them to .Machine$double.xmax and issue warning 
- mesh2obj: now simply a wrapper for Rvcg::vcgObjWrite. Fixes Issue #14. 
- test-slider3d: correctly renamed test 
- rotonto: readded accidentally commented line 
- rotonto: fix case when x and y are missing different coordinates 
- read.fcsv: adapted to latest 3D slicer fiducials format 
Changes in Morpho version 2.7 (2019-05-16)
bugfixes and minor changes
- classify.bgPCA: fixed arrayhandling for non-landmark data 
- deformGrid2d: significant speed up in grid generation 
- slider3d: removed unnecessary print statement. 
- export.meshDist: use vcgPlyWrite for export 
- warpmovie: bug preventing to export to subfolder 
- meshDist, render: set meshColor="legacy" for latest rgl-dev 
- slider3d: check if number of meshes matches number of landmark configs 
- mergeMeshes: fixed color handling in case color is a vector. 
- getTrafoRotaxis: fixed critical bug 
- checkLM: added option meshlist 
- Docu fixes. 
- classify.bgPCA: fix case for 3D arrays 
- write.pts: fix cases with duplicate rownames (prohibited by R) 
- read.pts: don't set rownames if there are duplicate namings in the pts file. 
Changes in Morpho version 2.6 (2018-04-19)
New features
- virtualMeshScan, getOuterViewpoints: perform a virtual rescan of a mesh using defined POVs. 
- deformGrid3d: fixed indices starting with 0 for slices, add gridcol and gridwidth and added options to select subsets of slices. 
- deformGrid2d: added options cex1,cex2,gridcol 
- fixLMmirror: now allowing heavy abuse with loads of missing data and improved error handling 
- plotNormals: allow for per vertex lenght vector and changed long=>length and deprecated old option 
- checkLM: added possibility to view backwards 
- slider3d: made function work in parallel on all OS 
- pls2B: added CV (+ options) 
- added plsCoVarCommonShape: Compute the shape changes along the common axis of deformations 
- added getPLSCommonShape: Obtain linear combinations associated with the common shape change in each latent dimension of a pls2B 
bugfixes and minor changes
- deformGrid3d: fixed indices starting with 0 for slices, add gridcol and gridwidth and added options to select subsets of slices. 
- line2plane: fixed deprectated array multiplication warning 
- changed Matrix::cBind to base::cbind 
- Depend: > R 3.2.0 
- GetPhi (retrodeform): set h to average between landmark distance (not the squared distance) 
- CVA: add rownames and colnames to scores and CVs 
Changes in Morpho version 2.5.1 (2017-04-19)
minor changes
- procSym: reverted to old behaviour, disabling orp if CSinit= FALSE 
Changes in Morpho version 2.5 (2017-03-24)
New features
- added align2procSym to align new data to existing Procrustes aligned data. 
- CVA: added option to specify prior probs 
- fixLMtps, proc.weight: allow custom weight functions 
- slider2d: public version of formerly private Semislide function 
- procSym: added weights and centerweights to control Procrustes registration 
- predictRelWarps: added prediction of uniform scores 
- added support in predictRelWarps for alpha=0 
- icpmat: added options for weights and centerweight 
- deformGrid3d: allow exporting resulting 3D object as mesh 
- cSize now also operates on mesh vertices 
bugfixes and minor changes
- computeTransform: decreased singularity tolerance for type="tps" 
- tps2d: added as alias of tps3d to avoid user confusion 
- equidistantCurve: some minor improvements and fix for 2D case 
- CreateL: fixed return of Lsubk3 if dim=2 
- made read.mpp more generic 
- applyTransform: more efficient normal handling for affine transform 
- write.* functions: only append file suffix if missing in the filename 
Changes in Morpho version 2.4.1 (2016-09-12)
bugfixes and minor changes
- fixed amount of covariance estimation 
Changes in Morpho version 2.4 (2016-07-29)
New features
- added sortCurve and equidistantCurve 
- added kappa statistic to print.classify 
- added read/write.fcsv to read write landmark in 3DSlicer format 
- added prcompfast, a faster and more memory efficient version of prcomp 
- slider3d: now sliding without specifying surfaces is possible. Surface is estimated by computing normals from point clouds using vcgUpdateNormals 
- added plot method for slider3d 
- added fastKmeans a very fast and efficient way to compute kmeans-clustering for 2D and 3D data. 
bugfixes and minor changes
- fixed c++14 standard requirements 
- made index in rmVertex unique 
- showPC: for single PCs vectors of length> 1 are coerced to matrix 
- added option margin in deformGrid3d and deforGrid2d 
- unified code for creating bending energy matrix 
- made relWarps more memory and speed efficient and added option getBasis to disable (computationally expensive) calculation of vector basis. 
- added dimnames from rownames in vecx 
- returns Grandmean and Groupmeans as matrix/array for landmark data 
- correct output in find.outliers if mahalanobis=TRUE and add probability 
- added reflection=FALSE in find.outliers and corrected reported distances 
- fixed read.lmdta for single configs 
- slider3d: fixed case where all file infos are stored in sur.name 
- fixed print.classify 
- removed dependency yaImpute using vcgKDtree instead 
- added unit testing for slider3d 
- made CreateL and tps3d multi-threaded 
- added options silent to slider3d and relaxLM 
- ignore missing values when calculating quantiles and mindist in meshdist 
- refactored CVA and added test for CVA 
- fixed predictPLSfromScores for ncomp=1 
- fixed correct lwd passing in deformGrid3d 
- fixed procAOVsym for 2D case (correct df) 
- added unit test for pls2B 
- speed up pls2B by some orders of magnitude, now suitable for very large landmark configurations 
- showPC: for single PCs vectors of length> 1 are coerced to matrix 
Changes in Morpho version 2.3.1.1 (2016-01-22)
bugfixes and minor changes
- fixed c++14 standard requirements 
- made index in rmVertex unique 
Changes in Morpho version 2.3.1 (2015-12-15)
New features
- meshPlaneIntersect now also supports normals (as cutSpace) 
- added default method for applyTransform for 2D and 3D vectors 
bugfixes and minor changes
- removed bePCs with zero variance from output in relWarps 
- improved error handling in placePatch 
- set square=FALSE in qqmat 
- added message if CSinit = F and orp = T, that orp is disabled 
- fixed applyTransform for type="tps" and inverse = TRUE 
- added testthat test for relWarps 
- tweaked relWarps to work with large amounts of coordinates 
- fixed wrong bracket position in ProcGPA leading to only a single iteration 
- CVA: fixed calculation of posterior probs if cv=F 
- fixed linewidth in CVA example to stop check complaints 
- set p.adjust.method="none" 
- only return significant scores in relWarps 
- named output of plsCoVar 
Changes in Morpho version 2.3.0 (2015-06-18)
New features
- added function line2plane to calculate intersection of a line and a plane 
- added option pcAlign in function mirror to improve alignment to original object 
- added option pcAlign in relWarps and procSym to allow alignment to first specimen rather than PC-axes. 
- Gregory Jefferis added unit testing setup infrastructure 
- added new functions getPLSfromScores, getPLSscores predictPLSfromScores,predictPLSfromData and plsCoVar for prediction and handling results from 2-Block PLS regression. 
- made relaxLM an S3 function and added methods for mesh3d to relax two meshes with corresponding vertices. Added use.lm to specify subset of coordinates for alignment if bending =FALSE 
- new option 'as.factor' in name2factor 
- deprecated warp.mesh (use tps3d now for meshes and matrices) 
- meshDist now allows custom colorramps 
- added option wireframe in deformGrid2d 
- added support for registered meshes in computeTransform 
- added selection of transform type in icpmat 
- added option use.lm to slider3d to specify subset for alignment if bending =FALSE 
- added getMeaningfulPCs to determine meaningful Principal Components. 
- made optimization in pcAlign and mirror run in parallel (not supported on Windows OS). 
bugfixes and minor changes
- fixed normal handling in mergeMeshes 
- fixed coefficient scaling in RegScore 
- added update of normals in meshDist 
- removed unnecessary function meanMat and replaced it with generic colMeans 
- fixed calculation of loadings in pls2B 
- set lambda (regularization) in all tps related functions to 1e-8 to avoid gross distortions in some cases 
- fixed typo in pcAlign leading to misbehaviour if iterations < 1 
Changes in Morpho version 2.2 (2014-12-16)
New features
- slider3d, relaxLM and procSym now allow minimizing Procrustes distance 
- added orientation check in pcAlign to avoid reflections 
- massive speed improvements in sliding semi-landmarks routines 
- added options missing/missingList in relaxLM and slider3d to allow using semi-landmarks in "thin-air" 
- added helper function createMissingList 
- added function points2plane for projecting a point/pointcloud onto a plane. 
- pcAlign with y missing now centers a shape and aligns it by its principal axes. 
- added option pcAlign in procSym and ProcGPA to enable/disable alignment of sample by principal axes 
bugfixes and minor changes
- renamed conv2backf to invertFaces 
- renamed crossp to crossProduct 
- renamed tanplan to tangentPlane 
- reorient faces if reflections are involved in applyTransform 
- made read.lmdta more versatile 
- fixed an issue with argument "size" in deformGrid3d 
- set default method to "vcg" in meshDist 
Changes in Morpho version 2.1 (2014-09-25)
New features
- added new function mirror to mirror a landmark configuration or a mesh and registering onto the original one. 
- added new functions retroDeform3d and retroDeformMesh for removing affine deformation from a 3D-meshes and pointclouds 
- deformGrid3d now also accepts meshes 
- added function classify for CVA and groupPCA for creating classification tables 
- added new function getTrafo4x4, getTrafoRotaxis, computeTransform and applyTransform, for computing and applying affine transformations. 
- new function pcAlign to align meshes and pointclouds by their principal axes 
- added function meshPlaneIntersect to find intersection points between a mesh and a plane 
- added function getFaces to get indices of faces that contain specified vertices 
bugfixes and minor changes
- fixed issue with argument sep in typprobClass 
- added option size in deformGrid3d 
- fixed argument tol in ray2mesh 
- fixed rhotol in placePatch if inflate=NULL 
- fixed NA in colors from meshDist 
- fixed rmVertex in case no faces remain 
- changed relaxLM to accept 2D configs 
- replaced workhorse function in projRead by the faster vcgClostKD 
- made plotNormals to work with homogenous and non-homogeneous coordinates 
- fixed issue in output of CVAdists (wrong attribution of p-value tables) 
Changes in Morpho version 2.0.3 (2014-05-13)
- added support for objects stored in a list in bindArr 
- made rotreverse an S3 function for matrices and mesh3d 
- fixed bug in slider3d if pairedLM != 0 
- fixed pooled within covariance matrix (covW) for single group entries 
- speed up rotonto, rotonmat by vectorizing 
- removed junk comments 
- added fix for weighted Grandmean in CVA (thanks to Anne-Beatrice Defour) 
- added check for empty patches and curves in cExtract (thanks to M. Friess for pointing that out) 
- added 'cutMeshPlane' and 'cutSpace' to cut a pointcloud into upper and lower part 
- added function 'solutionSpace' to calculate the basis of the solution space for Ax=b, with det(A)=0 
- minor changes in asymPermute (docu and table naming) 
- enabled multigroup support in asymPermute 
- added groupmean output in asymPermute 
- updateNormals: if no faces are present, mesh will be returned unchanged now. quadric faces are converted to triangular ones 
- add new function 'quad2trimesh' for converting quadric meshes into triangular meshes. 
- made code in pcaplot3d easier to maintain by creating .pcaplot3d 
- assigned additional attributes to output of procSym 
- exposed armaGinv, a simple wrapper to call Armadillos pseudo-inverse function. 
Changes in Morpho version 2.0.2 (2014-02-24)
- added function 'fixLMmirror' to estimate missing bilateral landmarks 
- wrote C++ versions of some subroutines to speed up Procrustes registration. 
- added function arrMean3 to calculate fast average of 3D-array 
- reprojection onto surface in 'slider3d' now can run in parallel (only OS X and Linux) 
Changes in Morpho version 2.0.1 (2014-02-07)
- 'createAtlas' has new option "keep.fix" to specifiy landmarks that should be kept from sliding in case corrCurves are defined. 
Changes in Morpho version 2.0 (2014-02-06)
- wrote C++ implementation of 'covPCA' (much faster) and added bootstrapping option to compute confidence intervals for PC-scores (removed obsolete options "mc.cores" and "scores") 
- all functions calling trimesh-tools are now wrappers for much faster implementations from Rvcg 
- placePatch now runs in parallel 
- warpmovie3d now allows make movie of deformed mesh AND landmarks 
Changes in Morpho version 1.99 (2013-12-18)
R-code
- renamed 'adnormals' to 'updateNormals' 
- 'permudist' is now massively faster by using C++ code for permutation. It can handle more than 2 groups now. 
- as the new 'permudist' is now implemented in 'groupPCA', it gets a boost, too. 
- added function 'RegScore' to calculate Regression scores as described in Drake & Klingenberg(2008) 
- added 'CAC' (common allometric component) 
- added functions 'asymPermute' (assessing directional asymmetry) and 'meanMat' (fast Matrix averaging) 
- covPCA now returns the distances instead of squared distances 
- added option to revert vecx to translate a matrix back into an array containing landmarks 
- adapted 'ray2mesh' to work in parallel calls and added option "mc.cores" in 'placePatch' - even in Windows 
- added optipn "add" in "meshDist" and "render" to add to existing rgl window. 
- fixed error in in 'placePatch' in case "data" is a matrix 
Package documentation
- switched to roxygen2 
- fixed some docu and added examples in 'pcaplot3d' and 'rotonmat' 
- added link to PDF-manual in Morpho's help page 
- commented out the answers in find.outliers to be able to run run_examples(...,run=FALSE) without errors 
- marked more examples as dontrun, as the usage of roxygen2 allows the detailed check of ALL examples by using run_examples(devtools package). This uses less checking time and keeps CRAN from complaining 
Misc
- translated all FORTRAN routines into C++ using Rcpp/RcppArmadillo 
Changes in Morpho version 1.0 (2013-11-04)
R-code
- added option "barycoords" in 'closemeshKD' and added normal weighting 
- made reprojection ind 'slider3d' using multiple cores in case "meshlist" is specified 
- added option "blockdiag" in 'CreateL' to supress returning blockdiagonal matrix containin Lsubk 
- significant speedup in calcGamma (responsible for sliding) 
- added option "meshlist" in 'slider3d' and fixed memory allocation problem for orthogonal projection with large amounts of landmarks in 'procSym' (underlying routine 'orp') 
- added autonaming of output in write.pts 
- 'mergeMeshes' now allows a list of meshes to merge 
- fixed error in 'mcNNindex' in case k=1 
- added landmark matrix to output of 'cExtract' 
- set pointsize to 10 in 'deformGrid3d' in case "type="p"" 
- added options "silent"/"ignore.stdout" to 'ply2mesh', 'projRead', 'ray2mesh', 'slider3d' and 'warp.mesh' to supress terminal output 
- added option "pt.size" instead of "radius" in 'checkLM' and 'plotAtlas' to control point/sphere size. 
- added option "fixRepro" in 'slider3d' and 'relaxLM' to supress reprojection of fix landmarks onto the surface. This can be useful when some fix landmarks are in "thin air". 
- added support for point cloud export in 'mesh2ply' and 'mesh2obj' 
- added option "silent" in 'rmUnrefVertex' 
- fixed error in 'relWarps' preventing it to work for 2D configs 
- added function 'checkLM'. Useful to visualize if projection by 'placePatch' was successful by browsing through sample. 
- added functions 'placePatch', 'createAtlas' and 'plotAtlas' for defining templates and functions to project (semi-) landmarks from an atlas onto all specimen in a given sample 
- fixed missing '-1' subtraction in 'covW' 
- added function 'mergeMeshes' to concatenate multiple triangular meshes. 
- made function 'procAOVsym' (procrustes Anova for object symmetry) public. 
- made functions 'cSize', 'mcNNindex', 'meshcube', 'meshres', 'ProcGPA' public. 
- added option 'info' in 'read.mpp' 
- merged 'CreateL' and 'CreateL2D' 
- rewrote large parts of 'CVA', 'groupPCA' and 'permudist' to make the code more efficient 
- 'covPCA' now allows permutation tests to check if pairwise distances between covariance matrices are significant and reports rownames for two-group case 
- removed unnecessary complicated check for empty groups by simply using function 'factor' in 'covW' and 'typprobClass' 
- white space formatting in code 
- added option "mshape" to function 'orp' to specify a custom pole for projection 
- made function 'fx', 'PCAcrova' and 'calcTang_U' interntal-only by prefixing function name with '.' 
- removed unnecessary sinus calculation in 'angle.calc' 
Package documentation
- added docu and examples for all newly exposed functions (see above) 
- added examples for 'find.outliers' 
- added more examples for covPCA, performing permutation tests 
- added docu for function 'barycenter' 
- added a lot of examples to docu and documented data(nose) 
- added documentation for 'angle.calc' 
- added example in 'relaxLM' 
- added section "details" in procSym, added example in slider3d 
- added example for procAOVsym 
- changed parameters in examples for 'pls2B' and 'relaxLM' to decrease completion time 
Misc
- changed doParallel from Dependency to Import - needs 'doParallel' >= 1.06 
- removed obsolete Fortran code 
- added minimum version for imported package 'Matrix'(>= 1.0-1) 
- changed foreach, parallel and rgl (needs rgl version >= 0.93.963) from 'Depends' to 'Imports' (affecting DESCRIPTION and NAMESPACE) 
- massive NAMESPACE editing by switching to manual export instead of regular expression export 
Changes in Morpho version 0.25-1 (2013-08-02)
R-code
- replaced abind with 'bindArr' in 'fixLMtps' and 'procSym' 
- moved Distance calculation in 'CVA' to '.CVAdists' and radically cleaned code; 
- removal of redundant variables in 'groupPCA' 
- added option 'reflect' to 'procSym' (and underlying functions) and added copyright note for code copied from shapes package 
Package documentation
- added docu for new data set "boneData" 
- added examples in 'procSym' 
- added example for 'tps3d' 
Misc
- added additional example data (landmarks and a bone surface mesh) 
- updated DESCRIPTION and README 
- updated README added sourceforge and github download links 
- added README.Rd 
- added NEWS.Rd 
Changes in Morpho version 0.25 (2013-07-24)
R-code
- simplified code in 'CVA' and 'CVA.crova' 
- fixed issue when n-groups > n variables in 'CVA' and 'CVA.crova' 
- replaced 'nn2' (RANN) with 'ann' (yaImpute) because RANN got (temporarily) banned from CRAN because of violation of policy 
- added 'readLandmarks.csv' to read landmarks stored in spreadsheet text files (e.g. comma separated) 
- added check for empty groups in 'typprobClass' and 'covW' 
- changed cube creation in 'deformGrid3d' (much faster now). 
- added options weights and centerweight in 'rotonmat' 
- added confirmation for plotting spheres in 'deformGrid3d' when n > 1000 (can be slow) 
- 'pcaplot3d' now works if data has only 1 PC 
- removed useless code remains 
- added 'bindArr' to concatenate matrices/arrays 
- changed default core value in 'closemeshKD' from detectCores() to 1. 
- added option 'keep' in 'rmVertex' 
- changed default method in 'meshDist.mesh3d' from vcglib to morpho 
- renamed 'regdist.raw' to 'regdist' and removed original 'regdist' (too prone to user error) 
Package documentation
- finally mentioned Marta Rufino for providing all examples in docu for 'CVA' (sorry Marta, I simply forgot) 
- fixed some docu and added examples in 'pcaplot3d' and 'rotonmat' 
- added docu for 'anonymize', 'r2morphoj', 'r2morphologika', 'NNshapeReg', 'kendalldist' 
Misc
- updated COPYRIGHT file 
- switched from depends to import for colorRamps, MASS, RANN