code: def strike_dip(self, degrees=True):
          
          n = self.axes[2]
          r = N.linalg.norm(n)
          strike = N.degrees(N.arctan2(n[0],n[1]))-90
          dip = N.degrees(N.arccos(n[2]/r))
  
          # Since PCA errors are not pinned to the XYZ plane,
          # we need to make sure our results are in the
          # right quadrant.
          if dip > 90:
              dip = 180 - dip
              strike += 180
  
          # Proper azimuth notation
          if strike < 0:
              strike += 360
  
          return strike, dip
docs: Computes strike and dip from a normal vector.
          Results are usually the same as LLSQ
          in strike (to a few decimal places) and close in dip.
          Sometimes, dips are greater by as much as 45 degrees,
          reflecting inclusion of errors in x-y plane.