[R] Function to locate points in 3d octants or points on two axes

Petr Savicky savicky at praha1.ff.cuni.cz
Wed Feb 2 09:21:05 CET 2011


On Tue, Feb 01, 2011 at 08:30:22PM -0500, Bryan Hanson wrote:
> [Sorry, resending with a proper subject line!]
> 
> Hi Guru's...
> 
> I have a set of points that may lie along any of the x, y and z axes  
> in a Cartesian coordinate system.  I am hoping that a function exists  
> which will determine if any two selected points are on different axes,  
> i.e, if the one of the points is on x and the other on y or z, not  
> elsewhere on the x axis.  Put another way, I need to determine if the  
> triangle formed by the two points and the origin lies in the xy, xz or  
> yz planes.  This might be as simple as testing if any particular value  
> is zero, i.e. if the x coordinate is zero, then the points must be on  
> the z and y axes and the triangle in the yz plane.  But, I'm looking  
> for a fairly general solution, one that also returns the appropriate  
> plane as the answer.  Very closely related to this, I could use a  
> function that determines which of the 8 octants a point lies in. Seems  
> like the cross product might be part of this, but I'm a little rusty  
> on how to apply it.
> 
> I hope this is clear enough, and someone has a suggestion to point me  
> in the right direction.  Before writing my own klunky version, I  
> thought I'd ask.

Hi.

I think that for suggesting an appropriate solution it may be needed
to know, which data structure is used for the input pairs of points. For
example, it may a single matrix n times 3 with points as rows and a pair
is represented by two indices of the points. Alternatively, the input
may be a single matrix n times 6, where rows are pairs of points.

In any case, the input may be simplified using sign() function. For example

  a <- as.matrix(expand.grid(x=c(-1.1, 0, 1.1), y=c(0, 1.2), z=c(0, 1.3)))
  a

           x   y   z
   [1,] -1.1 0.0 0.0
   [2,]  0.0 0.0 0.0
   [3,]  1.1 0.0 0.0
   [4,] -1.1 1.2 0.0
   [5,]  0.0 1.2 0.0
   [6,]  1.1 1.2 0.0
   [7,] -1.1 0.0 1.3
   [8,]  0.0 0.0 1.3
   [9,]  1.1 0.0 1.3
  [10,] -1.1 1.2 1.3
  [11,]  0.0 1.2 1.3
  [12,]  1.1 1.2 1.3

  sign(a)

         x y z
   [1,] -1 0 0
   [2,]  0 0 0
   [3,]  1 0 0
   [4,] -1 1 0
   [5,]  0 1 0
   [6,]  1 1 0
   [7,] -1 0 1
   [8,]  0 0 1
   [9,]  1 0 1
  [10,] -1 1 1
  [11,]  0 1 1
  [12,]  1 1 1

This output represents a classification of the points into a finite
number of regions and keeps the information needed for any of the
tasks, which you mention.

Hope this helps.

Petr Savicky.



More information about the R-help mailing list