It looks like you are working on an interesting problem. I'm hoping that eventually dragging the points on the graph will cause the coordinates for the point in the answer blanks for the inflection point, max, and min to change automatically. Any chance of that?
As for getting the hint for a list, here's one way to do it. I'm assuming you don't care about saying which point is the one that is close (since the mapping from points on the screen to positions in the list is not obvious), and just want a single message when at least one point is close but not equal.
Here's the sample code:
ANS($anser_list->cmp
(checker => sub {
my ($correct,$student,$ans) = @_;
if ($correct == $student) {$student->{isClose} = 0; return 1}
$student->{isClose} = 1 if Vector($correct-$student)->norm < .3*$tolerance;
return 0;
})->withPostFilter(AnswerHints(sub {
my ($correct,$student,$ans) = @_;
$student = List($student) unless $student->class eq "List";
foreach $point ($student->value) {return 1 if $point->{isClose}}
return 0;
} => ["You're close. You need to position the dots more precisely"]
)));
For a List() object, the
checker is used on the individual entries in the list, and may be called several times as it looks through the list to see which entries match. Our checker keeps track of whether an individual entry is close to one in the correct list (but not equal to it); each student answer is marked as to whether it is close or not. (When an entry is found to be equal, the List checker stops comparing that student answer, so we don't have to worry about
isClose being set again later).
When the post-filter runs, we scan through the student answers to see if any are close, and issue the hint in that case. The second line of the answer hint subroutine turns a single point into a list in the event that the student only types one point. This is not strictly necessary in your case, since the student is not actually typing the answer (it comes from the applet), but since others may use this as a template for their own problems, I include it here.
Hope that does what you need.
Davide