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.

Given a unit-length vector to be used as the *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.

The method is to examine the given *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).

Here we are looking for the arbitrary *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.