> -----Oorspronkelijk bericht-----
> Van: [email protected] [mailto:programming-
> [email protected]] Namens Kip Murray
> Verzonden: zondag 11 april 2010 3:39
> Aan: Programming forum
> Onderwerp: Re: [Jprogramming] boxes
>
> Hello, R.E. Boss,
>
> It will probably be Tuesday or Wednesday before I can attempt to
> understqand how
> your verb kfcs works. In the meantime, are you willing to give an
> explanation
> analogous to my explanation below of verb cr?
>
(...)
>
> Kip
>
Reason I prefer to explain kfcs is I like the shape of the output.
I made up the explanation after I constructed the solution.
Suppose C=: 10 20 30 40 ,: 1 2 3 4 is the origin (or original vertex) and
the diagonal (vector) of a 4D cube.
Question is how to generate, say, the 2-faces of that cube.
Let the coordinates be (x,y,z,w).
It is obvious that the diagonal of a face (of the cube) is the projection of
the (main) diagonal.
So on a plane (z,w) = constant the diagonal is 1 2 0 0.
The values these constant can take are one of (z,w) = 30 40, 30 44, 33 40
and 33 44.
So these 2-faces can be represented by
10 20 30 40
1 2 0 0
10 20 30 44
1 2 0 0
10 20 33 40
1 2 0 0
10 20 33 44
1 2 0 0
So the general rule which can be derived from this is:
A. make the projections of the diagonal on all 2-faces
B. determine the origins of all 2-faces with such a projected diagonal.
A.
For a 2-face, we need 2 non-zeroes so first generate these:
[d1=:({:C) *"1 (#~ 2 = +/"1 ) t=. #:i.2^{:$ C
0 0 3 4
0 2 0 4
0 2 3 0
1 0 0 4
1 0 3 0
1 2 0 0
These are all the diagonals in the 2-faces.
B.
For each diagonal we get the origins by adding to {.C zero or more of the
coordinates of the diagonal which have become 0 in the projection:
{: r1=: ({.C) +"1 ({:C) *"1 t ([ #~ 0 = [ +/@:*"(1) 0~:])"_ 1 d1
10 20 30 40
10 20 30 44
10 20 33 40
10 20 33 44
A. and B. together give the required result:
{: r1 ,:"1"_1 d1
10 20 30 40
1 2 0 0
10 20 30 44
1 2 0 0
10 20 33 40
1 2 0 0
10 20 33 44
1 2 0 0
Bringing this all together and smoothing things up a bit gives
kfcs=: 3 : 0
(i.>:{:$y) <@kfcs"0 _ y
:
t1=. (#~ x = +/"1 ) t=. #:i.2 ^ {:$y
t2=. ({.y) +"1 ({:y) *"1 t1 (] #~ 0 = +/@:*"1)"1 _ t
t2 ,:"1"_1 ({:y) *"1 t1
)
which differs slightly from the original kfcs.
R.E. Boss
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm