From the docs and based on Slab's behavior, Slice generates incorrect
origins and deltas for regular grids.  I have an example below for those
that don't follow dx-users.

     I propose to change Slice's behavior for regular grids to the
following:


    Slice( field, dim, pos )
    ------------------------

    1. Look for a unique non-zero component in field.deltas[dim]
    2. If found:
       a. Call that index "axis" (0=x, 1=y, 2=z, etc.)
       b. series position = ( origin + pos * deltas[dim] )[ axis ]
       c. origin_new      = ( origin + pos * deltas[dim] ) with
                            'axis' component removed
       d. deltas_new      = deltas with deltas[dim] removed, and
                            'axis' component removed from the remaining deltas
       e. counts_new      = counts with counts[dim] removed
    3. Else
       ?


     If there are no objections, I'll submit a patch early next week.
     
     Any thoughts on the Else?  The Else includes cases like
non-axis-aligned grids (e.g. deltas={[-1,1],[1,1]}), with either orthogonal
or non-orthogonal connections.  If no one cares, we can just leave the
current behavior alone for those cases (though creating spatially
meaningful origins/deltas based on distance measurements might be more
useful).

Randy

P.S.  Why not just ignore Slice and use Slab you ask?  One reason is: 2D
operations on a 3D volume.  For example, Reduce won't let you reduce in
some dimensions but not others (e.g. X&Y, but not Z).
Slice(all)->Reduce->Stack does the job efficiently, except that origin and
deltas are corrupted by Slice.  And you can't use Slab instead in this
pipeline as Stack insists on increasing the dimensionality.

----------------------------------------------------------------------------
EXAMPLE:             y
                    /\
                    ||

                202  * ---- * ---- * ---- *
                     |      |      |      |
                     |      |      |      |
                201  * ---- * ---- * ---- *
                     |      |      |      |
                     |      |      |      |
                200  * ---- * ---- * ---- *
                    100    102    104    106   ==> x

  field = Construct( origin = [ 100,200 ],
                     deltas = { [ 0,1 ], [ 2,0 ] },
                     counts = [ 3,4 ] );

  slice = Slab( field, dimension=0, position=1, thickness=0 );
    --> returns: origin=[100,201], deltas={ [0,1],[2,0] }, counts=[1,4]

  slice = Slice( field, dimension=0, position=1 );
    --> returns      : origin=[200], deltas={ [1] }, counts=[4]
    --> SHOULD RETURN: origin=[100], deltas={ [2] }, counts=[4]

----------------------------------------------------------------------------
    

-- 
Randall Hopper (mailto:[EMAIL PROTECTED])
Lockheed Martin Operation Support
EPA Scientific Visualization Center
US EPA MD/24 ERC-1A; RTP, NC 27711

Reply via email to