From WeBWorK_wiki
Revision as of 17:40, 28 April 2021 by (talk)
Jump to navigation Jump to search

Graph Tool

This example shows how to get student input in the form of a graph (a circle) by using interactive graphing tools.

Problem Techniques Index

PG problem file Explanation

Initialization: It is important to include the macro.

## this is the answer checker for the graph tool

# This grader allows the student to graph the correct circle multiple 
# times.  The idea is that the graph is graded based on appearance.  
# No matter how many times the student graphs the correct circle, 
# the resulting graph appears the same.

$gt_checker = sub {
    my ($correct, $student, $ans, $value) = @_;
    return 0 if $ans->{isPreview};

    my $score = 0;
    my @errors;
    my $count = 1;

    # Get the center and point that define the correct circle and 
    # compute the square of the radius.

    my ($cx, $cy) = $correct->[0]->extract(3)->value;
    my ($px, $py) = $correct->[0]->extract(4)->value;
    my $r_squared = ($cx - $px) ** 2 + ($cy - $py) ** 2;

    my $pointOnCircle = sub {
        my $point = shift;
        my ($x, $y) = $point->value;
        return ($x - $cx) ** 2 + ($y - $cy) ** 2  == $r_squared;

    # Iterate through the objects the student graphed and check to
    # see if each is the correct circle.
    for (@$student)
        my $nth = Value::List->NameForNumber($count++);
        # this checks if the student input matches the circle, type
        # (solid or dashed), the center of the circle and
        # checks if a point is on the circle. 

        $score += 1, next
        if ($_->extract(1) eq $correct->[0]->extract(1) &&
            $_->extract(2) eq $correct->[0]->extract(2) &&
            $_->extract(3) == $correct->[0]->extract(3) &&

        # the following gives additional information to the student
        push(@errors, "The $nth object graphed is not a circle"
        next if ($_->extract(1) ne $correct->[0]->extract(1));

        push(@errors, "The $nth object graphed should be a " .
                      $correct->[0]->extract(2) . " circle."),
        next if ($_->extract(2) ne $correct->[0]->extract(2));

        push(@errors, "The $nth object graphed is incorrect.");

    return ($score, @errors);

$h = non_zero_random(-5, 5);
$k = non_zero_random(-5, 5);
$r = random(1, 4);

Context()->variables->add("y" => "Real");
$circle_eq_lhs = Formula("(x-$h)^2 + (y-$k)^2")->reduce;

$gt = GraphTool("{circle, solid, ($h, $k), ($h + $r, $k)}")->with(
    bBox => [-11, 11, 11, -11],
    cmpOptions => { list_checker => $gt_checker }


  • The subroutine
    at the top is the answer checker. It checks if the student input matches the correct answer.
  • The variables $h, $k and $r randomly pick a center and radius of the circle.
  • The lines:
    Context()->variables->add("y" => "Real");
    $circle_eq_lhs = Formula("(x-$h)^2 + (y-$k)^2")->reduce;
    are used to print out nicely the equation of the circle.
  • The command GraphTool creates the graph tool (the axes and input buttons for the various types of graphs). The first argument is a string surrounded by {}. The arguments are:
    • The type of geometric figure (circle, lines, parabolas or fills)
    • The type of figure (solid or dashed)
    • Other information about the figure. For example, with the circle, the center and another point on the circle.
  • Other parameters of the GraphTool can be set using with. The following include other features:
    • bbox: this is an array reference of four values xmin, ymin, xmax, ymax indicating the lower left and upper right corners of the plot.
    • cmpOptions: this is a hash of options passed to the cmp method for checking the answer. The example here:
      cmpOptions => { list_checker => $gt_checker }
      has the checker use the one we defined above.
  • More documentation can be found at: [1]

Graph the circle given by the following equation.

    [`[$circle_eq_lhs] = [$r ** 2]`]


Main Text: This asks to graph the circle given by the equation. And the code:


inserts the GraphTool.

The equation of the circle of the form:

[`[$circle_eq_lhs] = [$r ** 2]`]

has a center at [`([$h],[$k])`] and radius [$r].   To enter the graph, click the circle tool, then click the center at [`([$h],[$k])`] and then click a second point that is [$r] units from the center.  This is easist going left, right, up or down from the center.


This is the solution.

Problem Techniques Index

  • POD documentation: [2]