GraphTool: Difference between revisions
Jump to navigation
Jump to search
(initial checkin of this page. Not ready) |
No edit summary |
||
Line 48: | Line 48: | ||
<td style="background-color:#ffffdd;border:black 1px dashed;"> | <td style="background-color:#ffffdd;border:black 1px dashed;"> | ||
<pre> | <pre> | ||
$ | ## 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 } | ||
); | ); | ||
</pre> | </pre> | ||
Line 112: | Line 124: | ||
<b>Setup:</b> | <b>Setup:</b> | ||
<ul> | <ul> | ||
<li>The subroutine at the top is the answer checker. It checks if the student input matches the correct answer. </li> | |||
<li>The variables <tt>$h, $k</tt> and <tt>$r</tt> randomly pick a center and radius of the circle.</li> | |||
<li>The lines: | |||
<pre> | |||
Context()->variables->add("y" => "Real"); | |||
$circle_eq_lhs = Formula("(x-$h)^2 + (y-$k)^2")->reduce; | |||
</pre> | |||
are used to print out nicely the equation of the circle. </li> | |||
<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> | |||
<li>The type of geometric figure (circle, lines, parabolas or fills)</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> | |||
</ul> | |||
</li> | |||
<li>Other parameters of the <tt>GraphTool</tt> can be set using <tt>with</tt>. The following include other features: | |||
<ul> | |||
<li><tt>bbox</tt>: this is an array reference of four values <tt>xmin, ymin, xmax, ymax</tt> indicating the lower left and upper right corners of the plot.</li> | |||
<li><tt>cmpOptions</tt>: this is a hash of options passed to the <tt>cmp</tt> method for checking the answer. The example here: | |||
<pre> | |||
cmpOptions => { list_checker => $gt_checker } | |||
</pre> | |||
has the checker use the one we defined above. </li> | |||
</ul></li> | |||
</ul> | </ul> | ||
</p> | </p> | ||
Line 128: | Line 160: | ||
<pre> | <pre> | ||
BEGIN_PGML | BEGIN_PGML | ||
Graph the circle given by the following equation. | |||
[ | [`[$circle_eq_lhs] = [$r ** 2]`] | ||
[_]{$gt} | |||
END_PGML | END_PGML | ||
</pre> | </pre> | ||
Line 136: | Line 170: | ||
<p> | <p> | ||
<b>Main Text:</b> | <b>Main Text:</b> | ||
This | This asks to graph the circle given by the equation. And the code: | ||
<pre> | |||
[_]{$gt} | |||
</pre> | |||
inserts the GraphTool. | |||
</p> | </p> | ||
</td> | </td> | ||
</tr> | </tr> | ||
<!-- | <!-- Solution section --> | ||
<tr valign="top"> | <tr valign="top"> | ||
<td style="background-color:#eeddff;border:black 1px dashed;"> | <td style="background-color:#eeddff;border:black 1px dashed;"> | ||
<pre> | <pre> | ||
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(); | ENDDOCUMENT(); | ||
</pre> | </pre> | ||
<td style="background-color:#eeccff;padding:7px;"> | <td style="background-color:#eeccff;padding:7px;"> | ||
<p> | <p> | ||
This | This is the solution. | ||
</p> | </p> | ||
</td> | </td> |
Revision as of 21:47, 21 April 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; }; 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. |