anchor.diff:  ;; a 40.00, b 7.00, h 40.00, steps 3200, dt 0.181
   ;; a 59.00, b 4.27, h 35.22, steps 3200, dt 1.536
   ;; a 30.00, b 2.45, h 23.00, steps 2000, dt 1.300
  +;; a 30.00, b 5.00, h 39.00, steps 1230, dt=pi/dt, dt >= 30
   
   (define-widget spirograph-drawer (QWidget)
     ((steps :initform 2000)
  
positive.code:         (b-inner (q+:make-qhboxlayout))
          (h-inner (q+:make-qhboxlayout))
          (steps-inner (q+:make-qhboxlayout))
          (dt-inner (q+:make-qhboxlayout)))
      
      ;; Populate the horizontal layouts and add them to the top level vertical layout
      (q+:add-widget a-inner (q+:make-qlabel "A: " spirograph-controls))
  
negative.code: 
    ;; Set max-radius to an estimate on the max radius of the curve, given the current values of a, b, and h.
    ;; Multiply by 1.1 to give a bit of empty space around the sides.
    (let ((max-radius (* 1.1 (+ a-val b-val h-val)))
          (rdt (if (eql dt-type :normal)
                   dt
                   (/ pi dt))))
      ;; Define some local functions for convenience
      (flet (
             ;; xmapper maps logical x coordinates in the range x-min to x-max to screen coordinates in the range 0 to width
  