Diff for /loncom/homework/functionplotresponse.pm between versions 1.21 and 1.23

version 1.21, 2010/10/31 12:33:02 version 1.23, 2010/11/06 14:37:24
Line 363  sub end_splinerule { Line 363  sub end_splinerule {
   
   
 #  #
 # <spline label="..." 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 371  sub start_spline { Line 371  sub start_spline {
    my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
    my $result='';     my $result='';
    if ($target eq 'web') {     if ($target eq 'web') {
       my $label=&Apache::lonxml::get_param('label',$parstack,$safeeval);        my $label=&Apache::lonxml::get_param('index',$parstack,$safeeval);
       $Apache::functionplotresponse::counter++;        $Apache::functionplotresponse::counter++;
       if ($label=~/\W/) {        if ($label=~/\W/) {
          &Apache::lonxml::warning(&mt('Spline labels should only contain alphanumeric characters.'));           &Apache::lonxml::warning(&mt('Spline indices should only contain alphanumeric characters.'));
       }        }
       $label=~s/\W//gs;        $label=~s/\W//gs;
       unless ($label) { $label='S'.$Apache::functionplotresponse::counter; }        unless ($label) { 
            $label='S'.$Apache::functionplotresponse::counter; 
         } else {
            $label='S'.$label;
         }
       if ($Apache::functionplotresponse::splineorder{$label}) {        if ($Apache::functionplotresponse::splineorder{$label}) {
          &Apache::lonxml::error(&mt('Spline labels must be unique.'));           &Apache::lonxml::error(&mt('Spline indices must be unique.'));
       }        }
   
       my $order=&Apache::lonxml::get_param('order',$parstack,$safeeval);        my $order=&Apache::lonxml::get_param('order',$parstack,$safeeval);
Line 404  sub start_spline { Line 408  sub start_spline {
       $Apache::functionplotresponse::splinescaley{$label}=$sy;        $Apache::functionplotresponse::splinescaley{$label}=$sy;
    } elsif ($target eq 'edit') {     } elsif ($target eq 'edit') {
         $result=&Apache::edit::tag_start($target,$token,'Spline').          $result=&Apache::edit::tag_start($target,$token,'Spline').
              &Apache::edit::text_arg('Label:','label',               &Apache::edit::text_arg('Index:','index',
                                      $token,'4').'&nbsp;'.                                       $token,'4').'&nbsp;'.
              &Apache::edit::select_arg('Order:','order',               &Apache::edit::select_arg('Order:','order',
                                   ['2','3','4','5','6','7','8','9'],$token).'&nbsp;'.                                    ['2','3','4','5','6','7','8','9'],$token).'&nbsp;'.
Line 419  sub start_spline { Line 423  sub start_spline {
              &Apache::edit::end_row();               &Apache::edit::end_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,'label','order','initx','inity',                                                   $safeeval,'index','order','initx','inity',
                                                            'scalex','scaley');                                                             'scalex','scaley');
     if ($constructtag) { $result=&Apache::edit::rebuild_tag($token); }      if ($constructtag) { $result=&Apache::edit::rebuild_tag($token); }
   }    }
Line 524  sub indices_scale { Line 528  sub indices_scale {
    my ($xmin,$xmax,$x)=@_;     my ($xmin,$xmax,$x)=@_;
    my $i=&array_index($xmin,$xmax,$x);     my $i=&array_index($xmin,$xmax,$x);
    my $xr=&index_x($xmin,$xmax,$i);     my $xr=&index_x($xmin,$xmax,$i);
    &Apache::lonnet::logthis("x:$x i:$i xr:$xr");  
    if ($xr<$x) {     if ($xr<$x) {
 # Desired x is right of array index  # Desired x is right of array index
       if ($i>=200) { return (200,200,0); }        if ($i>=200) { return (200,200,0); }
Line 553  sub func_val { Line 556  sub func_val {
    unless (defined($fl) || defined($fh)) { return undef; }     unless (defined($fl) || defined($fh)) { return undef; }
    unless (defined($fl)) { return $fh; }     unless (defined($fl)) { return $fh; }
    unless (defined($fh)) { return $fl; }     unless (defined($fh)) { return $fl; }
    my $func=$fl+$factor*($fh-$fl);     return $fl+$factor*($fh-$fl);
    &Apache::lonnet::logthis("x:$x func:$func factor:$factor il:$il ih:$ih fil:$fl fih:$fh");  }
    return $func;  
   #
   # First derivative
   #
   
   sub dfuncdx_val {
      my ($xmin,$xmax,$x)=@_;
      my ($il,$ih,$factor)=&indices_scale($xmin,$xmax,$x);
      my $fl=$Apache::functionplotresponse::dfuncdx[$il];
      my $fh=$Apache::functionplotresponse::dfuncdx[$ih];
      unless (defined($fl) || defined($fh)) { return undef; }
      unless (defined($fl)) { return $fh; }
      unless (defined($fh)) { return $fl; }
      return $fl+$factor*($fh-$fl);
   }
   
   #
   # Second derivative
   #
   
   sub d2funcdx2_val {
      my ($xmin,$xmax,$x)=@_;
      my ($il,$ih,$factor)=&indices_scale($xmin,$xmax,$x);
      my $fl=$Apache::functionplotresponse::d2funcdx2[$il];
      my $fh=$Apache::functionplotresponse::d2funcdx2[$ih];
      unless (defined($fl) || defined($fh)) { return undef; }
      unless (defined($fl)) { return $fh; }
      unless (defined($fh)) { return $fl; }
      return $fl+$factor*($fh-$fl);
 }  }
   
 #  #
Line 566  sub populate_arrays { Line 597  sub populate_arrays {
     my ($id,$xmin,$xmax)=@_;      my ($id,$xmin,$xmax)=@_;
     for (my $i=0; $i<=200; $i++) {      for (my $i=0; $i<=200; $i++) {
        $Apache::functionplotresponse::func[$i]=undef;         $Apache::functionplotresponse::func[$i]=undef;
        $Apache::functionplotresponse::dfunddx[$i]=undef;         $Apache::functionplotresponse::dfuncdx[$i]=undef;
        $Apache::functionplotresponse::d2funcd2x[$i]=undef;         $Apache::functionplotresponse::d2funcd2x[$i]=undef;
     }      }
     unless ($xmax>$xmin) { return 'no_func'; }      unless ($xmax>$xmin) { return 'no_func'; }
Line 591  sub populate_arrays { Line 622  sub populate_arrays {
                 if (($xi>$xiold) && ($xi>=0) && ($xi<=200)) {                  if (($xi>$xiold) && ($xi>=0) && ($xi<=200)) {
                    if (defined($Apache::functionplotresponse::func[$xi])) { return 'no_func'; }                     if (defined($Apache::functionplotresponse::func[$xi])) { return 'no_func'; }
                    $xiold=$xi;                     $xiold=$xi;
   # Function value
                    $Apache::functionplotresponse::func[$xi]=&cubic_hermite($t,@yparms);                     $Apache::functionplotresponse::func[$xi]=&cubic_hermite($t,@yparms);
   # dy/dx=dy/dt/(dx/dt)
                      my $dxdt=&ddt_cubic_hermite($t,@xparms);
                      if ($dxdt) {
                         $Apache::functionplotresponse::dfuncdx[$xi]=&ddt_cubic_hermite($t,@yparms)/$dxdt;
                      }
   # d^2y/dx^2
                      my $d2xdt2=&d2dt2_cubic_hermite($t,@xparms);
                      if ($d2xdt2) {
                         $Apache::functionplotresponse::d2funcd2x[$xi]=&d2dt2_cubic_hermite($t,@yparms)/$d2xdt2;
                      }
                 }                  }
             }              }
         }          }
Line 722  sub end_functionplotresponse { Line 764  sub end_functionplotresponse {
         } else {          } else {
            $ad='INCORRECT';             $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  # Store grading info

Removed from v.1.21  
changed lines
  Added in v.1.23


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>