class_docstr: Virtual Trackball Control.
  
  >>> ball = Arcball()
  >>> ball = Arcball(initial=numpy.identity(4))
  >>> ball.place([320, 320], 320)
  >>> ball.down([500, 250])
  >>> ball.drag([475, 275])
  >>> R = ball.matrix()
  >>> numpy.allclose(numpy.sum(R), 3.90583455)
  True
  >>> ball = Arcball(initial=[1, 0, 0, 0])
  >>> ball.place([320, 320], 320)
  >>> ball.setaxes([1, 1, 0], [-1, 1, 0])
  >>> ball.constrain = True
  >>> ball.down([400, 200])
  >>> ball.drag([200, 400])
  >>> R = ball.matrix()
  >>> numpy.allclose(numpy.sum(R), 0.2055924)
  True
  >>> ball.next()
docstr: Update current cursor window coordinates.
docstr_tok: ["Update","current","cursor","window","coordinates","."]
code: def drag(self, point):
      """Update current cursor window coordinates."""
      vnow = arcball_map_to_sphere(point, self._center, self._radius)
      if self._axis is not None:
          vnow = arcball_constrain_to_axis(vnow, self._axis)
      self._qpre = self._qnow
      t = numpy.cross(self._vdown, vnow)
      if numpy.dot(t, t) < _EPS:
          self._qnow = self._qdown
      else:
          q = [numpy.dot(self._vdown, vnow), t[0], t[1], t[2]]
          self._qnow = quaternion_multiply(q, self._qdown)
  
imports: import math
  import numpy
label_desc: Use image node_id 7 for calling the Arcball obj's underlying member method code with example usage: obj.drag(point) without return types