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