求两向量余弦角以及其平面法向量:
import numpy as np
def calculate_p_vector(x=np.array([1,0,0]),y=np.array([0,1,0]),z=np.array([0,0,1])):
xy_v=y-x
xz_v=z-x
xy_xz_dot=np.dot(xy_v,xz_v)#求点积
norm_xy=np.linalg.norm(xy_v)#求模
norm_xz=np.linalg.norm(xz_v)
cos_xy_xa=xy_xz_dot/(norm_xy*norm_xz)#cos(π/3)
angle_radians=np.arccos(cos_xy_xa)#π/3
angle_degree=np.degrees(angle_radians)#60度
vector_P=np.cross(xy_v,xz_v) #叉乘,计算法向量。1,1,1
print(vector_P)
calculate_p_vector()
由上可得余弦角以及法向量
接下来需要利用matplotlib的三角剖分库tri对一系列点进行三角剖分,
验证1:可以用自己定义的三角形网格进行3d绘图,ax.plot_trisurf()
验证2:可以利用tri库自带的mtri.LinearTriInterpolator()的__call__()方法对3d图形面上的点的z值进行计算
验证3:是否可以利用tri自带的calculate_plane_coefficients()函数对所有三角形面的平面方程系数进行计算
fig_4=plt.figure()
ax_4=fig_4.add_subplot(111,projection='3d')
x=np.array([0,1,2])
y=np.array([0,1])
u,v=np.meshgrid(x,y)
u,v=u.flatten(),v.flatten()
t=np.array([[0,1,3],[1,3,4],[1,4,5],[1,2,5]])
z=np.array([1,0,1,0,0,0])
tr=mtri.Triangulation(u,v,triangles=t)
ax_4.plot_trisurf(tr,z)
plt.show()
证明可以自定义绘制三角形3d图。验证1通过
h=mtri.LinearTriInterpolator(tr,z)
print(h.__call__(0.5,0.5)) #0.0
print(h.__call__(0.25,0.25)) #0.5
print(h.__call__(0.25,0.75)) #0.0
验证2大致通过
ve=tr.calculate_plane_coefficients(z)
print(ve)
得到的值与法向量值很明显与3d面上的法向量值不一致,可能是我还没弄明白数学定义,也可能是没用好这个方法。