[LON-CAPA-cvs] cvs: loncom /homework functionplotresponse.pm
www
www@source.lon-capa.org
Sat, 30 Oct 2010 23:43:29 -0000
www Sat Oct 30 23:43:29 2010 EDT
Modified files:
/loncom/homework functionplotresponse.pm
Log:
Saving my work: server-side function interpolation.
Seems to work but still has debug code in it.
Index: loncom/homework/functionplotresponse.pm
diff -u loncom/homework/functionplotresponse.pm:1.19 loncom/homework/functionplotresponse.pm:1.20
--- loncom/homework/functionplotresponse.pm:1.19 Sat Oct 30 15:32:36 2010
+++ loncom/homework/functionplotresponse.pm Sat Oct 30 23:43:29 2010
@@ -1,7 +1,7 @@
# LearningOnline Network with CAPA
# option list style responses
#
-# $Id: functionplotresponse.pm,v 1.19 2010/10/30 15:32:36 www Exp $
+# $Id: functionplotresponse.pm,v 1.20 2010/10/30 23:43:29 www Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -503,8 +503,59 @@
#
sub array_index {
my ($xmin,$xmax,$x)=@_;
- my $index=int(($x-$xmin)/($xmax-$xmin)*200.+0.5);
- return $index;
+ return int(($x-$xmin)/($xmax-$xmin)*200.+0.5);
+}
+
+#
+# Actual x-value of array index
+#
+
+sub index_x {
+ my ($xmin,$xmax,$i)=@_;
+ return $i*($xmax-$xmin)/200.+$xmin;
+}
+
+#
+# Assume function to be linear between array points
+# Return the two indices and the scale factor
+#
+
+sub indices_scale {
+ my ($xmin,$xmax,$x)=@_;
+ my $i=&array_index($xmin,$xmax,$x);
+ my $xr=&index_x($xmin,$xmax,$i);
+ &Apache::lonnet::logthis("x:$x i:$i xr:$xr");
+ if ($xr<$x) {
+# Desired x is right of array index
+ if ($i>=200) { return (200,200,0); }
+ return($i,$i+1,200.*($x-$xr)/($xmax-$xmin));
+ } elsif ($xr>$x) {
+# Desired x is left of array index
+ if ($i<=0) { return (0,0,0); }
+ return($i-1,$i,1.-200.*($xr-$x)/($xmax-$xmin));
+ } else {
+# Desired x is at array index (unlikely, but ...)
+ if ($i>=200) { return (200,200,0); }
+ if ($i<=0) { return (0,0,0); }
+ return ($i,$i,0);
+ }
+}
+
+#
+# Function value
+#
+
+sub func_val {
+ my ($xmin,$xmax,$x)=@_;
+ my ($il,$ih,$factor)=&indices_scale($xmin,$xmax,$x);
+ my $fl=$Apache::functionplotresponse::func[$il];
+ my $fh=$Apache::functionplotresponse::func[$ih];
+ unless (defined($fl) || defined($fh)) { return undef; }
+ unless (defined($fl)) { return $fh; }
+ unless (defined($fh)) { return $fl; }
+ my $func=$fl+$factor*($fh-$fl);
+ &Apache::lonnet::logthis("x:$x func:$func factor:$factor il:$il ih:$ih fil:$fl fih:$fh");
+ return $func;
}
#
@@ -671,6 +722,26 @@
} else {
$ad='INCORRECT';
}
+ &func_val($xmin,$xmax,3.96);
+
+ &func_val($xmin,$xmax,3.965);
+
+ &func_val($xmin,$xmax,3.97);
+ &func_val($xmin,$xmax,3.975);
+ &func_val($xmin,$xmax,3.98);
+
+ &func_val($xmin,$xmax,3.985);
+ &func_val($xmin,$xmax,3.99);
+ &func_val($xmin,$xmax,3.995);
+
+ &func_val($xmin,$xmax,4);
+ &func_val($xmin,$xmax,4.05);
+ &func_val($xmin,$xmax,4.1);
+
+ &func_val($xmin,$xmax,4.15);
+ &func_val($xmin,$xmax,4.2);
+ &func_val($xmin,$xmax,4.25);
+
#
# Store grading info
#