[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