[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
 #