Difference between revisions of "GraphTool"
Jump to navigation
Jump to search
(Correct typo) 

(4 intermediate revisions by 2 users not shown)  
Line 57:  Line 57:  
return 0 if $ans>{isPreview}; 
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. 
# 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 ($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 $point = shift; 

my ($x, $y) = $point>value; 
my ($x, $y) = $point>value; 

Line 74:  Line 74:  
}; 
}; 

−  for (@$student) 

+  # 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++); 
my $nth = Value::List>NameForNumber($count++); 

Line 90:  Line 91:  
# the following gives additional information to the student 
# the following gives additional information to the student 

−  push(@errors, "The $nth object graphed is not a " 
+  push(@errors, "The $nth object graphed is not a circle"), 
next if ($_>extract(1) ne $correct>[0]>extract(1)); 
next if ($_>extract(1) ne $correct>[0]>extract(1)); 

−  push(@errors, "The $nth object graphed should be a " . 
+  push(@errors, "The $nth object graphed should be a " . 
+  $correct>[0]>extract(2) . " circle."), 

next if ($_>extract(2) ne $correct>[0]>extract(2)); 
next if ($_>extract(2) ne $correct>[0]>extract(2)); 

Line 113:  Line 114:  
$gt = GraphTool("{circle, solid, ($h, $k), ($h + $r, $k)}")>with( 
$gt = GraphTool("{circle, solid, ($h, $k), ($h + $r, $k)}")>with( 

−  +  bBox => [11, 11, 11, 11], 

−  +  cmpOptions => { list_checker => $gt_checker } 

); 
); 

</pre> 
</pre> 

Line 132:  Line 133:  
<li>The command <tt>GraphTool</tt> 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: 
<li>The command <tt>GraphTool</tt> 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: 

<ul> 
<ul> 

−  <li>The type of geometric figure (circle, 
+  <li>The type of geometric figure (circle, line, parabola or fill)</li> 
<li>The type of figure (solid or dashed)</li> 
<li>The type of figure (solid or dashed)</li> 

−  <li>Other information about the figure. For example, with the circle, the center and another point on the circle.</li> 
+  <li>Other information about the figure. For example, with the circle, the center and another point on the circle. See [https://webwork.maa.org/pod/pg/macros/parserGraphTool.html#GRAPHOBJECTS Graph Objects] for more details.</li> 
</ul> 
</ul> 

</li> 
</li> 

Line 161:  Line 162:  
Graph the circle given by the following equation. 
Graph the circle given by the following equation. 

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

[_]{$gt} 
[_]{$gt} 
Latest revision as of 18:13, 17 August 2021
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; }; # 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) && $pointOnCircle>($_>extract(4))); # 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 } ); 
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. 
 POD documentation: [2]