[R] how to derive true surface area from `computeContour3d' (misc3d package)

j. van den hoff veedeehjay at googlemail.com
Fri Nov 8 12:49:14 CET 2013


I want to compute the total surface area of an isosurface in 3D space as  
approximated with
`computeContour3d' by adding up the areas of the triangles making up the
contour surface.

problem:
the vertex matrix returned by `computeContour3d' in general seems to  
provide the vertices
not in the frame of reference in which the original data are given but  
apparently rather
after some linear transformation (scaling + translation (+ rotation?) -- or
I am having some fundamental misconception of what is going on.

I'm interested in the simplest case where the input data are provided as a  
3D array
on an equidistant grid (i.e. leaving the x,y,z arguments at their  
defaults).

e.g. (slight modification of `example(computeContour3d)'):

library(misc3d)
x <- seq(-1,1,len=11)
g <- expand.grid(x = x, y = x, z = x)
v <- array(g$x^4 + g$y^4 + g$z^4, rep(length(x),3))
con <- computeContour3d(v, max(v), 1)
drawScene(makeTriangles(con))

this is (approximately) a cube with edge length 10 (taking the grid  
spacing as the unit of length).
so the expected (approximate) surface area is 600.

indeed,

apply(con, 2, range) yields

      [,1] [,2] [,3]
[1,]    1    1    1
[2,]   11   11   11

which might be interpreted as providing the vertices in coordinates
where the grid spacing is used as unit of length. however
I get an area of only about 430 instead of approx. 600 which is already a  
much much larger deviation
 from the ideal cube surface than I would have expected given the small  
amount of smoothing at the
box edges and corners (but I have to double-check whether my triangle area  
computation is right, although I believe it is).

choosing instead

x <- seq(-2,2,len=50)

however, the corresponding range of `con' is

       [,1]   [,2]   [,3]
[1,] 13.274 13.274 13.274
[2,] 37.726 37.726 37.726

which cannot be the "grid coordinates" (which should be in the range  
[1,50]). adopting this interpretation nevertheless
(vertices are given in grid coordinates)
the sum of the triangle areas only amounts to about 2600 instead of the  
expected approx. 49^2*6 = 14406

question 1:
am I making a stupid error (if so which one...)?

if not so:

question 2:
is there a linear transformation from the original grid coordinates (with  
range from 1 to dim(v)[n], n=1:3)
involved which yields the reported vertex coordinates?

question 3:
could someone please explain where to find this information (even if  
hidden in the source code of the package)
how to convert the vertex coordinates as delivered by `computeContour3D'  
to 'grid coordinates' (or true world coordinates
in general (if the x,y,z arguments are specified, too)?

for the wishlist: it would of course be nice if `computeContour3d' would  
indeed return the total surface area itself,
e.g. as an attribute of the triangles matrix.

for the devs: there is a typo in the manpage of this function:
Value:

      A matrix of three columns representing the triangles making up the
      contour surface. Each row represents a vertex and goups of three
      rows represent a triangle.

(should be `groups' instead of `goups')

--



More information about the R-help mailing list