3d turtle graphics/Phix

Factored out of the main (3D turtle) entry for clarity:

```--
-- demo\rosetta\turtle_projection.e
-- ================================
--
--  3D-specific projection, copied from demo/PGUI/rubik.e
--
enum X, Y, Z

global sequence view_rotations = {}

constant naxes = {{Y,Z},    -- (rotate about the X-axis)
{X,Z},    -- (rotate about the Y-axis)
{X,Y}}    -- (rotate about the Z-axis)

function rotate(sequence points, atom angle, integer axis)
--
-- rotate points by the specified angle about the given axis
--
integer {nx,ny} = naxes[axis]
for i=1 to length(points) do
atom x = points[i][nx],
y = points[i][ny]
points[i][nx] = x*cos_r - y*sin_r
points[i][ny] = y*cos_r + x*sin_r
end for
return points
end function

function projection(sequence points, atom d)
--
-- project points from {0,0,d} onto the perpendicular plane through {0,0,0}
--
for i=1 to length(points) do
atom {x,y,z} = points[i],
denom = (1-z/d)
points[i][X] = x/denom
points[i][Y] = y/denom
end for
return points
end function

global function rotate_and_project(sequence points)
points = deep_copy(points)
for i=1 to length(view_rotations) do
{integer axis, atom angle} = view_rotations[i]
points = rotate(points,angle,axis)
end for
points = projection(points,1000)
return points
end function
```