Arbitrary Axis Algorithm

The arbitrary axis algorithm is used by AutoCAD internally to implement the arbitrary but consistent generation of object coordinate systems for all entities that use object coordinates.

*Z* axis
of a coordinate system, the arbitrary axis algorithm generates a
corresponding *X* axis for the coordinate
system. The *Y* axis follows by application of
the right-hand rule.

*Z* axis (also called the
*normal vector*). If it is close to the
positive or negative world *Z* axis, cross the
world *Y* axis with the given *Z* axis to arrive at the arbitrary *X* axis. If it is not close, cross the world *Z* axis with the given *Z* axis to
arrive at the arbitrary *X* axis. The boundary
at which the decision is made was chosen to be both inexpensive to
calculate and completely portable across machines. This is achieved
by having a sort of “square” polar cap, the bounds of which are
1/64, which is precisely specifiable in six decimal-fraction digits
and in six binary-fraction bits.

The algorithm does the following (all vectors are assumed to be in 3D space and specified in the world coordinate system):

Let the given normal vector be called N.

Let the world Y axis be called Wy, which is always (0,1,0).

Let the world Z axis be called Wz, which is always (0,0,1).

*X* and *Y* axes to go with the normal *N*.
They will be called *Ax* and *Ay*. *N* could also be called
*Az* (the arbitrary *Z*
axis) as follows:

If (abs (Nx) < 1/64) and (abs (Ny) < 1/64) then

Ax = Wy X N (where “X” is the cross-product operator).

Otherwise,

Ax = Wz X N.

Scale Ax to unit length.

The method of getting the Ay vector is as follows:

Ay = N X Ax. Scale Ay to unit length.