   s = Math.min( canvas.width, canvas.height ) * 0.5
   xp = x/s - 1
   yp = y/s - 1
-  xyt = poincare2hyperblic xp, yp
-  if xyt isnt null
-    #inverse transform it...
-    xyt = M.mulv (M.inv observer.tfm), xyt
-    visibleCell = xytFromCell xyt
-    cell = eliminateFinalA appendRewrite(observer.center, node2array(visibleCell)), appendRewrite, tessellation.group.n
-    #console.log showNode cell
-    if cells.get(cell) isnt null
-      cells.remove cell
-    else
-      cells.put cell, 1
-    redraw()
+  try
+    cell = observer.cellFromPoint xp, yp
+  catch e
+    return
+    
+  if cells.get(cell) isnt null
+    cells.remove cell
+  else
+    cells.put cell, 1
+  redraw()
+    
     
 doCanvasClick = (e) ->
   e.preventDefault()

    @viewUpdates = 0
    #precision falls from 1e-16 to 1e-9 in 1000 steps.
    @maxViewUpdatesBeforeCleanup = 500
  

  rebuildAt: (newCenter) ->
    @center = newCenter

    #console.log  "New center at #{showNode newCenter}"
    @rebuildAt @appendRewrite @center, appendArray
        
  draw: (cells, context) ->
    #first borders
    if @drawEmpty
      context.beginPath()
      for cell, i in @cells
        unless cells.get cell
          cellTfm = @cellTransforms[i]
          mtx = M.mul @tfm, cellTfm
          @tessellation.makeCellShapePoincare mtx, context
      context.stroke()

