version 1.79, 2011/11/20 02:53:27
|
version 1.88, 2011/11/26 01:35:26
|
Line 32 use Apache::response();
|
Line 32 use Apache::response();
|
use Apache::lonlocal; |
use Apache::lonlocal; |
use Apache::lonnet; |
use Apache::lonnet; |
use Apache::run; |
use Apache::run; |
|
use LONCAPA; |
|
|
BEGIN { |
BEGIN { |
&Apache::lonxml::register('Apache::functionplotresponse',('functionplotresponse','backgroundplot','spline', |
&Apache::lonxml::register('Apache::functionplotresponse',('functionplotresponse','backgroundplot','spline', |
'plotobject','plotvector','functionplotvectorrule','functionplotvectorsumrule', |
'plotobject','plotvector', |
|
'functionplotvectorrule','functionplotvectorsumrule', |
|
'functionplotcustomrule', |
'functionplotrule','functionplotruleset', |
'functionplotrule','functionplotruleset', |
'functionplotelements')); |
'functionplotelements')); |
} |
} |
Line 46 BEGIN {
|
Line 49 BEGIN {
|
# |
# |
|
|
sub geogebra_startcode { |
sub geogebra_startcode { |
my ($id)=@_; |
my ($id,$width,$height)=@_; |
|
$width=int(1.*$width); |
|
$height=int(1.*$height); |
|
unless ($width) { $width=700; } |
|
unless ($height) { $height=400; } |
return (<<ENDSTARTCODE); |
return (<<ENDSTARTCODE); |
<applet name="ggbApplet_$id" code="geogebra.GeoGebraApplet" archive="geogebra.jar" |
<applet name="ggbApplet_$id" code="geogebra.GeoGebraApplet" archive="geogebra.jar" |
codebase="/adm/geogebra/" width="722" height="447" MAYSCRIPT> |
codebase="/adm/geogebra/" width="$width" height="$height" MAYSCRIPT> |
<param name="java_arguments" value="-Xmx512m -Djnlp.packEnabled=true"/> |
<param name="java_arguments" value="-Xmx512m -Djnlp.packEnabled=true"/> |
ENDSTARTCODE |
ENDSTARTCODE |
} |
} |
Line 654 sub start_functionplotrule {
|
Line 661 sub start_functionplotrule {
|
} else { |
} else { |
$label='R'.$label; |
$label='R'.$label; |
} |
} |
if ($Apache::functionplotresponse::splineorder{$label}) { |
|
&Apache::lonxml::error(&mt('Rule indices must be unique.')); |
|
} |
|
|
|
|
|
if ($target eq 'grade') { |
if ($target eq 'grade') { |
# Simply remember - in order - for later |
# Simply remember - in order - for later |
Line 772 sub start_functionplotvectorrule {
|
Line 775 sub start_functionplotvectorrule {
|
} else { |
} else { |
$label='R'.$label; |
$label='R'.$label; |
} |
} |
if ($Apache::functionplotresponse::splineorder{$label}) { |
|
&Apache::lonxml::error(&mt('Rule indices must be unique.')); |
|
} |
|
|
|
if ($target eq 'grade') { |
if ($target eq 'grade') { |
# Simply remember - in order - for later |
# Simply remember - in order - for later |
Line 787 sub start_functionplotvectorrule {
|
Line 787 sub start_functionplotvectorrule {
|
$vector=~s/\W//gs; |
$vector=~s/\W//gs; |
$vector=ucfirst($vector); |
$vector=ucfirst($vector); |
|
|
my $attachpoint=&Apache::lonxml::get_param('attachpoint',$parstack,$safeeval); |
|
$attachpoint=~s/\W//gs; |
|
$attachpoint=ucfirst($attachpoint); |
|
|
|
my $notattachpoint=&Apache::lonxml::get_param('notattachpoint',$parstack,$safeeval); |
|
$notattachpoint=~s/\W//gs; |
|
$notattachpoint=ucfirst($notattachpoint); |
|
|
|
my $tailpoint=&Apache::lonxml::get_param('tailpoint',$parstack,$safeeval); |
|
$tailpoint=~s/\W//gs; |
|
$tailpoint=ucfirst($tailpoint); |
|
my $tippoint=&Apache::lonxml::get_param('tippoint',$parstack,$safeeval); |
|
$tippoint=~s/\W//gs; |
|
$tippoint=ucfirst($tippoint); |
|
|
|
my $nottailpoint=&Apache::lonxml::get_param('nottailpoint',$parstack,$safeeval); |
|
$nottailpoint=~s/\W//gs; |
|
$nottailpoint=ucfirst($nottailpoint); |
|
my $nottippoint=&Apache::lonxml::get_param('nottippoint',$parstack,$safeeval); |
|
$nottippoint=~s/\W//gs; |
|
$nottippoint=ucfirst($nottippoint); |
|
|
|
push(@Apache::functionplotresponse::functionplotvectorrules,join(':',( |
push(@Apache::functionplotresponse::functionplotvectorrules,join(':',( |
$label, |
$label, |
'vector', |
'vector', |
$internalid, |
$internalid, |
$vector, |
$vector, |
$attachpoint, |
&Apache::lonxml::get_param('attachpoint',$parstack,$safeeval), |
$notattachpoint, |
&Apache::lonxml::get_param('notattachpoint',$parstack,$safeeval), |
$tailpoint, |
&Apache::lonxml::get_param('tailpoint',$parstack,$safeeval), |
$tippoint, |
&Apache::lonxml::get_param('tippoint',$parstack,$safeeval), |
$nottailpoint, |
&Apache::lonxml::get_param('nottailpoint',$parstack,$safeeval), |
$nottippoint, |
&Apache::lonxml::get_param('nottippoint',$parstack,$safeeval), |
&Apache::lonxml::get_param('length',$parstack,$safeeval), |
&Apache::lonxml::get_param('length',$parstack,$safeeval), |
&Apache::lonxml::get_param('angle',$parstack,$safeeval), |
&Apache::lonxml::get_param('angle',$parstack,$safeeval), |
&Apache::lonxml::get_param('lengtherror',$parstack,$safeeval), |
&Apache::lonxml::get_param('lengtherror',$parstack,$safeeval), |
Line 844 sub start_functionplotvectorrule {
|
Line 822 sub start_functionplotvectorrule {
|
&Apache::edit::text_arg('Tip not attached to object:','nottippoint', |
&Apache::edit::text_arg('Tip not attached to object:','nottippoint', |
$token,'16').'<br />'. |
$token,'16').'<br />'. |
&Apache::edit::text_arg('Length:','length', |
&Apache::edit::text_arg('Length:','length', |
$token,'16'). |
$token,'30'). |
&Apache::edit::text_arg('Angle:','angle', |
|
$token,'16'). |
|
&Apache::edit::text_arg('Absolute error length:','lengtherror', |
&Apache::edit::text_arg('Absolute error length:','lengtherror', |
$token,'8'). |
$token,'8').'<br />'. |
|
&Apache::edit::text_arg('Angle:','angle', |
|
$token,'30'). |
&Apache::edit::text_arg('Absolute error angle:','angleerror', |
&Apache::edit::text_arg('Absolute error angle:','angleerror', |
$token,'8'). |
$token,'8'). |
&Apache::edit::end_row(); |
&Apache::edit::end_row(); |
} elsif ($target eq 'modified') { |
} elsif ($target eq 'modified') { |
$env{'form.'.&Apache::edit::html_element_name('vector')}=ucfirst($env{'form.'.&Apache::edit::html_element_name('vector')}); |
$env{'form.'.&Apache::edit::html_element_name('vector')}=ucfirst($env{'form.'.&Apache::edit::html_element_name('vector')}); |
$env{'form.'.&Apache::edit::html_element_name('attachpoint')}=ucfirst($env{'form.'.&Apache::edit::html_element_name('attachpoint')}); |
|
$env{'form.'.&Apache::edit::html_element_name('notattachpoint')}=ucfirst($env{'form.'.&Apache::edit::html_element_name('notattachpoint')}); |
|
$env{'form.'.&Apache::edit::html_element_name('tailpoint')}=ucfirst($env{'form.'.&Apache::edit::html_element_name('tailpoint')}); |
|
$env{'form.'.&Apache::edit::html_element_name('tippoint')}=ucfirst($env{'form.'.&Apache::edit::html_element_name('tippoint')}); |
|
$env{'form.'.&Apache::edit::html_element_name('nottailpoint')}=ucfirst($env{'form.'.&Apache::edit::html_element_name('nottailpoint')}); |
|
$env{'form.'.&Apache::edit::html_element_name('nottippoint')}=ucfirst($env{'form.'.&Apache::edit::html_element_name('nottippoint')}); |
|
my $constructtag=&Apache::edit::get_new_args($token,$parstack, |
my $constructtag=&Apache::edit::get_new_args($token,$parstack, |
$safeeval,'index','vector','attachpoint','notattachpoint', |
$safeeval,'index','vector','attachpoint','notattachpoint', |
'tailpoint','tippoint','nottailpoint','nottipoint', |
'tailpoint','tippoint','nottailpoint','nottipoint', |
Line 896 sub start_functionplotvectorsumrule {
|
Line 868 sub start_functionplotvectorsumrule {
|
} else { |
} else { |
$label='R'.$label; |
$label='R'.$label; |
} |
} |
if ($Apache::functionplotresponse::splineorder{$label}) { |
|
&Apache::lonxml::error(&mt('Rule indices must be unique.')); |
|
} |
|
if ($target eq 'grade') { |
if ($target eq 'grade') { |
# Simply remember - in order - for later |
# Simply remember - in order - for later |
my $id=$Apache::inputtags::response[-1]; |
my $id=$Apache::inputtags::response[-1]; |
my $partid=$Apache::inputtags::part; |
my $partid=$Apache::inputtags::part; |
my $internalid = $partid.'_'.$id; |
my $internalid = $partid.'_'.$id; |
my $object=&Apache::lonxml::get_param('object',$parstack,$safeeval); |
my $vectors=&Apache::lonxml::get_param('vectors',$parstack,$safeeval); |
$object=~s/\W//gs; |
|
$object=ucfirst($object); |
|
push(@Apache::functionplotresponse::functionplotvectorrules,join(':',( |
push(@Apache::functionplotresponse::functionplotvectorrules,join(':',( |
$label, |
$label, |
'sum', |
'sum', |
$internalid, |
$internalid, |
$object, |
$vectors, |
&Apache::lonxml::get_param('length',$parstack,$safeeval), |
&Apache::lonxml::get_param('length',$parstack,$safeeval), |
&Apache::lonxml::get_param('angle',$parstack,$safeeval), |
&Apache::lonxml::get_param('angle',$parstack,$safeeval), |
&Apache::lonxml::get_param('lengthpercenterror',$parstack,$safeeval), |
&Apache::lonxml::get_param('lengtherror',$parstack,$safeeval), |
&Apache::lonxml::get_param('lengthabserror',$parstack,$safeeval), |
|
&Apache::lonxml::get_param('angleerror',$parstack,$safeeval), |
&Apache::lonxml::get_param('angleerror',$parstack,$safeeval), |
))); |
))); |
} elsif ($target eq 'edit') { |
} elsif ($target eq 'edit') { |
$result=&Apache::edit::tag_start($target,$token,'Function Plot Vector Sum Rule'). |
$result=&Apache::edit::tag_start($target,$token,'Function Plot Vector Sum Rule'). |
&Apache::edit::text_arg('Index/Name:','index', |
&Apache::edit::text_arg('Index/Name:','index', |
$token,'10').' '. |
$token,'10').' '. |
&Apache::edit::text_arg('Vectors attached to object:','object', |
&Apache::edit::text_arg('Comma-separated list of vectors:','vectors', |
$token,'16').'<br />'. |
$token,'30').'<br />'. |
&Apache::edit::text_arg('Sum vector length:','length', |
&Apache::edit::text_arg('Sum vector length:','length', |
$token,'16'). |
$token,'30'). |
|
&Apache::edit::text_arg('Absolute error length:','lengtherror', |
|
$token,'8').'<br />'. |
&Apache::edit::text_arg('Sum vector angle:','angle', |
&Apache::edit::text_arg('Sum vector angle:','angle', |
$token,'16'). |
$token,'30'). |
&Apache::edit::text_arg('Percent error length:','lengthpercenterror', |
&Apache::edit::text_arg('Absolute error angle:','angleerror', |
$token,'8'). |
|
&Apache::edit::text_arg('Absolute error length:','lengthabserror', |
|
$token,'8'). |
|
&Apache::edit::text_arg('Error angle:','angleerror', |
|
$token,'8'). |
$token,'8'). |
&Apache::edit::end_row(); |
&Apache::edit::end_row(); |
} elsif ($target eq 'modified') { |
} elsif ($target eq 'modified') { |
$env{'form.'.&Apache::edit::html_element_name('object')}=ucfirst($env{'form.'.&Apache::edit::html_element_name('object')}); |
my $constructtag=&Apache::edit::get_new_args($token,$parstack, |
my $constructtag=&Apache::edit::get_new_args($token,$parstack, |
$safeeval,'index','vectors', |
$safeeval,'index','object', |
'length','angle', |
'length','angle', |
'lengtherror','angleerror'); |
'lengthpercenterror','lengthabserror','angleerror'); |
if ($constructtag) { $result=&Apache::edit::rebuild_tag($token); } |
if ($constructtag) { $result=&Apache::edit::rebuild_tag($token); } |
|
} |
} |
return $result; |
return $result; |
} |
} |
Line 956 sub end_functionplotvectorsumrule {
|
Line 919 sub end_functionplotvectorsumrule {
|
} |
} |
|
|
# |
# |
|
# <functionplotcustom ... /> |
|
# |
|
sub start_functionplotcustomrule { |
|
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; |
|
my $result=''; |
|
my $label=&Apache::lonxml::get_param('index',$parstack,$safeeval); |
|
$Apache::functionplotresponse::counter++; |
|
if ($label=~/\W/) { |
|
&Apache::lonxml::warning(&mt('Rule indices should only contain alphanumeric characters.')); |
|
} |
|
$label=~s/\W//gs; |
|
unless ($label) { |
|
$label='R'.$Apache::functionplotresponse::counter; |
|
} else { |
|
$label='R'.$label; |
|
} |
|
&Apache::lonxml::register('Apache::response',('answer')); |
|
if ($target eq 'edit') { |
|
$result=&Apache::edit::tag_start($target,$token,'Function Plot Custom Rule'). |
|
&Apache::edit::text_arg('Index/Name:','index',$token,'10'). |
|
&Apache::edit::end_row(); |
|
} elsif ($target eq 'modified') { |
|
my $constructtag=&Apache::edit::get_new_args($token,$parstack,$safeeval,'index'); |
|
if ($constructtag) { $result=&Apache::edit::rebuild_tag($token); } |
|
} |
|
return $result; |
|
} |
|
|
|
sub end_functionplotcustomrule { |
|
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; |
|
my $result=''; |
|
if ($target eq 'edit') { |
|
$result=&Apache::edit::end_table(); |
|
} elsif ($target eq 'grade') { |
|
# Simply remember - in order - for later |
|
my $label=&Apache::lonxml::get_param('index',$parstack,$safeeval); |
|
$Apache::functionplotresponse::counter++; |
|
if ($label=~/\W/) { |
|
&Apache::lonxml::warning(&mt('Rule indices should only contain alphanumeric characters.')); |
|
} |
|
$label=~s/\W//gs; |
|
unless ($label) { |
|
$label='R'.$Apache::functionplotresponse::counter; |
|
} else { |
|
$label='R'.$label; |
|
} |
|
push(@Apache::functionplotresponse::functionplotvectorrules,join(':',( |
|
$label, |
|
'custom', |
|
&escape($Apache::response::custom_answer[-1]) |
|
))); |
|
} |
|
&Apache::lonxml::deregister('Apache::response',('answer')); |
|
return $result; |
|
} |
|
|
|
|
|
|
|
# |
# <spline index="..." order="1,2,3,4" initx="..." inity="..." scalex="..." scaley="..." /> |
# <spline index="..." order="1,2,3,4" initx="..." inity="..." scalex="..." scaley="..." /> |
# |
# |
# Unfortunately, GeoGebra seems to want all splines after everything else, so we need to store them |
# Unfortunately, GeoGebra seems to want all splines after everything else, so we need to store them |
Line 1230 sub start_functionplotresponse {
|
Line 1252 sub start_functionplotresponse {
|
.&Apache::edit::end_row() |
.&Apache::edit::end_row() |
.&Apache::edit::start_spanning_row() |
.&Apache::edit::start_spanning_row() |
."\n"; |
."\n"; |
$result.=&Apache::edit::text_arg('Label x-axis:','xlabel', |
$result.=&Apache::edit::text_arg('Width (pixels):','width', |
|
$token,'6').' '. |
|
&Apache::edit::text_arg('Height (pixels):','height', |
|
$token,'6').'<br />'. |
|
&Apache::edit::text_arg('Label x-axis:','xlabel', |
$token,'6').' '. |
$token,'6').' '. |
&Apache::edit::text_arg('Minimum x-value:','xmin', |
&Apache::edit::text_arg('Minimum x-value:','xmin', |
$token,'4').' '. |
$token,'4').' '. |
Line 1253 sub start_functionplotresponse {
|
Line 1279 sub start_functionplotresponse {
|
&Apache::edit::end_row().&Apache::edit::start_spanning_row(); |
&Apache::edit::end_row().&Apache::edit::start_spanning_row(); |
} elsif ($target eq 'modified') { |
} elsif ($target eq 'modified') { |
my $constructtag=&Apache::edit::get_new_args($token,$parstack, |
my $constructtag=&Apache::edit::get_new_args($token,$parstack, |
$safeeval,'xlabel','xmin','xmax','ylabel','ymin','ymax', |
$safeeval,'width','height','xlabel','xmin','xmax','ylabel','ymin','ymax', |
'xaxisvisible','yaxisvisible','gridvisible','answerdisplay'); |
'xaxisvisible','yaxisvisible','gridvisible','answerdisplay'); |
if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); } |
if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); } |
|
|
Line 1371 sub fpr_d2fdx2 {
|
Line 1397 sub fpr_d2fdx2 {
|
$arg)]; |
$arg)]; |
} |
} |
|
|
|
sub fpr_vectorcoords { |
|
my ($arg)=@_; |
|
$arg=~s/\W//gs; |
|
$arg=ucfirst($arg); |
|
my $id=$Apache::inputtags::response[-1]; |
|
my $partid=$Apache::inputtags::part; |
|
my $internalid = $partid.'_'.$id; |
|
return ($env{'form.HWVAL_'.$internalid.'_'.$arg.'Start_x'}, |
|
$env{'form.HWVAL_'.$internalid.'_'.$arg.'End_x'}, |
|
$env{'form.HWVAL_'.$internalid.'_'.$arg.'Start_y'}, |
|
$env{'form.HWVAL_'.$internalid.'_'.$arg.'End_y'}); |
|
} |
|
|
|
sub fpr_objectcoords { |
|
my ($arg)=@_; |
|
$arg=~s/\W//gs; |
|
$arg=ucfirst($arg); |
|
my $id=$Apache::inputtags::response[-1]; |
|
my $partid=$Apache::inputtags::part; |
|
my $internalid = $partid.'_'.$id; |
|
return ($env{'form.HWVAL_'.$internalid.'_'.$arg.'_x'}, |
|
$env{'form.HWVAL_'.$internalid.'_'.$arg.'_y'}); |
|
} |
|
|
|
sub fpr_vectorlength { |
|
my ($arg)=@_; |
|
my ($xs,$xe,$ys,$ye)=&fpr_vectorcoords($arg); |
|
return sqrt(($xe-$xs)*($xe-$xs)+($ye-$ys)*($ye-$ys)); |
|
} |
|
|
|
sub fpr_vectorangle { |
|
my ($arg)=@_; |
|
my ($xs,$xe,$ys,$ye)=&fpr_vectorcoords($arg); |
|
my $angle=57.2957795*atan2(($ye-$ys),($xe-$xs)); |
|
if ($angle<0) { $angle=360+$angle; } |
|
return $angle; |
|
} |
|
|
sub vectorcoords { |
sub vectorcoords { |
my ($id,$label)=@_; |
my ($id,$label)=@_; |
Line 1385 sub objectcoords {
|
Line 1448 sub objectcoords {
|
return ($env{'form.HWVAL_'.$id.'_'.$label.'_x'}, |
return ($env{'form.HWVAL_'.$id.'_'.$label.'_x'}, |
$env{'form.HWVAL_'.$id.'_'.$label.'_y'}); |
$env{'form.HWVAL_'.$id.'_'.$label.'_y'}); |
} |
} |
|
|
|
sub attached { |
|
my ($id,$vector,$objects,$xmin,$xmax,$ymin,$ymax)=@_; |
|
my ($xs,$xe,$ys,$ye)=&vectorcoords($id,$vector); |
|
my $tolx=($xmax-$xmin)/100.; |
|
my $toly=($ymax-$ymin)/100.; |
|
my $tail=0; |
|
my $tip=0; |
|
foreach my $obj (split(/\s*\,\s*/,$objects)) { |
|
$obj=~s/\W//g; |
|
unless ($obj) { next; } |
|
$obj=ucfirst($obj); |
|
my ($xo,$yo)=&objectcoords($id,$obj); |
|
&addlog("Proximity $vector ($xs,$ys)-($xe,$ye) to $obj ($xo,$yo)"); |
|
if ((abs($xs-$xo)<$tolx) && (abs($ys-$yo)<$toly)) { |
|
$tail=1; |
|
&addlog("Attached tail: $obj"); |
|
} |
|
if ((abs($xe-$xo)<$tolx) && (abs($ye-$yo)<$toly)) { |
|
$tip=1; |
|
&addlog("Attached tip: $obj"); |
|
} |
|
} |
|
&addlog("Result tail:$tail tip:$tip"); |
|
return($tail,$tip); |
|
} |
|
|
|
|
sub vectorangle { |
sub vectorangle { |
my ($x,$y)=@_; |
my ($x,$y)=@_; |
Line 1424 sub functionplotvectorrulecheck {
|
Line 1514 sub functionplotvectorrulecheck {
|
return &vectorcheck($rule,$xmin,$xmax,$ymin,$ymax,$safeeval); |
return &vectorcheck($rule,$xmin,$xmax,$ymin,$ymax,$safeeval); |
} elsif ($type eq 'sum') { |
} elsif ($type eq 'sum') { |
return &sumcheck($rule,$xmin,$xmax,$ymin,$ymax,$safeeval); |
return &sumcheck($rule,$xmin,$xmax,$ymin,$ymax,$safeeval); |
|
} elsif ($type eq 'custom') { |
|
return &customcheck($rule,$safeeval); |
} |
} |
} |
} |
|
|
Line 1445 sub vectorcheck {
|
Line 1537 sub vectorcheck {
|
return 0; |
return 0; |
} |
} |
} |
} |
|
if ($angle ne '') { |
|
&addlog("Checking for angle $angle with error $angleerror"); |
|
$angle=&Apache::run::run($angle,$safeeval); |
|
&addlog("Angle evaluated to $angle"); |
|
my $thisangle=&plotvectorangle($id,$vector); |
|
&addlog("Found angle $thisangle"); |
|
my $anglediff=abs($thisangle-$angle); |
|
&addlog("Angle difference: $anglediff"); |
|
if ($anglediff>360.-$anglediff) { |
|
$anglediff=360.-$anglediff; |
|
} |
|
&addlog("Smallest angle difference: $anglediff"); |
|
if ($anglediff>$angleerror) { |
|
&setfailed($label); |
|
return 0; |
|
} |
|
} |
|
if ($attachpoint ne '') { |
|
&addlog("Checking attached: ".$attachpoint); |
|
my ($tail,$tip)=&attached($id,$vector,$attachpoint,$xmin,$xmax,$ymin,$ymax); |
|
unless ($tail || $tip) { |
|
&setfailed($label); |
|
return 0; |
|
} |
|
} |
|
if ($notattachpoint ne '') { |
|
&addlog("Checking not attached: ".$notattachpoint); |
|
my ($tail,$tip)=&attached($id,$vector,$notattachpoint,$xmin,$xmax,$ymin,$ymax); |
|
if ($tail || $tip) { |
|
&setfailed($label); |
|
return 0; |
|
} |
|
} |
|
if ($tailpoint ne '') { |
|
&addlog("Checking tail: ".$tailpoint); |
|
my ($tail,$tip)=&attached($id,$vector,$tailpoint,$xmin,$xmax,$ymin,$ymax); |
|
unless ($tail) { |
|
&setfailed($label); |
|
return 0; |
|
} |
|
} |
|
if ($nottailpoint ne '') { |
|
&addlog("Checking not tail: ".$nottailpoint); |
|
my ($tail,$tip)=&attached($id,$vector,$nottailpoint,$xmin,$xmax,$ymin,$ymax); |
|
if ($tail) { |
|
&setfailed($label); |
|
return 0; |
|
} |
|
} |
|
if ($tippoint ne '') { |
|
&addlog("Checking tip: ".$tippoint); |
|
my ($tail,$tip)=&attached($id,$vector,$tippoint,$xmin,$xmax,$ymin,$ymax); |
|
unless ($tip) { |
|
&setfailed($label); |
|
return 0; |
|
} |
|
} |
|
if ($nottippoint ne '') { |
|
&addlog("Checking not tip: ".$nottippoint); |
|
my ($tail,$tip)=&attached($id,$vector,$nottippoint,$xmin,$xmax,$ymin,$ymax); |
|
if ($tip) { |
|
&setfailed($label); |
|
return 0; |
|
} |
|
} |
|
|
&addlog("Rule $label passed."); |
&addlog("Rule $label passed."); |
return 1; |
return 1; |
} |
} |
|
|
sub sumcheck { |
sub sumcheck { |
my ($rule,$xmin,$xmax,$ymin,$ymax,$safeeval)=@_; |
my ($rule,$xmin,$xmax,$ymin,$ymax,$safeeval)=@_; |
my ($label,$type,$id,$object,$length,$angle,$lengthpercenterror,$lengthabserror,$angleerror)=split(/\:/,$rule); |
my ($label,$type,$id,$vectors,$length,$angle,$lengtherror,$angleerror)=split(/\:/,$rule); |
&addlog("Vector Sum Rule $label for vectors attached to ".$object); |
&addlog("Vector Sum Rule $label for vectors ".$vectors); |
|
my $sumx=0; |
|
my $sumy=0; |
|
foreach my $sv (split(/\s*\,\s*/,$vectors)) { |
|
my ($rx,$ry)=&relvector(&vectorcoords($id,$sv)); |
|
$sumx+=$rx; |
|
$sumy+=$ry; |
|
} |
|
&addlog("Sum vector ($sumx,$sumy)"); |
|
if ($length ne '') { |
|
&addlog("Checking length $length with error $lengtherror"); |
|
$length=&Apache::run::run($length,$safeeval); |
|
&addlog("Evaluated to $length"); |
|
my $thislength=&vectorlength($sumx,$sumy); |
|
&addlog("Actual length $thislength"); |
|
if (abs($length-$thislength)>$lengtherror) { |
|
&setfailed($label); |
|
return 0; |
|
} |
|
} |
|
if ($angle ne '') { |
|
&addlog("Checking angle $angle with error $angleerror"); |
|
$angle=&Apache::run::run($angle,$safeeval); |
|
&addlog("Evaluated to $angle"); |
|
my $thisangle=&vectorangle($sumx,$sumy); |
|
&addlog("Actual angle $thisangle"); |
|
my $anglediff=abs($thisangle-$angle); |
|
&addlog("Angle difference: $anglediff"); |
|
if ($anglediff>360.-$anglediff) { |
|
$anglediff=360.-$anglediff; |
|
} |
|
&addlog("Smallest angle difference: $anglediff"); |
|
if ($anglediff>$angleerror) { |
|
&setfailed($label); |
|
return 0; |
|
} |
|
} |
|
&addlog("Rule $label passed."); |
|
return 1; |
|
} |
|
|
|
sub customcheck { |
|
my ($rule,$safeeval)=@_; |
|
my ($label,$type,$prg)=split(/\:/,$rule); |
|
&addlog("Custom Rule ".$label); |
|
my $result=&Apache::run::run(&unescape($prg),$safeeval); |
|
&addlog("Algorithm returned $result"); |
|
unless ($result) { |
|
&setfailed($label); |
|
return 0; |
|
} |
&addlog("Rule $label passed."); |
&addlog("Rule $label passed."); |
return 1; |
return 1; |
} |
} |
Line 1787 sub end_functionplotelements {
|
Line 1994 sub end_functionplotelements {
|
# generate the input fields |
# generate the input fields |
$result.=$Apache::functionplotresponse::inputfields; |
$result.=$Apache::functionplotresponse::inputfields; |
# actually start the <applet>-tag |
# actually start the <applet>-tag |
$result.=&geogebra_startcode($internalid); |
$result.=&geogebra_startcode($internalid, |
|
&Apache::lonxml::get_param('width',$parstack,$safeeval,-2), |
|
&Apache::lonxml::get_param('height',$parstack,$safeeval,-2)); |
# load the spline bytecode |
# load the spline bytecode |
$result.=&geogebra_spline_program(); |
$result.=&geogebra_spline_program(); |
# set default parameters |
# set default parameters |