Difference between revisions of "GraphTool"

From WeBWorK_wiki
Jump to navigation Jump to search
Line 148: Line 148:
 
has the checker use the one we defined above. </li>
 
has the checker use the one we defined above. </li>
 
</ul></li>
 
</ul></li>
  +
<li>More documentation can be found at: [https://webwork.maa.org/pod/pg/macros/parserGraphTool.html]</li>
 
</ul>
 
</ul>
 
</p>
 
</p>
Line 210: Line 211:
   
 
<ul>
 
<ul>
<li>POD documentation: [https://webwork.maa.org/pod/pg/macros/PGtikz.html PGtikz.pl]</li>
+
<li>POD documentation: [https://webwork.maa.org/pod/pg/macros/parserGraphTool.html]</li>
<li>PG macro: [https://github.com/openwebwork/pg/blob/PG-2.16/macros/PGtikz.pl PGtikz.pl]</li>
 
<!--<li>PG macro: [https://github.com/openwebwork/pg/blob/master/macros/PGtikz.pl PGtikz.pl]</li>-->
 
 
</ul>
 
</ul>

Revision as of 16:50, 21 April 2021

Construction.png This article is under construction. Use the information herein with caution until this message is removed.

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
DOCUMENT();
loadMacros(
  "PGstandard.pl",
  "MathObjects.pl",
  "PGML.pl",
  "parserGraphTool.pl"
);
TEXT(beginproblem());

Initialization: It is important to include the parseGraphTool.pl 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;
    };

    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) &&
            $pointOnCircle->($_->extract(4)));

        # the following gives additional information to the student
        
        push(@errors, "The $nth object graphed is not a " . $correct->[0]->extract(1)),
        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 }
);

Setup:

  • 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]

BEGIN_PGML
Graph the circle given by the following equation.

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

[_]{$gt}
END_PGML

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

[_]{$gt}

inserts the GraphTool.

BEGIN_PGML_SOLUTION
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.
END_PGML_SOLUTION

ENDDOCUMENT();

This is the solution.

Problem Techniques Index


  • POD documentation: [2]