Inference Group

Search :

Button Dasher

Notes on the new subroutines added to Dasher for button mode

Mon 9/8/04

The core zooming function of regular Dasher involves the following sequence of subroutines[in files shown]

   -> TapOnDisplay [DasherViewSquare]
      -> Tap_on_display[DasherModel]
   -> Render
   -> NewFrame 
With the new button modes, we mimic the above sequence by calling
                                 which calls
   -> PlanGoTo [DasherViewSquare]
       -> PlanGoTo [DasherModel]
   Loop through iSteps{
   -> StepGoTo [DasherViewSquare]
       -> NewGoTo [DasherModel]
   -> Render
   -> Display
   -> FinalGoTo [DasherViewSquare]
       -> NewGoTo [DasherModel]
   -> Render
   -> Display

More notes on static one-button mode

It is important that we exploit the full accuracy of the user's click timing. It is very likely that their accuracy is similar to, or possibly even smaller than, the time between successive renderings of the falling pointer. It's thus essential, I think, that we keep track of the actual TIME of the click event, relative to the last rendering time, in order to get SUPERRESOLUTION of the mousey coordinate.

So the code should look something like this:

set pointer coordinate
render the pointer at y1
note the time t1
decide where the next pointer will be rendered y2, and
estimate the time t2 at which that will happen

IF ( click event happens )
        Note time t at which click event happened
                y = (t-t1) * y2 + (t2-t) * y1
        Initiate zoom in on location y.

                (Special case event handling:
                if t>t2, declare t=t2, before doing the y formula;
                and if a click occurs before we have rendered the first
                pointer at y1=CANVAS_TOP, declare y=CANVAS_TOP)

During a zoom: When the above computation of "y" has occurred, I think it will be very helpful to the user to see visualized on the screen a splat mark that shows WHERE Y WAS. That way, they will learn whether they clicked earlier or later than they intended. I think a good way to do this will be to create a new routine called draw_splat_at_dasher_coordinate_y(dashery) .

The way this will work is: when the zoom is initiated, my GoTo routine, which receives dashery (which has been put through screen2dasher) remembers that dashery value, and, every time it does a Render and Display, it will also Draw a splat object (which should be an object that looks just like the pointer arrow object, except maybe it could have a different colour, like red) at that dashery coordinate (appropriately mapped through dasher2screen). Because a zoom is busy happening, the splat object won't be rendered at the same canvas y coordinate as the click happened - indeed, during the zoom, it will be rendered at a sequency of positions that drift to the CENTRE of the screen, because of the zoom being a zoom-in-on y.

I'd like there to be two objects, a splat object that GoTo knows about and renders, and the regular bouncing pointer, which is not rendered during the zoom event (or else is rendered at CANVAS_TOP during every frame of the zoom), and which is another piece of code's responsiblity. The regular bouncing pointer should be reset to CANVAS_TOP when the zoom event is started.

Wed 11/8/04

Some handwritten notes on Dasher code are here

The Dasher project is supported by the Gatsby Charitable Foundation
David MacKay
Site last modified Fri Oct 1 10:33:28 BST 2010