[R] adding 3D arrows to 3D plots
Peter Ehlers
ehlers at ucalgary.ca
Sun Jan 10 22:39:00 CET 2010
Cool, Barry.
I set n=30, col="red" and stuck it into my daiquiri!
-Peter Ehlers
Barry Rowlingson wrote:
> Have a go with this:
>
> arrow3d <- function(p0=c(0,1,0),p1=c(1,1,1),s=0.1,theta=pi/4,n=3,...){
> ## p0: start point
> ## p1: end point
> ## s: length of barb as fraction of line length
> ## theta: opening angle of barbs
> ## n: number of barbs
> ## ...: args passed to lines3d for line styling
>
> require(geometry)
> require(rgl)
>
> ## rotational angles of barbs
> phi=seq(0,2*pi,len=n+1)[-1]
>
> ## length of line
> lp = sqrt(sum((p1-p0)^2))
>
> ## point down the line where the barb ends line up
> cpt=(1-(s*lp*cos(theta)))*(p1-p0)
>
> ## draw the main line
> line = lines3d(c(p0[1],p1[1]),c(p0[2],p1[2]),c(p0[3],p1[3]),...)
>
> ## need to find a right-angle to the line. So create a random point:
> rpt = jitter(c(
> runif(1,min(p0[1],p1[1]),max(p0[1],p1[1])),
> runif(1,min(p0[2],p1[2]),max(p0[2],p1[2])),
> runif(1,min(p0[3],p1[3]),max(p0[3],p1[3]))
> ))
>
> ## and if it's NOT on the line the cross-product gives us a vector
> at right angles:
> r = extprod3d(p1-p0,rpt)
> ## normalise it:
> r = r / sqrt(sum(r^2))
>
> ## now compute the barb end points and draw:
> pts = list()
> for(i in 1:length(phi)){
> ptb=rotate3d(r,phi[i],(p1-p0)[1],(p1-p0)[2],(p1-p0)[3])
> lines3d(
> c(p1[1],cpt[1]+p0[1]+lp*s*sin(theta)*ptb[1]),
> c(p1[2],cpt[2]+p0[2]+lp*s*sin(theta)*ptb[2]),
> c(p1[3],cpt[3]+p0[3]+lp*s*sin(theta)*ptb[3]),
> ...
> )
> }
> return(line)
> }
>
> This creates a line with 'n' arrow barbs at one end, equally spaced
> when you look at the line end-on. The barb length is 's' times the
> length of the line, and the opening angle is theta. Just do arrow3d()
> to get something.
>
> Might be useful, plus I wanted to brush up on my vector geometry anyway...
>
> Barry
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>
>
--
Peter Ehlers
University of Calgary
403.202.3921
More information about the R-help
mailing list