%%HP: T(3)A(D)F(.);
DIR

SFACE  \<<
  SPAR OBJ\-> DROP 0
  \-> xa xb xi ya yb yi theta phi p z h v d
  \<<
    -20 -21 -22 SF CF CF
    RAD
    ya yb FOR J
      J 'Y' STO
      xa xb  FOR I
        I 'X' STO DEPTH 'd' STO
        IFERR EQ \->NUM THEN
          DEPTH d - DROPN 0
        END
        IF DUP TYPE 1 == THEN
          DROP 0
        END
      yi STEP
    xi STEP
    yb ya - ABS 1 +
    xb xa - ABS 1 +
    2 \->LIST
    \->ARRY 'MAT' STO
    { X Y } PURGE
    DEG
    -20 -21 -22 CF SF SF
    TRACE
  \>>
\>>

TRACE  \<<
  SPAR OBJ\-> DROP \->
  xa xb xi ya yb yi theta phi p z h v
  \<<
    0 0 0 0 0 \-> cphi sphi ctheta stheta prv
    \<<
      PICT PURGE
      { # 0d # 0d } PVIEW
      AXIS
      RAD
      theta \pi * 180 / \->NUM DUP
      SIN 'stheta' STO
      COS 'ctheta' STO
      phi \pi * 180 / \->NUM DUP
      SIN 'sphi' STO
      COS 'cphi' STO
      ya yb FOR j
        j cphi * xa ctheta * - h * 65 + 0 RND # 1d *
        63 j NEG sphi * xa stheta * - v * 31 + 0 RND
        MAT 1 j ya - yi * 1 + 2 \->LIST GET
        IF p 0 \=/ THEN
          IF DUP DUP z < p 0 > AND SWAP z > p 0 < AND OR THEN
            DROP z
          END
        END
        + - # 1d * 2 \->LIST 'prv' STO
        1 xa + xb FOR i
          prv j cphi * i ctheta * - h * 65 + 0 RND # 1d *
          63 j NEG sphi * i stheta * - v * 31 + 0 RND
          MAT i xa - xi * 1 + j ya - yi * 1 + 2 \->LIST GET
          IF p 0 \=/ THEN
            IF DUP DUP z < p 0 > AND SWAP z > p 0 < AND OR THEN
              DROP z
            END
          END
          + - # 1d * 2 \->LIST DUP 'prv' STO
          LINE
        xi STEP
      yi STEP
      xa xb FOR i
        ya cphi * i ctheta * - h * 65 + 0 RND # 1d *
        63 ya NEG sphi * i stheta * - v * 31 + 0 RND
        MAT i xa - xi * 1 + 1 2 \->LIST GET
        IF p 0 \=/ THEN
          IF DUP DUP z < p 0 > AND SWAP z > p 0 < AND OR THEN
            DROP z
          END
        END
        + - # 1d * 2 \->LIST 'prv' STO
        1 ya + yb FOR j
          prv j cphi * i ctheta * - h * 65 + 0 RND # 1d * 
          63 j NEG sphi * i stheta * - v * 31 + 0 RND
          MAT i xa - xi * 1 + j ya - yi * 1 + 2 \->LIST GET
          IF p 0 \=/ THEN
            IF DUP DUP z < p 0 > AND SWAP z > p 0 < AND OR THEN
              DROP z
            END
          END
          + - # 1d * 2 \->LIST DUP 'prv' STO
          LINE
        yi STEP
      xi STEP
      DEG
      PICT RCL 'GRPH' STO
      DO
      UNTIL KEY END DROP
    \>>
  \>>
\>>
AXIS  \<<
  SPAR OBJ\-> DROP \->
  xa xb xi ya yb yi theta phi p z h v
  \<<
    DEG
    { # 65d # 32d } DUP DUP
    { # 65d # 0d } LINE
    10 h * theta COS * NEG 65 + 0 RND # 1d *
    63 10 v * theta SIN * NEG 31 + - 0 RND # 1d *
    2 \->LIST LINE
    10 h * phi COS * 65 + 0 RND # 1d *
    63 10 v * phi SIN * NEG 31 + - 0 RND # 1d *
    2 \->LIST LINE
  \>>
\>>

SPAR { -5 5 1 -5 5 1 30 45 0 0 5 3 }

EQ 'Y^2-X^2'

MAT [[ 0 9 16 21 24 25 24 21 16 9 0 ]
 [ -9 0 7 12 15 16 15 12 7 0 -9 ]
 [ -16 -7 0 5 8 9 8 5 0 -7 -16 ]
 [ -21 -12 -5 0 3 4 3 0 -5 -12 -21 ]
 [ -24 -15 -8 -3 0 1 0 -3 -8 -15 -24 ]
 [ -25 -16 -9 -4 -1 0 -1 -4 -9 -16 -25 ]
 [ -24 -15 -8 -3 0 1 0 -3 -8 -15 -24 ]
 [ -21 -12 -5 0 3 4 3 0 -5 -12 -21 ]
 [ -16 -7 0 5 8 9 8 5 0 -7 -16 ]
 [ -9 0 7 12 15 16 15 12 7 0 -9 ]
 [ 0 9 16 21 24 25 24 21 16 9 0 ]]
END
