# Message #1468

From: Roice Nelson <roice3@gmail.com>

Subject: Re: [MC4D] Twists description

Date: Tue, 01 Mar 2011 11:31:21 -0600

Thank you Andrey,

I looked at Don’s MC4D code last night to see that the cutting planes, being

hyperplanes of dimension 3, don’t need any extra orientation information

(I’m sure I knew this in the past and forgot). It is confusing because we

are using the term "plane" in multiple ways, and for constructs of different

dimensions. But my mental image of "rotation plane" is the same as yours.

I take the term to refer to the 2D space of a simple rotation, and prefer

language like "rotates through the rotation plane" and "rotates about the

rotation multi-axis".

The examples you’ve made were the perfect response and don’t look nearly as

scary as I imagined, so that’s great. My only worry is requiring the axes

and rotation plane sets to be generated in a certain way, but that looks to

be the nature of the problem if we don’t want to list them all out while

still caring about referencing them by an index. Your code block is part of

the spec though, and each program will have to implement it *exactly* the

same.

If I’m reading your example right, the orientation of the hypercube in the

3^4 puzzle description is determined by the "Vertices" entry in combination

with the generators. I guess it will be the same for other polytopes, and

more complicated uniform polytopes will have multiple vertices listed there

(e.g. the truncated

tesseract<http://en.wikipedia.org/wiki/Truncated_tesseract> would

have 3). (I’m unsure of everything in this paragraph.)

Though your examples were likely not intended as the final format, a

nitpicky comment is that I’d prefer the header to be a little more

structured, in that it didn’t rely on spaces so much for formatting. Commas

between vector components would improve things. Maybe the subject should at

least be raised of whether XML might be good, though I think I’d vote to

keep things text.

Thanks again for figuring all this out.

Roice

On Tue, Mar 1, 2011 at 1:46 AM, Andrey <andreyastrelin@yahoo.com> wrote:

> Hi guys,

> I’m a little confused about the term "rotation plane". What does it mean?

> If we have elementary twist in R^D, then there are two invariant spaces:

> First one is D-2 dimensional and vectors from it are not affected by the

> twist (they are eigenvectors with eigenvalues 1), and the second is

> two-dimensional and the twist rotates it like the regular 2D plane. In 4D

> they both have 2 dimensions. I think that the term "rotation plane" fits

> better to the second (2D) space, and "rotation multi-axis" I’ve used for the

> first space.

> Let us have 4D body that is cut by a set of hyperplanes (yes, they are 3D,

> and we don’t need anything more than normal direction and distance from the

> center to define it). We have to decribe the set of axes (normals to

> hyperplanes) and set of possible rotation planes perpendicular to each axis.

> And we don’t want the complete list of them.

> I see an algorithmic way of the enumeration.

> We have from 1 to 4 families of axes for our puzzle. Take one axis from

> each family and some set of body movements - generators of the symmetry

> group. If we don’t consider "alternated" bodies, then generators can be

> taken from mirror reflections - they have the simplest description (one

> vector).

> For example, for the tesseract family we have

> Axes={(0,0,0,1),(0,0,1,1),(0,1,1,1),(1,1,1,1)}

> Movements={(1,0,0,0),(-1,1,0,0),(0,-1,1,0),(0,0,-1,1)}

> They are edges and faces of the fundamental area, but I’m not sure that it

> will always be the case (we should check what happens for simplex,

> bitruncated simplex, bitruncated 24-cell and for duoprisms with n=k and

> n!=k).

> To generate and enumerate the complete set of axes use the function:

>

> int p=0,q=Axes.Length;

> for(i=0;i<q;i++) A[i]=Axes[i];

> while(p!=q){

> foreach(Movement M in Movements){

> Vector V=M.ApplyTo(A[p]);

> for(i=0;i<q;i++) if(AxesEqual(V,A[i])) break;

> if(i==q) A[q++]=V;

> }

> }

>

> The same is for twists: for each axis we decribe generators of the set of

> possible rotational planes (give them as pairs of vectors, describing half

> of the smallest twist - and we’ll have the order of twists group for this

> plane for free). We don’t need to decribe movements to generate complete

