为什么这个法线的解法是正确的? 是否可以提供算法的证明文章?

已知一个方法 float verticalDistance(float3 p,surface s)返回点到面的垂直距离. 设 射线ray 与 surface s 交于点 P,则s 在 P点的法线为:设float a= 0.0001f

float x = verticalDistance(float3(p.x+a,p.y,p.z),s)-verticalDistance(float3(p.x-a,p.y,p.z),s);

float y = verticalDistance(float3(p.x,p.y+a,p.z),s)-verticalDistance(float3(p.x,p.y-a,p.z),s);

float z = verticalDistance(float3(p.x,p.y,p.z+a),s)-verticalDistance(float3(p.x,p.y,p.z-a),s);

normal = normalize( float3(x,y,z));

这个算法是可行的 但是为什么这样计算?有哪位大神可以给推荐一下相关算法么?

https://www.cnblogs.com/freeopen/p/5482961.html