作者:qaz2502919927 | 来源:互联网 | 2023-06-14 14:08
这是CSDN问答专栏里有人提出的问题。解题思路如下:求出两个垂直于向量op的不共线的向量v1和v2,根据这两个向量得到点p1和p2,加上o点,通过三点得到平面方程的4个参数。关于向量计算的更多知识点,请参考拙作《细说NumPy数组的四种乘法,带你走进向量运算的奇妙世界》。
完整代码如下。
import numpy as npdef get_ortho(op):"""返回垂直于向量op的两个向量"""if not op.any(): return Nonei = np.where(op!=0)[0][0] v1 = np.ones(op.shape, dtype=np.float64) v2 = np.arange(op.size, dtype=np.float64) v1[i] = 0 v2[i] = 0 v1[i] = -np.dot(op,v1)/op[i]v2[i] = -np.dot(op,v2)/op[i]return v1, v2def get_plane_by_three_point(p1, p2, p3):"""根据三点坐标返回平面方程"""x1, y1, z1 = p1x2, y2, z2 = p2x3, y3, z3 = p3a = (y2-y1)*(z3-z1) - (y3-y1)*(z2-z1)b = (z2-z1)*(x3-x1) - (z3-z1)*(x2-x1)c = (x2-x1)*(y3-y1) - (x3-x1)*(y2-y1)d = a*x1 - b*y1 - c*z1return a, b, c, ddef demo(o, p):"""点o为点p在某平面的投影,计算该平面方程"""o = np.array(o)p = np.array(p)op = p - ov1, v2 = get_ortho(op)p1 = o + v1p2 = o + v2a, b, c, d = get_plane_by_three_point(p1, p2, o)print('%fx + %fy + %fz + %f = 0'%(a, b, c, d))if __name__ == '__main__':o, p = (0,0,0), (1,0,0)demo(o, p)o, p = (1,2,3), (3,5,2)demo(o, p)