GraphTool
Revision as of 17:47, 21 April 2021 by 141.154.51.251 (talk)
Graph Tool
This example shows how to get student input in the form of a graph (a circle) by using interactive graphing tools.
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:

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. 