Bryan Hanson
2011-Feb-02 01:30 UTC
[R] Function to locate points in 3d octants or points on two axes
[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. Thanks, Bryan **************** Prof. Bryan Hanson Dept of Chemistry & Biochemistry DePauw University 602 S. College Ave Greencastle IN 46135 USA
Petr Savicky
2011-Feb-02 08:21 UTC
[R] Function to locate points in 3d octants or points on two axes
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.