Hello all, I am working with data on tree crowns, and this data describes points (verticies) around the polyhedron of the crown volume (think of the crown as a single volume with vertices and faces). I can calculate maximum z distance between any 2 points (maximum depth) and maximum x/y distance (maximum width). These are useful metrics. I would also like to quantify an "average" width of the polygon in 2D space (x/y only), as well as a metric that would describe the "eccentricity" of the polygon. But, I'm not sure how to go about doing that. In general, I've made the polyhedrons and polygons into convex shapes. I have considered getting a centroid, intersecting lines every 10 degrees (for example) going through the centroid with the x/y polygon owin in spatstat, and then analyzing those line lengths. But, I'm not sure that's the right way to go, and maybe there are already tools out there to do this. Any thoughts anyone might have would be very welcome! Thanks, Allie library(rgl) library(spatstat) library(geometry) x = c(1.9,-1.4,1.5,1.8,2.2,0.2,0.6,-0.9,-3.7,1.3,-1.9,-3.4,3.7,2.1,-2.0,-1.9) y = c(-3.1,3.0,1.1,-1.3,1.0,0.0,1.4,1.6,2.3,-3.6,-1.5,-1.3,0.3,-2.1,0.2,-0.3) z = c(5.5,4.5,4.3,4.8,6.7,5.8,7.4,6.2,3.5,2.9,4.0,3.7,3.2,3.0,3.1,8.4) depth = max(z) - min(z) width_max = max(dist(matrix(c(x,y),ncol=2))) xy_win = owin(poly=list(x=x,y=y)) conv_win = convexhull(xy_win) # from here, maybe draw lines every 10 degrees through a centroid? # avg_width = ?? # eccentricity = ?? # 3D plot of crown polyhedron (convex) ps = data.frame(x=x,y=y,z=z) crown.surf = t(convhulln(matrix(c(x,y,z),ncol=3))) open3d() rgl.triangles(ps[crown.surf,1],ps[crown.surf,2],ps[crown.surf,3],col=heat.colors(nrow(ps)),alpha=.2) axes3d()
This is not the right list for such substantive questions. I suggest that you check out the "spatial" and perhaps the "Environmetrics" Task views on CRAN and/or post to a statistical site like stats.stackexchange.com or the R-sig-ecology mailing list instead. Cheers, Bert Bert Gunter "Data is not information. Information is not knowledge. And knowledge is certainly not wisdom." -- Clifford Stoll On Fri, Sep 25, 2015 at 7:20 AM, Alexander Shenkin <ashenkin at ufl.edu> wrote:> Hello all, > > I am working with data on tree crowns, and this data describes points > (verticies) around the polyhedron of the crown volume (think of the crown as > a single volume with vertices and faces). I can calculate maximum z > distance between any 2 points (maximum depth) and maximum x/y distance > (maximum width). These are useful metrics. I would also like to quantify > an "average" width of the polygon in 2D space (x/y only), as well as a > metric that would describe the "eccentricity" of the polygon. But, I'm not > sure how to go about doing that. > > In general, I've made the polyhedrons and polygons into convex shapes. > > I have considered getting a centroid, intersecting lines every 10 degrees > (for example) going through the centroid with the x/y polygon owin in > spatstat, and then analyzing those line lengths. But, I'm not sure that's > the right way to go, and maybe there are already tools out there to do this. > Any thoughts anyone might have would be very welcome! > > Thanks, > Allie > > > library(rgl) > library(spatstat) > library(geometry) > > x > c(1.9,-1.4,1.5,1.8,2.2,0.2,0.6,-0.9,-3.7,1.3,-1.9,-3.4,3.7,2.1,-2.0,-1.9) > y > c(-3.1,3.0,1.1,-1.3,1.0,0.0,1.4,1.6,2.3,-3.6,-1.5,-1.3,0.3,-2.1,0.2,-0.3) > z = c(5.5,4.5,4.3,4.8,6.7,5.8,7.4,6.2,3.5,2.9,4.0,3.7,3.2,3.0,3.1,8.4) > depth = max(z) - min(z) > width_max = max(dist(matrix(c(x,y),ncol=2))) > > xy_win = owin(poly=list(x=x,y=y)) > conv_win = convexhull(xy_win) > # from here, maybe draw lines every 10 degrees through a centroid? > # avg_width = ?? > # eccentricity = ?? > > # 3D plot of crown polyhedron (convex) > ps = data.frame(x=x,y=y,z=z) > crown.surf = t(convhulln(matrix(c(x,y,z),ncol=3))) > open3d() > rgl.triangles(ps[crown.surf,1],ps[crown.surf,2],ps[crown.surf,3],col=heat.colors(nrow(ps)),alpha=.2) > axes3d() > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > 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.
On Sep 25, 2015, at 7:20 AM, Alexander Shenkin wrote:> Hello all, > > I am working with data on tree crowns, and this data describes points (verticies) around the polyhedron of the crown volume (think of the crown as a single volume with vertices and faces). I can calculate maximum z distance between any 2 points (maximum depth) and maximum x/y distance (maximum width). These are useful metrics. I would also like to quantify an "average" width of the polygon in 2D space (x/y only), as well as a metric that would describe the "eccentricity" of the polygon. But, I'm not sure how to go about doing that. > > In general, I've made the polyhedrons and polygons into convex shapes. > > I have considered getting a centroid, intersecting lines every 10 degrees (for example) going through the centroid with the x/y polygon owin in spatstat, and then analyzing those line lengths. But, I'm not sure that's the right way to go, and maybe there are already tools out there to do this. Any thoughts anyone might have would be very welcome!Frank Harrell does something similar in his rms/Hmisc pkg-duo. I cannot remember which of those tow packages contains the `perimeter` function, but take a look at its approach. It is multi-dimensional. I think either that function or the associated plotting functions (mostly based on the lattice paradigm) must be projecting the boundaries it defines onto 2D regions of the highest densities of points. Best; David.> > Thanks, > Allie > > > library(rgl) > library(spatstat) > library(geometry) > > x = c(1.9,-1.4,1.5,1.8,2.2,0.2,0.6,-0.9,-3.7,1.3,-1.9,-3.4,3.7,2.1,-2.0,-1.9) > y = c(-3.1,3.0,1.1,-1.3,1.0,0.0,1.4,1.6,2.3,-3.6,-1.5,-1.3,0.3,-2.1,0.2,-0.3) > z = c(5.5,4.5,4.3,4.8,6.7,5.8,7.4,6.2,3.5,2.9,4.0,3.7,3.2,3.0,3.1,8.4) > depth = max(z) - min(z) > width_max = max(dist(matrix(c(x,y),ncol=2))) > > xy_win = owin(poly=list(x=x,y=y)) > conv_win = convexhull(xy_win) > # from here, maybe draw lines every 10 degrees through a centroid? > # avg_width = ?? > # eccentricity = ?? > > # 3D plot of crown polyhedron (convex) > ps = data.frame(x=x,y=y,z=z) > crown.surf = t(convhulln(matrix(c(x,y,z),ncol=3))) > open3d() > rgl.triangles(ps[crown.surf,1],ps[crown.surf,2],ps[crown.surf,3],col=heat.colors(nrow(ps)),alpha=.2) > axes3d() > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > 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.David Winsemius Alameda, CA, USA