New fixed.angle() Function

R-bloggers 2013-05-07

(This article was first published on geomorph, and kindly contributed to R-bloggers)
.MsoPlainText div { font-family: Tahoma, Geneva, sans-serif; } .MsoPlainText div blockquote table { text-align: left; } .MsoPlainText { color: #CCC; } .code table tr td { color: #000; }
Hello morphometricians,
Below you can find a new fixed angle function addressing the problem discovered by Fabio Machado in the morphmet mail archive. We will include this function in our next schedule update to geomorph.
Cheers,
Erik

CODE:

fixed.angle<-function(A,art.pt=NULL,angle.pts=NULL,rot.pts=NULL,angle=0){ if (length(dim(A))!=3){ stop("Data matrix 1 not a 3D array (see 'arrayspecs').") } if(length(grep("-999",A))!=0){ stop("Data matrix 1 contains missing values. Estimate these first(see 'estimate.missing').") } n<-dim(A)[3]; k<-dim(A)[2]; p<-dim(A)[1] if (k!=2){ stop("Method presently implemented for two-dimensional data only.")} if (angle>pi*2){ stop("Additional angle must be specified in radians.")} if (angle< -pi*2){ stop("Additional angle must be specified in radians.")} angl<-array(NA,dim=n) for (i in 1:n){ A[,,i]<-t(t(A[,,i])-A[art.pt,,i]) angl[i]<- acos((A[angle.pts[1],,i]/sqrt(sum(A[angle.pts[1],,i]^2)))%*%(A[angle.pts[2],,i]/sqrt(sum(A[angle.pts[2],,i]^2)))) } dev.angle<- (angl-mean(angl))+angle if(A[angle.pts[1],1,1]<0){dev.angle<- -1*dev.angle} for (i in 1:n){ r = matrix(c(cos(dev.angle[i]),-sin(dev.angle[i]),sin(dev.angle[i]),cos(dev.angle[i])),2) A[rot.pts,,i] = A[rot.pts,,i]%*%r } return(A) }

To leave a comment for the author, please follow the link and comment on his blog: geomorph.

R-bloggers.com offers daily e-mail updates about R news and tutorials on topics such as: visualization (ggplot2, Boxplots, maps, animation), programming (RStudio, Sweave, LaTeX, SQL, Eclipse, git, hadoop, Web Scraping) statistics (regression, PCA, time series,ecdf, trading) and more...