rslt ← b (f ##.kcell) p         ⍝ Relationship between point and k-cell.

Supplied  by  Steve Mansour, this operator determines the relationship between a
point and a k-cell. For background, see Steve's paper Arithmetic Boundary Check-
ing →abc←.

For k=1, this is a line segment, (useful for input checking)
    k=2, this is a rectangle, (useful for checking cursor position in a window).
    k=3, this is a rectangular parallelepiped (brick) or cube,
    k=4, this is a hyperbrick or hypercube, etc.

b:  Left  argument (bounds) is a numeric scalar, 2-vector or 2×k matrix; If b is
    a  matrix,  the  rows  represent the extreme points, (e.g. if k=2, the upper
    left  and  lower right hand corners; the columns represent the lower / upper
    bounds in each dimension. Extreme points are indicated in the diagrams below
    by  '⍟'.

p:  Right  argument (points) is any simple numeric array. If the left argument b
    is a scalar or 2-vector, each element of p is compared individually. If b is
    a  matrix, the shape of the first axis of p must equal k--the number of col-
    umns  in  b; each subvector in p represents the coordinates of a point in k-
    space.

┌───────────┬──────────────────────────────┬───────────────────────────────────┐
│f: Operand │    × :  signum product       │    + : signum sum                 │
├───────────┼──────────────────────────────┼───────────────────────────────────┤
│Result:    │       ¯1=Interior            │ Unique -ive or +ive integer       │
│           │        0=Boundary            │ representing a particular region  │
│           │        1=Outside             │ in k-space. 0 always represents   │
│           │                              │ the interior.                     │
├───────────┼──────────────────────────────┼───────────────────────────────────┤
│b=scalar   │      ¯1   0   1              │                                   │
│k=1        │   <-------⍟------->          │       Same as (×)                 │
│Ray        │                              │                                   │
├───────────┼──────────────────────────────┼───────────────────────────────────┤
│b=vector   │                              │                                   │
│k=1        │     1   0  -1   0   1        │      ¯2  ¯1   0   1   2           │
│Line       │ <-------⍟-------⍟------->    │   <-------⍟-------⍟------->       │
│Segment    │                              │                                   │
├───────────┼──────────────────────────────┼───────────────────────────────────┤
│           │                              │   ¯12  ¯11  ¯10   ¯9   ¯8         │
│b=2×2      │                              │                                   │
│matrix     │      0→⍟-----------.      1  │    ¯7  ¯6⍟---¯5----¯4  ¯3         │
│k=2        │        |           |         │          |         |              │
│Rectangle  │        |     -1    |←0       │    ¯2   ¯1    0    1    2         │
│           │        |           |         │          |         |              │
│           │  1     '-----------⍟         │     3    4----5----⍟6   7         │
│           │                              │                                   │
│           │                              │     8    9   10   11   12         │
├───────────┼──────────────────────────────┼───────────────────────────────────┤
│b=2×3      │                              │                                62 │
│matrix     │                              │                6                  │
│k=3        │          __0_________⍟       │       ¯19______↓___1____ ⍟31      │
│Brick      │        /|  ↓        /|       │        /|          ↓    /|        │
│(or cube)  │       /_|__________/ |       │       /_|______________/ |        │
│           │ 1     | |    -1    | |    1  │     ¯25→|     0        | |        │
│           │       | |__________|_|       │       | |______________|_|←29     │
│           │     0→| /          | /       │       | /              | /        │
│           │       ⍟/___________|/        │    ¯31⍟/___________↑___|/         │
│           │                ↑             │              ↑    ¯1              │
│           │1               0             │             ¯6                    │
│           │                              │ ¯62                               │
└───────────┴──────────────────────────────┴───────────────────────────────────┘

Examples:

    3 ×kcell 1 2 3 4 5                      ⍝ Single Point Boundary (scalar).
¯1 ¯1 0 1 1

    2 4 ×kcell 1 2 3 4 5                    ⍝ Upper and Lower Bounds (2-vector).
1 0 ¯1 0 1
                                            ⍝ Differentiate between regions
    2 4 +kcell 1 2 3 4 5                    ⍝ (signum sum).
¯2 ¯1 0 1 2
                                            ⍝ Upper left and lower right hand
    b←↑(3 2)(5 6)                           ⍝ corners of a rectangle.

                                            ⍝ Various points in the plane
    p←⍉↑(6 8)(5 2)(4 4)(7 6)(3 5)(2 3)      ⍝  (2-space).

                                            ⍝ Positions: outside, boundary, int-
    b ×kcell p                              ⍝ erior, outside, boundary, outside.
1 0 ¯1 1 0 1
                                            ⍝ Positions: Below right, corner,
    b +kcell p                              ⍝ interior, below, edge, above.
12 4 0 11 ¯5 ¯10

    b3←2 3⍴0 0 0 10 10 10                   ⍝ Coordinates of a cube.

    b3 ×kcell ⍉↑(5 5 5)(11 15 20)(3 8 10)   ⍝ Inside, outside, boundary of cube.
¯1 1 0

    b3 +kcell 0 10 10                       ⍝ Top left rear corner of the cube.
¯19

    b3 +kcell 5 0 0                         ⍝ Bottom Front Edge of the cube.
¯6

    b3 +kcell 5 5 10                        ⍝ Top Face of the cube.
1

    b3 +kcell ⍉↑(0 5 5)(2 3 4)              ⍝ Left Face, Interior of cube.
¯25 0

See also: abc kball

Back to: contents

Back to: Workspaces