Learn R Programming

pcds (version 0.1.8)

in.tetrahedron: Check whether a point is inside a tetrahedron

Description

Checks if the point p lies in the tetrahedron, th, using the barycentric coordinates, generally denoted as \((\alpha,\beta,\gamma)\). If all (normalized or non-normalized) barycentric coordinates are positive then the point p is inside the tetrahedron, if all are nonnegative with one or more are zero, then p falls on the boundary. If some of the barycentric coordinates are negative, then p falls outside the tetrahedron.

boundary is a logical argument (default=FALSE) to include boundary or not, so if it is TRUE, the function checks if the point, p, lies in the closure of the tetrahedron (i.e., interior and boundary combined) else it checks if p lies in the interior of the tetrahedron.

Usage

in.tetrahedron(p, th, boundary = TRUE)

Value

A list with two elements

in.tetra

A logical output, if the point, p, is inside the tetrahedron, th, it is TRUE, else it is FALSE.

barycentric

The barycentric coordinates of the point p with respect to the tetrahedron, th.

Arguments

p

A 3D point to be checked whether it is inside the tetrahedron or not.

th

A \(4 \times 3\) matrix with each row representing a vertex of the tetrahedron.

boundary

A logical parameter (default=TRUE) to include boundary or not, so if it is TRUE, the function checks if the point, p, lies in the closure of the tetrahedron (i.e., interior and boundary combined); else, it checks if p lies in the interior of the tetrahedron.

Author

Elvan Ceyhan

See Also

in.triangle

Examples

Run this code
# \donttest{
A<-c(0,0,0); B<-c(1,0,0); C<-c(1/2,sqrt(3)/2,0);
D<-c(1/2,sqrt(3)/6,sqrt(6)/3); P<-c(.1,.1,.1)
tetra<-rbind(A,B,C,D)

in.tetrahedron(P,tetra,boundary = FALSE)

in.tetrahedron(C,tetra)
in.tetrahedron(C,tetra,boundary = FALSE)

n1<-5; n2<-5; n<-n1+n2
Xp<-rbind(cbind(runif(n1),runif(n1,0,sqrt(3)/2),runif(n1,0,sqrt(6)/3)),
          runif.tetra(n2,tetra)$g)

in.tetra<-vector()
for (i in 1:n)
{in.tetra<-c(in.tetra,in.tetrahedron(Xp[i,],tetra,boundary = TRUE)$in.tetra) }

in.tetra
dat.tet<-Xp[in.tetra,]
if (is.vector(dat.tet)) {dat.tet<-matrix(dat.tet,nrow=1)}

Xlim<-range(tetra[,1],Xp[,1])
Ylim<-range(tetra[,2],Xp[,2])
Zlim<-range(tetra[,3],Xp[,3])
xd<-Xlim[2]-Xlim[1]
yd<-Ylim[2]-Ylim[1]
zd<-Zlim[2]-Zlim[1]

plot3D::scatter3D(Xp[,1],Xp[,2],Xp[,3], phi=40,theta=40,
bty = "g", pch = 20, cex = 1,
ticktype="detailed",xlim=Xlim+xd*c(-.05,.05),
ylim=Ylim+yd*c(-.05,.05),zlim=Zlim+zd*c(-.05,.05))
#add the vertices of the tetrahedron
plot3D::points3D(tetra[,1],tetra[,2],tetra[,3], add=TRUE)
plot3D::points3D(dat.tet[,1],dat.tet[,2],dat.tet[,3],pch=4, add=TRUE)
L<-rbind(A,A,A,B,B,C); R<-rbind(B,C,D,C,D,D)
plot3D::segments3D(L[,1], L[,2], L[,3], R[,1], R[,2],R[,3], add=TRUE,lwd=2)

plot3D::text3D(tetra[,1],tetra[,2],tetra[,3],
labels=c("A","B","C","D"), add=TRUE)

in.tetrahedron(P,tetra) #this works fine
# }

Run the code above in your browser using DataLab