Gesture-Simple

 view release on metacpan or  search on metacpan

bin/demo.pl  view on Meta::CPAN

        my ($x, $y) = @$point;

        my $rect = SDL::Rect->new(
            -height => 1,
            -width  => 1,
            -x      => $x,
            -y      => $y,
        );

        my $green = SDL::Color->new(
            -r => 0,
            -g => 0xFF,
            -b => 0,
        );

        $self->app->fill($rect, $green);
    }

    my $screen_rect = SDL::Rect->new(
        -height => $self->height,
        -width  => $self->width,
        -x      => 0,
        -y      => 0,
    );

    $self->app->update($screen_rect);
}

sub is_gesturing {
    my $self = shift;
    $self->{is_gesturing};
}

sub begin_gesture {
    my $self = shift;

    # update state
    $self->{gesture} = [];
    $self->{is_gesturing} = 1;
    delete $self->{best_match};
    delete $self->{centroid};
    delete $self->{latest_gesture};

    # clear screen
    my $screen_rect = SDL::Rect->new(
        -height => $self->height,
        -width  => $self->width,
        -x      => 0,
        -y      => 0,
    );

    my $black = SDL::Color->new(
        -r => 0,
        -g => 0,
        -b => 0,
    );

    $self->app->fill($screen_rect, $black);
}

sub update_gesture {
    my $self = shift;
    return unless $self->is_gesturing;

    # add the current point to our list of points for this gesture
    push @{ $self->{gesture} }, [@_];
}

sub end_gesture {
    my $self = shift;

    $self->{is_gesturing} = 0;

    my $gesture = $self->{gesture};

    $self->{latest_gesture} = Gesture::Simple::Gesture->new(points => $self->{gesture});

    if ($self->{gesture_recognizer}->has_templates) {
        $self->{best_match} = $self->{gesture_recognizer}->match($gesture);
    }
    else {
        delete $self->{best_match};
    }

    if ($self->{best_match}) {
        printf "Best match: %s (%.2f)\n",
            $self->{best_match}->name,
            $self->{best_match}->score;
    }

    if (!$self->{best_match} || $self->{best_match}->score < 75) {
        my $name = "G" . (@{ $self->{gesture_recognizer}->templates } + 1);
        my $template = Gesture::Simple::Template->new(
            points => $self->{latest_gesture}->points,
            name   => $name,
        );

        print "Adding as $name.\n";

        $self->{gesture_recognizer}->add_template($template);
    }
}

sub post_init_handler {
    my $self = shift;

    $self->{gesture_recognizer} = Gesture::Simple->new;

    $self->add_event_handler(SDL_KEYDOWN, SDLK_q, sub {
        my $self = shift;
        $self->quit;
    });

    $self->add_event_handler(SDL_MOUSEBUTTONDOWN, BUTTON_MOUSE_LEFT, sub {
        my $self = shift;
        $self->begin_gesture;
    });

    $self->add_event_handler(SDL_MOUSEBUTTONUP, BUTTON_MOUSE_LEFT, sub {
        my $self = shift;
        $self->end_gesture;



( run in 1.061 second using v1.01-cache-2.11-cpan-140bd7fdf52 )