the normal is the cross product of the vectors from the adjacent horizontal and vertical points.
The hight of the point in question is mostly irelevant, since I'm trying to fit a curve over a set of points to find out what the normal should be, and it turns out that it only really matters where the adjacent points are. This method isn't perfect, since the normal of the fitted curve would change slightly if suther away points were included, but it's a fairly good first-order match.
Here's a doodle to show what I mean:
(The normal is slightly out, I think it should be slightly more vertical, but it shows the principle)
In all 3 examples the adjacent points are in the same place, it's just the middle point that changes, but as you can see the curve fitted through all 3 points has the same normal, which is at 90' to the vector between the two adjacent points.
If the point we're calculating wasn't equi-distant between the two points, then it'd be more complex, but since it is in my code, it seems sensible to make use of it.
Now this isn't perfect, since you could argue that the curve that's been drawn isn't quite right, but it's fairly good, cheap to calculate, and gives consistent results.