GeoGebraApplets

From WeBWorK_wiki
Revision as of 00:54, 7 November 2010 by Pearson (talk | contribs)
Jump to navigation Jump to search

Your title here: PG Code Snippet


This PG code shows how to write WebWork questions with interactive GeoGebra applets.

Problem Techniques Index

PG problem file Explanation
DOCUMENT();

loadMacros(
"PGstandard.pl",
"MathObjects.pl",
"unionTables.pl",
"AppletObjects.pl",
"PGcourse.pl",
);
 
$showPartialCorrectAnswers = 1;

TEXT(beginproblem());

Initialization: We need to include the macro file AppletObjects.pl.

Context("Numeric")->variables->are(t=>"Real");

$a = random(2,4,1);
$b = random(5,8,1);
$c = random(1,3,1);
$d = random(1,3,1);
while ($c == $d) { $d = random(1,3,1); }

# $f = Formula("$c / (1+(t-2)^2) + $d / (1+(t-4)^2)");
$F = Formula("$c * arctan(t-2) + $d * arctan(t-4) 
- $c * arctan(-2) - $d * arctan(-4)");

$Fa = $F->eval(t=>$a);
$Fb = $F->eval(t=>$b);
$disp = $Fb-$Fa;

Setup: The GeoGebra applet displays a graph of $f and an accumulation function that is the integral of $f from 0 to a movable point x on the horizontal axis, and it also shades the region under the graph of $f and gives the area of this region rounded to one decimal place. We will pass the values $c and $d to the GeoGebra applet later.

We define the accumulation function $F use it to generate the answers.

$appletName = "ggbApplet";

$applet =  JavaApplet(
code                  => "geogebra.GeoGebraApplet",
archive               => "geogebra.jar",
codebase              => findAppletCodebase("geogebra.jar"),                           
appletName            => $appletName,
appletId              => $appletName,
submitActionAlias     => 'getXML',  # default getXML
initializeActionAlias => 'setXML',  # default setXML
setStateAlias         => 'setXML',
getStateAlias         => 'getXML',
setConfigAlias        => '',
getConfigAlias        => '',
returnFieldName       => '',
width                 => 486,
height                => 306,
mayscript             => "true",
# 0 = no debug, 1 = xml visible, 2 = add alerts thru applet
debugMode             => 0, 
onInit                => 'ggbOnInit',
type                  => 'geogebra',
# paste parameters in section at the bottom
parameter_string      => GEOGEBRA_PARAMS(), 
);

GeoGebra Applet Setup: We use JavaApplet(); from AppletObjects.pl to configure the applet. The value of $appletName can be anything reasonable. We chose the default value ggbApplet for applets generated by html export from GeoGebra. You will want to change the values of width and height to be the same as the values in the <applet ... width="486" height="306" ...> tag in the html file generated by html export in GeoGebra.

Since the GeoGebra parameters can be very lengthy, at the end of the PG file we put a new method called GEOGEBRA_PARAMS() that returns all of the GeoGebra applet parameters.

$im = image( "graph-c".$c."-d".$d.".png", 
width=>486, height=>306, tex_size=>900 );

PNG Picture Setup: For each of the six ordered pairs ($c,$d) = (1,2), (1,3), (2,1), (2,3), (3,1), (3,2) we exported a PNG picture from GeoGebra named, for example, graph-c1-d2.png. These PNG pictures will be used when a student generates a PDF hardcopy of their homework. It is important to do this step!

HEADER_TEXT(
qq! 
<script language="javascript">
  function ggbOnInit(param) {
    if (param == "$appletName") {
      applet_loaded(param,1);  // report that applet is ready. 
      ww_applet_list[param].safe_applet_initialize(2);
    }
  } 
</script>
<noscript>For this question to work properly, 
you must enable JavaScript, or use another browser 
(or computer) on which JavaScript works.</noscript>
!);

JavaScript Setup for Persistence of State: For the state of the GeoGebra applet to remain the same when answers are submitted or the page is refreshed, we need a little JavaScript. GeoGebra can interact with other things, like WebWork, by using its JavaScript methods GeoGebra_JavaScript_Methods.

TEXT( MODES(TeX=>'', HTML=><<END_SCRIPT ) );
<script language="javascript">
function setAppletCoefficients() {
   var applet=getApplet("$appletName"); // alert("Updating coefficients");
   if (typeof(applet)!="undefined") {
     if (typeof(applet.setValue)!="undefined") {
     
     ////////////////////////////////////////////////////////////////
     //  List the values of the parameters to be set in the applet here
     
     // Set variables "c" and "d" in GeoGebra to values $c and $d from WebWork
     applet.setValue("c", $c); 
     applet.setValue("d", $d);    

     } else {
          setTimeout("setAppletCoefficients()", 1000);
     }
   } else {
      setTimeout("setAppletCoefficients()",1000);
   }
}
ww_applet_list["$appletName"].setConfig = function() {setAppletCoefficients()};
</script>
END_SCRIPT

JavaScript Setup for Initial State: We use JavaScript methods to set the values of the variables c and d defined as "Free Objects" in the GeoGebra applet to the random values $c and $d generated by WebWork.

Context()->texStrings;
BEGIN_TEXT
\{
ColumnTable(
"The figure shows an interactive graph of velocity \( v(t) \).  You can 
change the value of \( t \) in the graph by clicking and dragging
the red dot along the horizontal \( t \)-axis.
$BR
$BR
(a) What is the displacement of the object between \( t = 0 \) 
and \( t = $a \)?
$BR".
ans_rule(20).
"$BR
$BR
(b) What is the displacement of the object between \( t = 0 \)
and \( t = $b \)?
$BR".
ans_rule(20).
"$BR
$BR
(c) What is the displacement of the object between \( t = $a \)
and \( t = $b \)?
$BR".
ans_rule(20)
,
$BCENTER.
MODES(HTML=>$applet->insertAll(
debug=>0, reinitialize_button=>0, includeAnswerBox=>0,), TeX=>$im).
$PAR.
"Graph of velocity \( y = v(t) \)".
$ECENTER
,
indent => 0, separation => 30, valign => "TOP"
);
\}
END_TEXT
Context()->normalStrings;

Main Text: The problem text section of the file is mostly as we'd expect. We make use of a ColumnTable() and the string concatenation operator . a lot. The code that is special here is MODES(HTML=>$applet->insertAll(debug=>0, reinitialize_button=>0, includeAnswerBox=>0,), TeX=>$im) which says to display the $applet in HTML mode and the PNG picture file defined by $im in TeX mode.

ANS( Real($Fa) ->cmp(tolerance=>0.11, tolType=>'absolute') );
ANS( Real($Fb) ->cmp(tolerance=>0.11, tolType=>'absolute') );
ANS( Real($disp)->cmp(tolerance=>0.21, tolType=>'absolute') );

Answer Evaluation: Standard.

sub GEOGEBRA_PARAMS {
$result = qq{

# For persistence of applet state when answers are submitted
<param name="ggbOnInitParam" value="$appletName"/>
# The GeoGebra "source code" from GeoGebra -> 
# File -> Export -> Dynamic worksheet as Webpage (html)
<param name="ggbBase64" value="UEsDBBQ........"/>
<param name="image" 
value="http://www.geogebra.org/webstart/loading.gif"  />
<param name="boxborder" value="false"  />
<param name="centerimage" value="true"  />
<param name="java_arguments" value="-Xmx512m" />
<param name="cache_archive" value="geogebra.jar, 
geogebra_main.jar, geogebra_gui.jar, geogebra_cas.jar, 
geogebra_export.jar, geogebra_properties.jar" />
<param name="cache_version" value="3.2.41.0, 3.2.41.0, 
3.2.41.0, 3.2.41.0, 3.2.41.0, 3.2.41.0" />
<param name="framePossible" value="false" />
<param name="showResetIcon" value="false" />
<param name="showAnimationButton" value="true" />
<param name="enableRightClick" value="false" />
<param name="errorDialogsActive" value="true" />
<param name="enableLabelDrags" value="false" />
<param name="showMenuBar" value="false" />
<param name="showToolBar" value="false" />
<param name="showToolBarHelp" value="false" />
<param name="showAlgebraInput" value="false" />
<param name="allowRescaling" value="true" />

};
}


COMMENT('MathObject version.  Uses GeoGebra applet.');

ENDDOCUMENT();

GeoGebra Applet Parameters: When you export your GeoGebra drawing pad via File -> Export ->> Dynamic worksheet as Webpage (html), you get an html file with source code you can paste directly in here below the commented line # The GeoGebra "source code" .... The parameter named ggbBase64 is actually the source code for the GeoGebra worksheet. Although it is possible to use an applet parameter to include your filename.ggb file directly, this is a bad idea for security reasons and should be avoided entirely.

Problem Techniques Index


<param name="ggbBase64" value="UEsDBBQACAAIAGKtZj0AAAAAAAAAAAAAAAAMAAAAZ2VvZ2VicmEueG1s3Vdtb9s2EP68/gqCAwobQ2xKll1ntVJk2QYE6NYA2YpgHwbQ0tnmIokeSTlyfv2OpCTLypIm64C9+INlHk/Hu+c5PqQX76o8IztQWsgipsGIUQJFIlNRrGNamtXJnL47e7VYg1zDUnGykirnJqaTUUitvRRnr75Y6I28IzxzLh8F3MV0xTMNlOitAp7qDYA5svOyEpngav9h+RskRh8mfJDLYlviKkaVaEvy9L3QzXDsFtxmwnwrdiIFRTKZxHQ2xdTx10dQRiQ8i2nEvCWMadibRNPEzm6kEveyMNb9EDzjS8gQgGuzz4CQnZ0N/dQKnQnR4h4QLGdbjB0GCyiTTKSCF7ZOlyI6EXInUrPBXOYzXA3EemOxY5GPlkip0uu9NpCT6hdQEoPOLAV7PwhDR4jGjHG9KXNT3ZGLArtrMAbz1YRXoBvU1kqk3d+X+huZpS3QWykKc8G3plSOa1abXNFuqGy258U6g9oWIBUbSG6Xsrr2CEx86J/2W/eKS2e5vpCZVERZ2KfoUD+X/ul8bJ6tF3M+zHnUMWzQdj44DZ2Hey790/MkCp9aXXfQFB2wZhmhiTVYELFFGzgcwTGlpCyEed8MsDNuD5Va/x/LfIlbo9sbbcjgbwq5GPc6Z3ELqoDM90eBvJay1L4JPXUujxQSkePQTwR1cpasnzEBb01hraDJ2+8rD5ebZd0e7JkX4yYJm4PGXBODAoH1GFvLeZKUeZlxZ/u+LPzk4LuK51uM82ZoN7jBzRXTK15m5Aq40rKgJOUGX7fCARnkgHvJuNYpyhyUSFoYE2pTw3zKOquwaXanNNKJRtvK9UsddNDhkfZCgdluOP4aBc1m36OEdBFx4X6QKfSwRbxdnbhdtz4AyhtAWsumqTcB2WJIt6XahJBjX+4nC0/7hU/+N4UnMs95kZKC5+jedI2rV1i1J5wh8WRMBhiVfEUGFTkhyPvw14H9HqIp7c1Gh1msL4jpSeA0kodWAxrkZGma8CufVJ3KAzZWTVItsvRYZ8wGN3QBWtsDoS38IT9HmvBCetgz6WF9EXw0ucdZuLKK36OgOkeJe4DczdPIuaOjrfiGPo3IQU67gDSnxUsh+bBaaTCksvS/wQPSnvx/ilj4+Q1d66W2q6Fv6JZzPXfvX3Y+/iC1579bd/o0CZeFQaHmWY+H1aCqu7rt6WpwM3zADH+amb7C8L7CsNEpY2waTcJoPg/nUzb7rIYOppP2rD8wOHmZ5rywqaHCa6a2V9i2w6AyyCpOxPT176U0by8Px5j++vWXAXt7kWFoYnlIFV/jSkAU4EAirpksvOVwQyTmxB7+Ix/OpXCMtF2THifwTwrDSlRYze74auvurxobYnW4orurHIKrm4uKp99wZZw+kLrZp6fdz9zvtBGbse5n2t0Jn+YoPOLoWqwLzJnjfwYSE29DreeUPAPt8D+EdtSizR5DOzyC1QvNSTCKor79JXBHR3DvEeTdwAyf39HRXxL2fyXE0xHzLRyMZtFjKI67t1/3X6/+H3z2B1BLBwh3r/gKdQQAADkPAABQSwECFAAUAAgACABirWY9d6/4CnUEAAA5DwAADAAAAAAAAAAAAAAAAAAAAAAAZ2VvZ2VicmEueG1sUEsFBgAAAAABAAEAOgAAAK8EAAAAAA=="/>