Difference between revisions of "GraphTool"
Jump to navigation
Jump to search
(initial checkin of this page. Not ready) |
(added historical tag and gave updated problem link) |
||
(9 intermediate revisions by 5 users not shown) | |||
Line 1: | Line 1: | ||
− | {{UnderConstruction}} |
||
+ | {{historical}} |
||
+ | |||
+ | <p style="font-size: 120%;font-weight:bold">This problem has been replaced with many other problems:</p> |
||
+ | * [https://openwebwork.github.io/pg-docs/sample-problems/Algebra/GraphToolCircle.html A graph tool with circle] |
||
+ | * [https://openwebwork.github.io/pg-docs/sample-problems/Algebra/GraphToolCubic.html A graph tool with cubic] |
||
+ | * [https://openwebwork.github.io/pg-docs/sample-problems/Algebra/GraphToolLine.html A graph tool with line] |
||
+ | * [https://openwebwork.github.io/pg-docs/sample-problems/Algebra/GraphToolNumberLine.html A graph tool with a number line] |
||
+ | * [https://openwebwork.github.io/pg-docs/sample-problems/Algebra/GraphToolCustomChecker.html A graph tool with custom checker] |
||
+ | * [https://openwebwork.github.io/pg-docs/sample-problems/Algebra/GraphToolPoints.html A graph tool with points] |
||
<h2>Graph Tool</h2> |
<h2>Graph Tool</h2> |
||
Line 48: | Line 56: | ||
<td style="background-color:#ffffdd;border:black 1px dashed;"> |
<td style="background-color:#ffffdd;border:black 1px dashed;"> |
||
<pre> |
<pre> |
||
− | $h = non_zero_random(-5, 5); |
||
+ | # Define the answer checker for the graph tool. |
||
− | $k = non_zero_random(-5, 5); |
||
+ | # This checker allows the student to graph the correct circle multiple |
||
− | $r = random(1, 4); |
||
+ | # 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. |
||
− | Context()->variables->add("y" => "Real"); |
||
+ | $gt_checker = sub { |
||
− | $circle_eq_lhs = Formula("(x-$h)^2 + (y-$k)^2")->reduce; |
||
+ | my ($correct, $student, $ans, $value) = @_; |
||
+ | return 0 if $ans->{isPreview}; |
||
− | # This grader allows the student to graph the correct circle multiple times. The idea is that |
||
+ | my $score = 0; |
||
− | # the graph is graded based on appearance. No matter how many times the student graphs the |
||
+ | my @errors; |
||
− | # correct circle, the resulting graph appears the same. |
||
+ | my $count = 1; |
||
− | $gt = GraphTool("{circle, solid, ($h, $k), ($h + $r, $k)}")->with( |
||
− | bBox => [-11, 11, 11, -11], |
||
− | cmpOptions => { |
||
− | list_checker => sub |
||
− | { |
||
− | my ($correct, $student, $ans, $value) = @_; |
||
− | return 0 if $ans->{isPreview}; |
||
− | my $score = 0; |
||
+ | # Get the center and point that define the correct circle and |
||
− | my @errors; |
||
+ | # compute the square of the radius. |
||
− | my $count = 1; |
||
− | # Get the center and point that define the correct circle and compute the square of |
||
+ | my ($cx, $cy) = $correct->[0]->extract(3)->value; |
||
− | # the radius. |
||
+ | my ($px, $py) = $correct->[0]->extract(4)->value; |
||
− | my ($cx, $cy) = $correct->[0]->extract(3)->value; |
||
+ | my $r_squared = ($cx - $px) ** 2 + ($cy - $py) ** 2; |
||
− | 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) |
||
+ | # Iterate through the objects the student graphed and check to |
||
− | { |
||
+ | # see if each is the correct circle. |
||
− | my $nth = Value::List->NameForNumber($count++); |
||
+ | 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))); |
|
− | push(@errors, "The $nth object graphed is not a " . $correct->[0]->extract(1)), |
||
+ | # The following gives additional information to the student. |
||
− | next if ($_->extract(1) ne $correct->[0]->extract(1)); |
||
+ | |||
+ | 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 } |
||
); |
); |
||
</pre> |
</pre> |
||
Line 111: | Line 119: | ||
<b>Setup:</b> |
<b>Setup:</b> |
||
<ul> |
<ul> |
||
− | |||
+ | <li>The subroutine <pre>$gt_checker</pre> 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, line, parabola or fill)</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. See [https://webwork.maa.org/pod/pg/macros/parserGraphTool.html#GRAPH-OBJECTS Graph Objects] for more details.</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, ymax, xmax, ymin</tt> indicating the upper left and lower right corners of the visible graph.</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> |
||
+ | <li>More documentation can be found at: [https://webwork.maa.org/pod/pg/macros/parserGraphTool.html]</li> |
||
</ul> |
</ul> |
||
− | </p> |
||
− | <p> |
||
− | Notes: on using this and related Contexts. |
||
</p> |
</p> |
||
Line 127: | Line 156: | ||
<pre> |
<pre> |
||
BEGIN_PGML |
BEGIN_PGML |
||
+ | Graph the circle given by the following equation. |
||
− | [@ image(insertGraph($graph_image), width => 300, tex_size => 1000) @]* |
||
+ | [`[$circle_eq_lhs] = [$r ** 2]`] |
||
+ | [_]{$gt} |
||
END_PGML |
END_PGML |
||
</pre> |
</pre> |
||
Line 135: | Line 166: | ||
<p> |
<p> |
||
<b>Main Text:</b> |
<b>Main Text:</b> |
||
− | This is how to insert the tikz image. Note the <tt>width</tt> and <tt>tex_size</tt> parameters can change the size of the image on the web and as hardcopy. |
||
+ | 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 doesn't have a question, so we aren't checking an answer. |
||
+ | This is the solution. |
||
</p> |
</p> |
||
</td> |
</td> |
||
Line 163: | Line 206: | ||
<ul> |
<ul> |
||
− | <li>POD documentation: [https://webwork.maa.org/pod/pg/macros/ |
+ | <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> |
Latest revision as of 10:11, 29 June 2023
This problem has been replaced with many other problems:
- A graph tool with circle
- A graph tool with cubic
- A graph tool with line
- A graph tool with a number line
- A graph tool with custom checker
- A graph tool with points
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. |
# Define the answer checker for the graph tool. # This checker 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]