> twists set - rotation planes give it to themself.

>

> So the complete description for tesseract family will be:

>

> Movements: 1 0 0 0 ; -1 1 0 0 ; 0 -1 1 0 ; 0 0 -1 1

> Vector: 1 0 0 0

> Planes: 0 1 0 0 , 0 1 1 0 ; 0 1 -1 0 , 0 1 0 -1 ; 0 1 0 0 , 0 1 1 1

> Vector: 1 1 0 0

> Planes: 0 0 1 0 , 0 0 1 1 ; 1 -1 0 0 , 0 0 1 0 ; 1 -1 0 0 , 0 0 1 1

> Vector: 1 1 1 0

> Planes: 1 -1 0 0 , 1 0 -1 0 ; 0 0 0 1 , 1 -1 0 0

> Vector: 1 1 1 1

> Planes: 1 -1 0 0 , 1 0 -1 0 ; 1 -1 0 0 , 1 1 -1 -1

>

> And if you add some more lines, you can get the complete description of the

> puzzle (assuming that the body is convex and the painting is "one color per

> one cell"):

>

> Dimensions: 4

> Movements: 1 0 0 0 ; -1 1 0 0 ; 0 -1 1 0 ; 0 0 -1 1

> Vertices: 1 1 1 1

> Alternated: No

> Vector: 1 0 0 0

> Planes: 0 1 0 0 , 0 1 1 0 ; 0 1 -1 0 , 0 1 0 -1 ; 0 1 0 0 , 0 1 1 1

> Cuts: 0.333333 ; -0.333333

> Vector: 1 1 1 1

> Planes: 1 -1 0 0 , 1 0 -1 0 ; 1 -1 0 0 , 1 1 -1 -1

> Cuts: 0

>

>

> It’s a cube 3^4 with 8 additional diagonal cuttings :)

>

> Meaning of vectors:

>

> When you apply the rotation defined by vectors A, B to the vector C, result

> will be:

> Rot[A,B](C) = Symm[B](Symm[A](C)),

> where Symm[A](C)=2*A*(A,C)/(A,A)-C .

>

> Reflection of the vector in the plane

> Refl[A](C)=-Symm[A](C) .

>

> Now, when rotation plane description includes minimal twist angle, I think

> tat we may return to single number description of angle - write there one

> integer number.

>

> Description of 5^7:

>

> Dimensions: 7

> Movements: 1 0 0 0 0 0 0 ; -1 1 0 0 0 0 0; 0 -1 1 0 0 0 0; 0 0 -1 1 0 0 0 ;

> 0 0 0 -1 1 0 0 ; 0 0 0 0 -1 1 0 ; 0 0 0 0 0 -1 1

> Vertices: 1 1 1 1 1 1 1

> Alternated: No

> Vector: 1 0 0 0 0 0 0

> Planes: 0 1 0 0 0 0 0 , 0 1 1 0 0 0 0 ; 0 1 0 0 0 0 0 , 0 1 0 1 0 0 0 ; 0 1

> 0 0 0 0 0 , 0 1 0 0 1 0 0 ; 0 1 0 0 0 0 0 , 0 1 0 0 0 1 0 ; 0 1 0 0 0 0 0 ,

> 0 1 0 0 0 0 1

> Cuts: 0.6 ; 0.2 ; -0.2 ; -0.6

>

> Sticker-oriented programs (like MC4D) will have some way of finding

> correspondence between stickers and twists. To do that it may apply twist to

> all cell centers (2D, 1D and 0D) and find the fixed point. If no fixed

> points is found then the twist can’t be described as sticker-defined. If for

> some sticker there is no twists in the set, then something is wrong with our

> mathematics :)

>

> All this doesn’t include Andy’s "2D twists". But they may be described as

> intersections of layers with different cutting planes and same rotational

> planes. And we can write them in log like {5:3:8|1:4:1}:1 .

> Numbers in braces are axis, rotation plane and mask for different

> directions of cutting planes. Angle is the same. Direction of twist is

> defined by the first group (different groups may give different orientations

> of the canonical twist).

>

> Andrey

>

>