Thanks gile!
Something I think is important to note here is that when iterating through the neighbors it should be done by grabbing the nearest in the group as I have done. Reason being is this approximates creating triangular faces and averaging them together weighted by face area. This is because vector cross product a x b = |a|*|b|*sin(angle between).
Also, consider the array of vectors {a:(1,0,0),b:(-1,0,0),c:(0,1,0),d:(0,-1,0)}
If they were evaluated linearly the only non-zero result would be b x c