【三维建模】计算三维平面切割STL模型后剩下的模型体积
由于本人要计算油箱的油液体积,所以要计算油面下的体积
首先是stl模型体积计算公式,看的是《三维空间任意多面体体积的一种坐标计算法_韦进》
然后根据这个就可以计算各个stl模型的体积,现在我想要得到切割后的体积,
可以修改stl模型,让切割面另一边的点都投射到切割的平面上,并删除原点
这样平面另一边就没有体积了
但是由于stl模型是三角形组成,可能会有一个点在平面另一边另外两个点不在另一边,或者一个点在平面另一边另外两个点不在另一边
所以需要将这种情况下的三角形变成三个三角形,例:B点在平面外,B A C -> B1 OA OC,OAAOC,A C OC
B1是B垂直投射到平面后的点,OA,OC是BA,BC与切割平面的交点,然后因为B A C被切割了,A OA OC C 是个四边形,要变成两个三角形
所以这种情况就把原来的三角形变成三个三角形,两个点在平面外的也同理
首先解决点垂直投射到平面如何计算
参考 https://blog.csdn.net/soaryy/article/details/82884691
#点在三维平面上的投影 #Ax+By+Cz+D=0 #输入点和平面参数,返回垂直投射点 def fun(x0,y0,z0,A,B,C,D): temp=A**2+B**2+C**2 x1=((B**2+C**2)*x0-A*(B*y0+C*z0+D))/temp y1=((A**2+C**2)*y0-B*(A*x0+C*z0+D))/temp z1=((A**2+B**2)*z0-C*(A*x0+B*y0+D))/temp return x1,y1,z1
然后OA,OC点的是直线和平面相交点的问题
参考 https://blog.csdn.net/smallflyingpig/article/details/51234711
#直线到平面的交点 #Ax+By+Cz+D=0 #输入两点确定的直线,以及平面参数,返回交点 def fun2(x1,y1,z1,x2,y2,z2,A,B,C,D): P1P2=[x2-x1,y2-y1,z2-z1] i=0 num=A*x1+B*y1+C*z1+D den = A*P1P2[0]+B*P1P2[1]+C*P1P2[2] n=math.fabs(num/den) x=x1+n*P1P2[0] y=y1+n*P1P2[1] z=z1+n*P1P2[2] return x,y,z
最后就可以对stl模型进行修改了
stl模型读取以及修改参考numpy-stl中文手册 https://blog.csdn.net/ucsheep/article/details/121463494
#输入模型,和平面参数,输出切割后的模型 def fun3(your_mesh, A, B, C, D): #不加copy会影响到原来的内存 new_vectors = your_mesh.vectors.copy() num = [0, 0, 0] for i in range(len(your_mesh.vectors)): #计算三个点和平面的关系 for j in range(3): num[j] = your_mesh.vectors[i][j][0] * A + your_mesh.vectors[i][j][1] * B + your_mesh.vectors[i][j][2] * C + D #进行投影 if num[0] > 0 and num[1] > 0 and num[2] > 0: # 三个点都要投影的情况 for j in range(3): x, y, z = fun(your_mesh.vectors[i][j][0], your_mesh.vectors[i][j][1], your_mesh.vectors[i][j][2], A, B,C, D) new_vectors[i][j][0], new_vectors[i][j][1], new_vectors[i][j][2] = x, y, z elif not num[0] > 0 and num[1] > 0 and num[2] > 0: # 1,2点要投影的情况 x01, y01, z01 = fun2(your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], A, B,C, D) x02, y02, z02 = fun2(your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], A, B,C, D) x1, y1, z1 = fun(your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], A, B, C,D) x2, y2, z2 = fun(your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], A, B, C,D) new_matix1 = np.array([[[x01, y01, z01], [x1, y1, z1], [x2, y2, z2]]]) new_matix2 = np.array([[[x02, y02, z02], [x01, y01, z01], [x2, y2, z2]]]) new_vectors = np.concatenate((new_vectors, new_matix1), axis=0) new_vectors = np.concatenate((new_vectors, new_matix2), axis=0) new_vectors[i][1][0], new_vectors[i][1][1], new_vectors[i][1][2] = x01, y01, z01 new_vectors[i][2][0], new_vectors[i][2][1], new_vectors[i][2][2] = x02, y02, z02 elif num[0] > 0 and not num[1] > 0 and num[2] > 0: # 0,2点要投影的情况 x10, y10, z10 = fun2(your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], A, B,C, D) x12, y12, z12 = fun2(your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], A, B,C, D) x0, y0, z0 = fun(your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], A, B, C,D) x2, y2, z2 = fun(your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], A, B, C,D) new_matix1 = np.array([[[x10, y10, z10], [x0, y0, z0], [x2, y2, z2]]]) new_matix2 = np.array([[[x12, y12, z12], [x10, y10, z10], [x2, y2, z2]]]) new_vectors = np.concatenate((new_vectors, new_matix1), axis=0) new_vectors = np.concatenate((new_vectors, new_matix2), axis=0) new_vectors[i][0][0], new_vectors[i][0][1], new_vectors[i][0][2] = x10, y10, z10 new_vectors[i][2][0], new_vectors[i][2][1], new_vectors[i][2][2] = x12, y12, z12 elif num[0] > 0 and num[1] > 0 and not num[2] > 0: # 0,1点要投影的情况 x20, y20, z20 = fun2(your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], A, B,C, D) x21, y21, z21 = fun2(your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], A, B,C, D) x0, y0, z0 = fun(your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], A, B, C,D) x1, y1, z1 = fun(your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], A, B, C,D) new_matix1 = np.array([[[x20, y20, z20], [x0, y0, z0], [x1, y1, z1]]]) new_matix2 = np.array([[[x21, y21, z21], [x20, y20, z20], [x1, y1, z1]]]) new_vectors = np.concatenate((new_vectors, new_matix1), axis=0) new_vectors = np.concatenate((new_vectors, new_matix2), axis=0) new_vectors[i][0][0], new_vectors[i][0][1], new_vectors[i][0][2] = x20, y20, z20 new_vectors[i][1][0], new_vectors[i][1][1], new_vectors[i][1][2] = x21, y21, z21 elif not num[0] > 0 and not num[1] > 0 and num[2] > 0: # 2点被投影的情况 x20, y20, z20 = fun2(your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], A, B,C, D) x21, y21, z21 = fun2(your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], A, B,C, D) x0, y0, z0 = your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2] x1, y1, z1 = your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2] x2, y2, z2 = fun(your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], A, B, C,D) new_matix1 = np.array([[[x20, y20, z20], [x0, y0, z0], [x1, y1, z1]]]) new_matix2 = np.array([[[x21, y21, z21], [x20, y20, z20], [x1, y1, z1]]]) new_vectors = np.concatenate((new_vectors, new_matix1), axis=0) new_vectors = np.concatenate((new_vectors, new_matix2), axis=0) new_vectors[i][0][0], new_vectors[i][0][1], new_vectors[i][0][2] = x20, y20, z20 new_vectors[i][1][0], new_vectors[i][1][1], new_vectors[i][1][2] = x21, y21, z21 new_vectors[i][2][0], new_vectors[i][2][1], new_vectors[i][2][2] = x2, y2, z2 elif not num[0] > 0 and num[1] > 0 and not num[2] > 0: # 1点被投影的情况 x10, y10, z10 = fun2(your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], A, B,C, D) x12, y12, z12 = fun2(your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], A, B,C, D) x0, y0, z0 = your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2] x2, y2, z2 = your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2] x1, y1, z1 = fun(your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], A, B, C,D) new_matix1 = np.array([[[x10, y10, z10], [x0, y0, z0], [x2, y2, z2]]]) new_matix2 = np.array([[[x12, y12, z12], [x10, y10, z10], [x2, y2, z2]]]) new_vectors = np.concatenate((new_vectors, new_matix1), axis=0) new_vectors = np.concatenate((new_vectors, new_matix2), axis=0) new_vectors[i][0][0], new_vectors[i][0][1], new_vectors[i][0][2] = x10, y10, z10 new_vectors[i][1][0], new_vectors[i][1][1], new_vectors[i][1][2] = x1, y1, z1 new_vectors[i][2][0], new_vectors[i][2][1], new_vectors[i][2][2] = x12, y12, z12 elif num[0] > 0 and not num[1] > 0 and not num[2] > 0: # 0点被投影的情况 x01, y01, z01 = fun2(your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], A, B,C, D) x02, y02, z02 = fun2(your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], A, B,C, D) x1, y1, z1 = your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2] x2, y2, z2 = your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2] x0, y0, z0 = fun(your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], A, B, C,D) new_matix1 = np.array([[[x01, y01, z01], [x1, y1, z1], [x2, y2, z2]]]) new_matix2 = np.array([[[x02, y02, z02], [x01, y01, z01], [x2, y2, z2]]]) new_vectors = np.concatenate((new_vectors, new_matix1), axis=0) new_vectors = np.concatenate((new_vectors, new_matix2), axis=0) new_vectors[i][0][0], new_vectors[i][0][1], new_vectors[i][0][2] = x0, y0, z0 new_vectors[i][1][0], new_vectors[i][1][1], new_vectors[i][1][2] = x01, y01, z01 new_vectors[i][2][0], new_vectors[i][2][1], new_vectors[i][2][2] = x02, y02, z02 print(new_vectors.shape) data = np.zeros(new_vectors.shape[0], dtype=mesh.Mesh.dtype) data['vectors']=new_vectors return mesh.Mesh(data)
以下是一些切割效果
平面x=0:
最后计算体积:
sum=0 for i in range(len(your_mesh.x)): sum+=np.linalg.det(np.array( [your_mesh.x[i],your_mesh.y[i],your_mesh.z[i]])) sum/=6 print('体积'+str(sum))
由于我们只计算体积,所以这种情况不影响,因为投射到平面上的点形成的平面是不占体积的
平面 x+z=0
免责声明:本博客只用于本人学习用,不保证代码的正确性,出了问题本人不负责
以下是完整代码:
import math import numpy as np import pandas as pd from stl import mesh from mpl_toolkits import mplot3d from matplotlib import pyplot #点在三维平面上的投影 #Ax+By+Cz+D=0 #输入点和平面参数,返回垂直投射点 def fun(x0,y0,z0,A,B,C,D): temp=A**2+B**2+C**2 x1=((B**2+C**2)*x0-A*(B*y0+C*z0+D))/temp y1=((A**2+C**2)*y0-B*(A*x0+C*z0+D))/temp z1=((A**2+B**2)*z0-C*(A*x0+B*y0+D))/temp return x1,y1,z1 #直线到平面的交点 #Ax+By+Cz+D=0 #输入两点确定的直线,以及平面参数,返回交点 def fun2(x1,y1,z1,x2,y2,z2,A,B,C,D): P1P2=[x2-x1,y2-y1,z2-z1] i=0 num=A*x1+B*y1+C*z1+D den = A*P1P2[0]+B*P1P2[1]+C*P1P2[2] n=math.fabs(num/den) x=x1+n*P1P2[0] y=y1+n*P1P2[1] z=z1+n*P1P2[2] return x,y,z your_mesh = mesh.Mesh.from_file('E:/Desktop/code/Python/Django/FuelSensorSys/static/model/stl1.stl') x=your_mesh.x.reshape(1,-1)[0] y=your_mesh.y.reshape(1,-1)[0] z=your_mesh.z.reshape(1,-1)[0] translate_x=np.mean(x) translate_y=np.mean(y) translate_z=np.min(z) for i in range(len(your_mesh.vectors)): for j in range(3): your_mesh.vectors[i][j][0] -= translate_x your_mesh.vectors[i][j][1] -= translate_y your_mesh.vectors[i][j][2] -= translate_z #输入模型,和平面参数,输出切割后的模型 def fun3(your_mesh, A, B, C, D): #不加copy会影响到原来的内存 new_vectors = your_mesh.vectors.copy() num = [0, 0, 0] for i in range(len(your_mesh.vectors)): #计算三个点和平面的关系 for j in range(3): num[j] = your_mesh.vectors[i][j][0] * A + your_mesh.vectors[i][j][1] * B + your_mesh.vectors[i][j][2] * C + D #进行投影 if num[0] > 0 and num[1] > 0 and num[2] > 0: # 三个点都要投影的情况 for j in range(3): x, y, z = fun(your_mesh.vectors[i][j][0], your_mesh.vectors[i][j][1], your_mesh.vectors[i][j][2], A, B,C, D) new_vectors[i][j][0], new_vectors[i][j][1], new_vectors[i][j][2] = x, y, z elif not num[0] > 0 and num[1] > 0 and num[2] > 0: # 1,2点要投影的情况 x01, y01, z01 = fun2(your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], A, B,C, D) x02, y02, z02 = fun2(your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], A, B,C, D) x1, y1, z1 = fun(your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], A, B, C,D) x2, y2, z2 = fun(your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], A, B, C,D) new_matix1 = np.array([[[x01, y01, z01], [x1, y1, z1], [x2, y2, z2]]]) new_matix2 = np.array([[[x02, y02, z02], [x01, y01, z01], [x2, y2, z2]]]) new_vectors = np.concatenate((new_vectors, new_matix1), axis=0) new_vectors = np.concatenate((new_vectors, new_matix2), axis=0) new_vectors[i][1][0], new_vectors[i][1][1], new_vectors[i][1][2] = x01, y01, z01 new_vectors[i][2][0], new_vectors[i][2][1], new_vectors[i][2][2] = x02, y02, z02 elif num[0] > 0 and not num[1] > 0 and num[2] > 0: # 0,2点要投影的情况 x10, y10, z10 = fun2(your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], A, B,C, D) x12, y12, z12 = fun2(your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], A, B,C, D) x0, y0, z0 = fun(your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], A, B, C,D) x2, y2, z2 = fun(your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], A, B, C,D) new_matix1 = np.array([[[x10, y10, z10], [x0, y0, z0], [x2, y2, z2]]]) new_matix2 = np.array([[[x12, y12, z12], [x10, y10, z10], [x2, y2, z2]]]) new_vectors = np.concatenate((new_vectors, new_matix1), axis=0) new_vectors = np.concatenate((new_vectors, new_matix2), axis=0) new_vectors[i][0][0], new_vectors[i][0][1], new_vectors[i][0][2] = x10, y10, z10 new_vectors[i][2][0], new_vectors[i][2][1], new_vectors[i][2][2] = x12, y12, z12 elif num[0] > 0 and num[1] > 0 and not num[2] > 0: # 0,1点要投影的情况 x20, y20, z20 = fun2(your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], A, B,C, D) x21, y21, z21 = fun2(your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], A, B,C, D) x0, y0, z0 = fun(your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], A, B, C,D) x1, y1, z1 = fun(your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], A, B, C,D) new_matix1 = np.array([[[x20, y20, z20], [x0, y0, z0], [x1, y1, z1]]]) new_matix2 = np.array([[[x21, y21, z21], [x20, y20, z20], [x1, y1, z1]]]) new_vectors = np.concatenate((new_vectors, new_matix1), axis=0) new_vectors = np.concatenate((new_vectors, new_matix2), axis=0) new_vectors[i][0][0], new_vectors[i][0][1], new_vectors[i][0][2] = x20, y20, z20 new_vectors[i][1][0], new_vectors[i][1][1], new_vectors[i][1][2] = x21, y21, z21 elif not num[0] > 0 and not num[1] > 0 and num[2] > 0: # 2点被投影的情况 x20, y20, z20 = fun2(your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], A, B,C, D) x21, y21, z21 = fun2(your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], A, B,C, D) x0, y0, z0 = your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2] x1, y1, z1 = your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2] x2, y2, z2 = fun(your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], A, B, C,D) new_matix1 = np.array([[[x20, y20, z20], [x0, y0, z0], [x1, y1, z1]]]) new_matix2 = np.array([[[x21, y21, z21], [x20, y20, z20], [x1, y1, z1]]]) new_vectors = np.concatenate((new_vectors, new_matix1), axis=0) new_vectors = np.concatenate((new_vectors, new_matix2), axis=0) new_vectors[i][0][0], new_vectors[i][0][1], new_vectors[i][0][2] = x20, y20, z20 new_vectors[i][1][0], new_vectors[i][1][1], new_vectors[i][1][2] = x21, y21, z21 new_vectors[i][2][0], new_vectors[i][2][1], new_vectors[i][2][2] = x2, y2, z2 elif not num[0] > 0 and num[1] > 0 and not num[2] > 0: # 1点被投影的情况 x10, y10, z10 = fun2(your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], A, B,C, D) x12, y12, z12 = fun2(your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], A, B,C, D) x0, y0, z0 = your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2] x2, y2, z2 = your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2] x1, y1, z1 = fun(your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], A, B, C,D) new_matix1 = np.array([[[x10, y10, z10], [x0, y0, z0], [x2, y2, z2]]]) new_matix2 = np.array([[[x12, y12, z12], [x10, y10, z10], [x2, y2, z2]]]) new_vectors = np.concatenate((new_vectors, new_matix1), axis=0) new_vectors = np.concatenate((new_vectors, new_matix2), axis=0) new_vectors[i][0][0], new_vectors[i][0][1], new_vectors[i][0][2] = x10, y10, z10 new_vectors[i][1][0], new_vectors[i][1][1], new_vectors[i][1][2] = x1, y1, z1 new_vectors[i][2][0], new_vectors[i][2][1], new_vectors[i][2][2] = x12, y12, z12 elif num[0] > 0 and not num[1] > 0 and not num[2] > 0: # 0点被投影的情况 x01, y01, z01 = fun2(your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], A, B,C, D) x02, y02, z02 = fun2(your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], A, B,C, D) x1, y1, z1 = your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2] x2, y2, z2 = your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2] x0, y0, z0 = fun(your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], A, B, C,D) new_matix1 = np.array([[[x01, y01, z01], [x1, y1, z1], [x2, y2, z2]]]) new_matix2 = np.array([[[x02, y02, z02], [x01, y01, z01], [x2, y2, z2]]]) new_vectors = np.concatenate((new_vectors, new_matix1), axis=0) new_vectors = np.concatenate((new_vectors, new_matix2), axis=0) new_vectors[i][0][0], new_vectors[i][0][1], new_vectors[i][0][2] = x0, y0, z0 new_vectors[i][1][0], new_vectors[i][1][1], new_vectors[i][1][2] = x01, y01, z01 new_vectors[i][2][0], new_vectors[i][2][1], new_vectors[i][2][2] = x02, y02, z02 print(new_vectors.shape) data = np.zeros(new_vectors.shape[0], dtype=mesh.Mesh.dtype) data['vectors']=new_vectors return mesh.Mesh(data) # data = np.zeros(2, dtype=mesh.Mesh.dtype) # data['vectors'][0]=np.array([[10,0,-10],[-10,0, 10],[10,0,10]]) # data['vectors'][1]=np.array([[10,0,-10],[-10,0, 10],[-10,0,-10]]) # my_mesh=mesh.Mesh(data) data = np.zeros(6, dtype=mesh.Mesh.dtype) # 立方体顶部 data['vectors'][0] = np.array([[0, 1, 1],[1, 0, 1],[0, 0, 1]]) data['vectors'][1] = np.array([[1, 0, 1],[0, 1, 1],[1, 1, 1]]) # 前面 data['vectors'][2] = np.array([[1, 0, 0],[1, 0, 1],[1, 1, 0]]) data['vectors'][3] = np.array([[1, 1, 1],[1, 0, 1],[1, 1, 0]]) # 左面 data['vectors'][4] = np.array([[0, 0, 0],[1, 0, 0],[1, 0, 1]]) data['vectors'][5] = np.array([[0, 0, 0],[0, 0, 1],[1, 0, 1]]) # Since the cube faces are from 0 to 1 we can move it to the middle by # substracting .5 data['vectors'] -= .5 cube_back = mesh.Mesh(data.copy()) cube_front = mesh.Mesh(data.copy()) # Rotate 90 degrees over the X axis followed by the Y axis followed by the # X axis cube_back.rotate([0.5, 0.0, 0.0], math.radians(90)) cube_back.rotate([0.0, 0.5, 0.0], math.radians(90)) cube_back.rotate([0.5, 0.0, 0.0], math.radians(90)) cube = mesh.Mesh(np.concatenate([cube_back.data.copy(),cube_front.data.copy(),])) my_mesh=your_mesh figure = pyplot.figure() axes = mplot3d.Axes3D(figure) # 加载stl文件并将向量加载到 plot axes.add_collection3d(mplot3d.art3d.Poly3DCollection(my_mesh.vectors)) scale = my_mesh.points.flatten() axes.auto_scale_xyz(scale, scale, scale) pyplot.show() new_mesh=fun3(my_mesh,1,0,1,0) figure = pyplot.figure() axes = mplot3d.Axes3D(figure) # 加载stl文件并将向量加载到 plot axes.add_collection3d(mplot3d.art3d.Poly3DCollection(new_mesh.vectors)) scale = new_mesh.points.flatten() axes.auto_scale_xyz(scale, scale, scale) # 在屏幕上显示这个plot pyplot.show() sum=0 for i in range(len(your_mesh.x)): sum+=np.linalg.det(np.array( [your_mesh.x[i],your_mesh.y[i],your_mesh.z[i]])) sum/=6 print('体积'+str(sum)) sum1=0 for i in range(len(new_mesh.x)): sum1+=np.linalg.det(np.array( [new_mesh.x[i],new_mesh.y[i],new_mesh.z[i]])) sum1/=6 print('体积'+str(sum1)) print(sum/sum1)
---------------------------更新:现在可以控制stl切去平面以上,还是平面以下的部分
#点在三维平面上的投影 #Ax+By+Cz+D=0 #输入点和平面参数,返回垂直投射点 def fun(x0,y0,z0,A,B,C,D): temp=A**2+B**2+C**2 x1=((B**2+C**2)*x0-A*(B*y0+C*z0+D))/temp y1=((A**2+C**2)*y0-B*(A*x0+C*z0+D))/temp z1=((A**2+B**2)*z0-C*(A*x0+B*y0+D))/temp return x1,y1,z1 #直线到平面的交点 #Ax+By+Cz+D=0 #输入两点确定的直线,以及平面参数,返回交点 def fun2(x1,y1,z1,x2,y2,z2,A,B,C,D): P1P2=[x2-x1,y2-y1,z2-z1] i=0 num=A*x1+B*y1+C*z1+D den = A*P1P2[0]+B*P1P2[1]+C*P1P2[2] n=math.fabs(num/den) x=x1+n*P1P2[0] y=y1+n*P1P2[1] z=z1+n*P1P2[2] return x,y,z #输入模型,和平面参数,输出切割后的模型 #参数f f<0切去平面以上的, f>0切去平面以下的,等于0不切 def fun3(your_mesh, A, B, C, D,f): #不加copy会影响到原来的内存 new_vectors = your_mesh.vectors.copy() num = [0, 0, 0] for i in range(len(your_mesh.vectors)): #计算三个点和平面的关系 for j in range(3): num[j] = your_mesh.vectors[i][j][0] * A + your_mesh.vectors[i][j][1] * B + your_mesh.vectors[i][j][2] * C + D num[j] = f*num[j]#用来控制平面上面还是下面的被切割 #进行投影 if num[0] > 0 and num[1] > 0 and num[2] > 0: # 三个点都要投影的情况 for j in range(3): x, y, z = fun(your_mesh.vectors[i][j][0], your_mesh.vectors[i][j][1], your_mesh.vectors[i][j][2], A, B,C, D) new_vectors[i][j][0], new_vectors[i][j][1], new_vectors[i][j][2] = x, y, z elif not num[0] > 0 and num[1] > 0 and num[2] > 0: # 1,2点要投影的情况 x01, y01, z01 = fun2(your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], A, B,C, D) x02, y02, z02 = fun2(your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], A, B,C, D) x1, y1, z1 = fun(your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], A, B, C,D) x2, y2, z2 = fun(your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], A, B, C,D) new_matix1 = np.array([[[x01, y01, z01], [x1, y1, z1], [x2, y2, z2]]]) new_matix2 = np.array([[[x02, y02, z02], [x01, y01, z01], [x2, y2, z2]]]) new_vectors = np.concatenate((new_vectors, new_matix1), axis=0) new_vectors = np.concatenate((new_vectors, new_matix2), axis=0) new_vectors[i][1][0], new_vectors[i][1][1], new_vectors[i][1][2] = x01, y01, z01 new_vectors[i][2][0], new_vectors[i][2][1], new_vectors[i][2][2] = x02, y02, z02 elif num[0] > 0 and not num[1] > 0 and num[2] > 0: # 0,2点要投影的情况 x10, y10, z10 = fun2(your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], A, B,C, D) x12, y12, z12 = fun2(your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], A, B,C, D) x0, y0, z0 = fun(your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], A, B, C,D) x2, y2, z2 = fun(your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], A, B, C,D) new_matix1 = np.array([[[x10, y10, z10], [x0, y0, z0], [x2, y2, z2]]]) new_matix2 = np.array([[[x12, y12, z12], [x10, y10, z10], [x2, y2, z2]]]) new_vectors = np.concatenate((new_vectors, new_matix1), axis=0) new_vectors = np.concatenate((new_vectors, new_matix2), axis=0) new_vectors[i][0][0], new_vectors[i][0][1], new_vectors[i][0][2] = x10, y10, z10 new_vectors[i][2][0], new_vectors[i][2][1], new_vectors[i][2][2] = x12, y12, z12 elif num[0] > 0 and num[1] > 0 and not num[2] > 0: # 0,1点要投影的情况 x20, y20, z20 = fun2(your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], A, B,C, D) x21, y21, z21 = fun2(your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], A, B,C, D) x0, y0, z0 = fun(your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], A, B, C,D) x1, y1, z1 = fun(your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], A, B, C,D) new_matix1 = np.array([[[x20, y20, z20], [x0, y0, z0], [x1, y1, z1]]]) new_matix2 = np.array([[[x21, y21, z21], [x20, y20, z20], [x1, y1, z1]]]) new_vectors = np.concatenate((new_vectors, new_matix1), axis=0) new_vectors = np.concatenate((new_vectors, new_matix2), axis=0) new_vectors[i][0][0], new_vectors[i][0][1], new_vectors[i][0][2] = x20, y20, z20 new_vectors[i][1][0], new_vectors[i][1][1], new_vectors[i][1][2] = x21, y21, z21 elif not num[0] > 0 and not num[1] > 0 and num[2] > 0: # 2点被投影的情况 x20, y20, z20 = fun2(your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], A, B,C, D) x21, y21, z21 = fun2(your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], A, B,C, D) x0, y0, z0 = your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2] x1, y1, z1 = your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2] x2, y2, z2 = fun(your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], A, B, C,D) new_matix1 = np.array([[[x20, y20, z20], [x0, y0, z0], [x1, y1, z1]]]) new_matix2 = np.array([[[x21, y21, z21], [x20, y20, z20], [x1, y1, z1]]]) new_vectors = np.concatenate((new_vectors, new_matix1), axis=0) new_vectors = np.concatenate((new_vectors, new_matix2), axis=0) new_vectors[i][0][0], new_vectors[i][0][1], new_vectors[i][0][2] = x20, y20, z20 new_vectors[i][1][0], new_vectors[i][1][1], new_vectors[i][1][2] = x21, y21, z21 new_vectors[i][2][0], new_vectors[i][2][1], new_vectors[i][2][2] = x2, y2, z2 elif not num[0] > 0 and num[1] > 0 and not num[2] > 0: # 1点被投影的情况 x10, y10, z10 = fun2(your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], A, B,C, D) x12, y12, z12 = fun2(your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], A, B,C, D) x0, y0, z0 = your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2] x2, y2, z2 = your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2] x1, y1, z1 = fun(your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], A, B, C,D) new_matix1 = np.array([[[x10, y10, z10], [x0, y0, z0], [x2, y2, z2]]]) new_matix2 = np.array([[[x12, y12, z12], [x10, y10, z10], [x2, y2, z2]]]) new_vectors = np.concatenate((new_vectors, new_matix1), axis=0) new_vectors = np.concatenate((new_vectors, new_matix2), axis=0) new_vectors[i][0][0], new_vectors[i][0][1], new_vectors[i][0][2] = x10, y10, z10 new_vectors[i][1][0], new_vectors[i][1][1], new_vectors[i][1][2] = x1, y1, z1 new_vectors[i][2][0], new_vectors[i][2][1], new_vectors[i][2][2] = x12, y12, z12 elif num[0] > 0 and not num[1] > 0 and not num[2] > 0: # 0点被投影的情况 x01, y01, z01 = fun2(your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], A, B,C, D) x02, y02, z02 = fun2(your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], A, B,C, D) x1, y1, z1 = your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2] x2, y2, z2 = your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2] x0, y0, z0 = fun(your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], A, B, C,D) new_matix1 = np.array([[[x01, y01, z01], [x1, y1, z1], [x2, y2, z2]]]) new_matix2 = np.array([[[x02, y02, z02], [x01, y01, z01], [x2, y2, z2]]]) new_vectors = np.concatenate((new_vectors, new_matix1), axis=0) new_vectors = np.concatenate((new_vectors, new_matix2), axis=0) new_vectors[i][0][0], new_vectors[i][0][1], new_vectors[i][0][2] = x0, y0, z0 new_vectors[i][1][0], new_vectors[i][1][1], new_vectors[i][1][2] = x01, y01, z01 new_vectors[i][2][0], new_vectors[i][2][1], new_vectors[i][2][2] = x02, y02, z02 data = np.zeros(new_vectors.shape[0], dtype=mesh.Mesh.dtype) data['vectors']=new_vectors return mesh.Mesh(data) def get_volume(your_mesh): sum=0 for i in range(len(your_mesh.x)): sum+=np.linalg.det(np.array( [your_mesh.x[i],your_mesh.y[i],your_mesh.z[i]])) sum/=6 return sum
5.14更新
def get_volume(your_mesh): sum=0 for i in range(len(your_mesh.x)): add=np.linalg.det(np.array([your_mesh.x[i], your_mesh.y[i], your_mesh.z[i]])) if add<0:#add 为正行列式 add=-add sum+=add sum/=6 return sum
5.14更新
发现切少留多时体积计算正常,切多留少时体积出现问题,猜测是压缩成平面部分的体积出现问题,因此对fun3进行修改
后来发现需要原点在体积内部时论文的体积计算公式才成立
改进后的fun4,返回切割线以及剩下的stl
fun4切割策略
抛弃切割掉的部分,在切割面中心点做点,与切割线生成多个面成为切割面
#输入模型,和平面参数,输出切割后的模型 #参数f f<0切去平面以上的, f>0切去平面以下的,等于0不切 def fun4(your_mesh, A, B, C, D,f): #数据 arr=[] new_arr=[] #切割位 x_arr=[] y_arr = [] z_arr = [] num = [0, 0, 0] for i in range(len(your_mesh.vectors)): #计算三个点和平面的关系 for j in range(3): num[j] = your_mesh.vectors[i][j][0] * A + your_mesh.vectors[i][j][1] * B + your_mesh.vectors[i][j][2] * C + D num[j] = f*num[j]#用来控制平面上面还是下面的被切割 #进行投影 if num[0] > 0 and num[1] > 0 and num[2] > 0: # 三个点都要投影的情况 直接抛弃 pass elif not num[0] > 0 and not num[1] > 0 and not num[2] > 0: # 三个点都不投影的情况 保留 matix=[] for j in range(3): matix.append([your_mesh.vectors[i][j][0], your_mesh.vectors[i][j][1], your_mesh.vectors[i][j][2]]) arr.append(matix) elif not num[0] > 0 and num[1] > 0 and num[2] > 0: # 1,2点要投影的情况 x01, y01, z01 = fun2(your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], A, B,C, D) x02, y02, z02 = fun2(your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], A, B,C, D) x_arr.append(np.array([x01, x02])) y_arr.append(np.array([y01, y02])) z_arr.append(np.array([z01, z02])) arr.append([[your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2]], [x01, y01, z01],[x02, y02, z02]]) new_arr.append([[x01, y01, z01],[x02, y02, z02]]) elif num[0] > 0 and not num[1] > 0 and num[2] > 0: # 0,2点要投影的情况 x10, y10, z10 = fun2(your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], A, B,C, D) x12, y12, z12 = fun2(your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], A, B,C, D) x_arr.append(np.array([x10, x12])) y_arr.append(np.array([y10, y12])) z_arr.append(np.array([z10, z12])) arr.append([[your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2]], [x10, y10, z10], [x12, y12, z12]]) new_arr.append([[x10, y10, z10], [x12, y12, z12]]) elif num[0] > 0 and num[1] > 0 and not num[2] > 0: # 0,1点要投影的情况 x20, y20, z20 = fun2(your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], A, B,C, D) x21, y21, z21 = fun2(your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], A, B,C, D) x_arr.append(np.array([x20, x21])) y_arr.append(np.array([y20, y21])) z_arr.append(np.array([z20, z21])) arr.append([[your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2]], [x20, y20, z20], [x21, y21, z21]]) new_arr.append([[x20, y20, z20], [x21, y21, z21]]) elif not num[0] > 0 and not num[1] > 0 and num[2] > 0: # 2点被投影的情况 x20, y20, z20 = fun2(your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], A, B,C, D) x21, y21, z21 = fun2(your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], A, B,C, D) x_arr.append(np.array([x20, x21])) y_arr.append(np.array([y20, y21])) z_arr.append(np.array([z20, z21])) arr.append([[your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2]], [x21, y21, z21], [your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2]]]) arr.append([[your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2]], [x20, y20, z20],[x21, y21, z21]]) new_arr.append([[x20, y20, z20], [x21, y21, z21]]) elif not num[0] > 0 and num[1] > 0 and not num[2] > 0: # 1点被投影的情况 x10, y10, z10 = fun2(your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], A, B,C, D) x12, y12, z12 = fun2(your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], A, B,C, D) x_arr.append(np.array([x10, x12])) y_arr.append(np.array([y10, y12])) z_arr.append(np.array([z10, z12])) arr.append([[your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2]], [x12, y12, z12], [your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2]]]) arr.append([[your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2]], [x10, y10, z10],[x12, y12, z12]]) new_arr.append([[x10, y10, z10], [x12, y12, z12]]) elif num[0] > 0 and not num[1] > 0 and not num[2] > 0: # 0点被投影的情况 x01, y01, z01 = fun2(your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], A, B,C, D) x02, y02, z02 = fun2(your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], A, B,C, D) x_arr.append(np.array([x01, x02])) y_arr.append(np.array([y01, y02])) z_arr.append(np.array([z01, z02])) arr.append([[your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2]], [x02, y02, z02], [your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2]]]) arr.append([[your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2]], [x01, y01, z01],[x02, y02, z02]]) new_arr.append([[x01, y01, z01], [x02, y02, z02]]) #新点是切割位的几何中心 if len(x_arr)!=0: x = np.mean(np.array(x_arr).reshape(1, -1)[0]) y = np.mean(np.array(y_arr).reshape(1, -1)[0]) z = np.mean(np.array(z_arr).reshape(1, -1)[0]) for i in range(len(new_arr)): new_arr[i].append([x,y,z]) arr.append(new_arr[i]) arr=np.array(arr) data = np.zeros(arr.shape[0], dtype=mesh.Mesh.dtype) data['vectors']=arr return [x_arr,y_arr,z_arr],mesh.Mesh(data)
完整代码
import copy import math import numpy import numpy as np import pandas as pd from stl import mesh from mpl_toolkits import mplot3d from matplotlib import pyplot import matplotlib.pyplot as plt #点在三维平面上的投影 #Ax+By+Cz+D=0 #输入点和平面参数,返回垂直投射点 def fun(x0,y0,z0,A,B,C,D): temp=A**2+B**2+C**2 x1=((B**2+C**2)*x0-A*(B*y0+C*z0+D))/temp y1=((A**2+C**2)*y0-B*(A*x0+C*z0+D))/temp z1=((A**2+B**2)*z0-C*(A*x0+B*y0+D))/temp return x1,y1,z1 #直线到平面的交点 #Ax+By+Cz+D=0 #输入两点确定的直线,以及平面参数,返回交点 def fun2(x1,y1,z1,x2,y2,z2,A,B,C,D): P1P2=[x2-x1,y2-y1,z2-z1] i=0 num=A*x1+B*y1+C*z1+D den = A*P1P2[0]+B*P1P2[1]+C*P1P2[2] n=math.fabs(num/den) x=x1+n*P1P2[0] y=y1+n*P1P2[1] z=z1+n*P1P2[2] return x,y,z #输入模型,和平面参数,输出切割后的模型 #参数f f<0切去平面以上的, f>0切去平面以下的,等于0不切 def fun3(your_mesh, A, B, C, D,f): #不加copy会影响到原来的内存 new_vectors = your_mesh.vectors.copy() num = [0, 0, 0] for i in range(len(your_mesh.vectors)): #计算三个点和平面的关系 for j in range(3): num[j] = your_mesh.vectors[i][j][0] * A + your_mesh.vectors[i][j][1] * B + your_mesh.vectors[i][j][2] * C + D num[j] = f*num[j]#用来控制平面上面还是下面的被切割 #进行投影 if num[0] > 0 and num[1] > 0 and num[2] > 0: # 三个点都要投影的情况 for j in range(3): x, y, z = fun(your_mesh.vectors[i][j][0], your_mesh.vectors[i][j][1], your_mesh.vectors[i][j][2], A, B,C, D) new_vectors[i][j][0], new_vectors[i][j][1], new_vectors[i][j][2] = x, y, z elif not num[0] > 0 and num[1] > 0 and num[2] > 0: # 1,2点要投影的情况 x01, y01, z01 = fun2(your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], A, B,C, D) x02, y02, z02 = fun2(your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], A, B,C, D) x1, y1, z1 = fun(your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], A, B, C,D) x2, y2, z2 = fun(your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], A, B, C,D) new_matix1 = np.array([[[x01, y01, z01], [x1, y1, z1], [x2, y2, z2]]]) new_matix2 = np.array([[[x02, y02, z02], [x01, y01, z01], [x2, y2, z2]]]) new_vectors = np.concatenate((new_vectors, new_matix1), axis=0) new_vectors = np.concatenate((new_vectors, new_matix2), axis=0) new_vectors[i][1][0], new_vectors[i][1][1], new_vectors[i][1][2] = x01, y01, z01 new_vectors[i][2][0], new_vectors[i][2][1], new_vectors[i][2][2] = x02, y02, z02 elif num[0] > 0 and not num[1] > 0 and num[2] > 0: # 0,2点要投影的情况 x10, y10, z10 = fun2(your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], A, B,C, D) x12, y12, z12 = fun2(your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], A, B,C, D) x0, y0, z0 = fun(your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], A, B, C,D) x2, y2, z2 = fun(your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], A, B, C,D) new_matix1 = np.array([[[x10, y10, z10], [x0, y0, z0], [x2, y2, z2]]]) new_matix2 = np.array([[[x12, y12, z12], [x10, y10, z10], [x2, y2, z2]]]) new_vectors = np.concatenate((new_vectors, new_matix1), axis=0) new_vectors = np.concatenate((new_vectors, new_matix2), axis=0) new_vectors[i][0][0], new_vectors[i][0][1], new_vectors[i][0][2] = x10, y10, z10 new_vectors[i][2][0], new_vectors[i][2][1], new_vectors[i][2][2] = x12, y12, z12 elif num[0] > 0 and num[1] > 0 and not num[2] > 0: # 0,1点要投影的情况 x20, y20, z20 = fun2(your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], A, B,C, D) x21, y21, z21 = fun2(your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], A, B,C, D) x0, y0, z0 = fun(your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], A, B, C,D) x1, y1, z1 = fun(your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], A, B, C,D) new_matix1 = np.array([[[x20, y20, z20], [x0, y0, z0], [x1, y1, z1]]]) new_matix2 = np.array([[[x21, y21, z21], [x20, y20, z20], [x1, y1, z1]]]) new_vectors = np.concatenate((new_vectors, new_matix1), axis=0) new_vectors = np.concatenate((new_vectors, new_matix2), axis=0) new_vectors[i][0][0], new_vectors[i][0][1], new_vectors[i][0][2] = x20, y20, z20 new_vectors[i][1][0], new_vectors[i][1][1], new_vectors[i][1][2] = x21, y21, z21 elif not num[0] > 0 and not num[1] > 0 and num[2] > 0: # 2点被投影的情况 x20, y20, z20 = fun2(your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], A, B,C, D) x21, y21, z21 = fun2(your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], A, B,C, D) x0, y0, z0 = your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2] x1, y1, z1 = your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2] x2, y2, z2 = fun(your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], A, B, C,D) new_matix1 = np.array([[[x20, y20, z20], [x0, y0, z0], [x1, y1, z1]]]) new_matix2 = np.array([[[x21, y21, z21], [x20, y20, z20], [x1, y1, z1]]]) new_vectors = np.concatenate((new_vectors, new_matix1), axis=0) new_vectors = np.concatenate((new_vectors, new_matix2), axis=0) new_vectors[i][0][0], new_vectors[i][0][1], new_vectors[i][0][2] = x20, y20, z20 new_vectors[i][1][0], new_vectors[i][1][1], new_vectors[i][1][2] = x21, y21, z21 new_vectors[i][2][0], new_vectors[i][2][1], new_vectors[i][2][2] = x2, y2, z2 elif not num[0] > 0 and num[1] > 0 and not num[2] > 0: # 1点被投影的情况 x10, y10, z10 = fun2(your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], A, B,C, D) x12, y12, z12 = fun2(your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], A, B,C, D) x0, y0, z0 = your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2] x2, y2, z2 = your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2] x1, y1, z1 = fun(your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], A, B, C,D) new_matix1 = np.array([[[x10, y10, z10], [x0, y0, z0], [x2, y2, z2]]]) new_matix2 = np.array([[[x12, y12, z12], [x10, y10, z10], [x2, y2, z2]]]) new_vectors = np.concatenate((new_vectors, new_matix1), axis=0) new_vectors = np.concatenate((new_vectors, new_matix2), axis=0) new_vectors[i][0][0], new_vectors[i][0][1], new_vectors[i][0][2] = x10, y10, z10 new_vectors[i][1][0], new_vectors[i][1][1], new_vectors[i][1][2] = x1, y1, z1 new_vectors[i][2][0], new_vectors[i][2][1], new_vectors[i][2][2] = x12, y12, z12 elif num[0] > 0 and not num[1] > 0 and not num[2] > 0: # 0点被投影的情况 x01, y01, z01 = fun2(your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], A, B,C, D) x02, y02, z02 = fun2(your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], A, B,C, D) x1, y1, z1 = your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2] x2, y2, z2 = your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2] x0, y0, z0 = fun(your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], A, B, C,D) new_matix1 = np.array([[[x01, y01, z01], [x1, y1, z1], [x2, y2, z2]]]) new_matix2 = np.array([[[x02, y02, z02], [x01, y01, z01], [x2, y2, z2]]]) new_vectors = np.concatenate((new_vectors, new_matix1), axis=0) new_vectors = np.concatenate((new_vectors, new_matix2), axis=0) new_vectors[i][0][0], new_vectors[i][0][1], new_vectors[i][0][2] = x0, y0, z0 new_vectors[i][1][0], new_vectors[i][1][1], new_vectors[i][1][2] = x01, y01, z01 new_vectors[i][2][0], new_vectors[i][2][1], new_vectors[i][2][2] = x02, y02, z02 data = np.zeros(new_vectors.shape[0], dtype=mesh.Mesh.dtype) data['vectors']=new_vectors return mesh.Mesh(data) #输入模型,和平面参数,输出切割后的模型 #参数f f<0切去平面以上的, f>0切去平面以下的,等于0不切 def fun4(your_mesh, A, B, C, D,f): #数据 arr=[] new_arr=[] #切割位 x_arr=[] y_arr = [] z_arr = [] num = [0, 0, 0] for i in range(len(your_mesh.vectors)): #计算三个点和平面的关系 for j in range(3): num[j] = your_mesh.vectors[i][j][0] * A + your_mesh.vectors[i][j][1] * B + your_mesh.vectors[i][j][2] * C + D num[j] = f*num[j]#用来控制平面上面还是下面的被切割 #进行投影 if num[0] > 0 and num[1] > 0 and num[2] > 0: # 三个点都要投影的情况 直接抛弃 pass elif not num[0] > 0 and not num[1] > 0 and not num[2] > 0: # 三个点都不投影的情况 保留 matix=[] for j in range(3): matix.append([your_mesh.vectors[i][j][0], your_mesh.vectors[i][j][1], your_mesh.vectors[i][j][2]]) arr.append(matix) elif not num[0] > 0 and num[1] > 0 and num[2] > 0: # 1,2点要投影的情况 x01, y01, z01 = fun2(your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], A, B,C, D) x02, y02, z02 = fun2(your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], A, B,C, D) x_arr.append(np.array([x01, x02])) y_arr.append(np.array([y01, y02])) z_arr.append(np.array([z01, z02])) arr.append([[your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2]], [x01, y01, z01],[x02, y02, z02]]) new_arr.append([[x01, y01, z01],[x02, y02, z02]]) elif num[0] > 0 and not num[1] > 0 and num[2] > 0: # 0,2点要投影的情况 x10, y10, z10 = fun2(your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], A, B,C, D) x12, y12, z12 = fun2(your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], A, B,C, D) x_arr.append(np.array([x10, x12])) y_arr.append(np.array([y10, y12])) z_arr.append(np.array([z10, z12])) arr.append([[your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2]], [x10, y10, z10], [x12, y12, z12]]) new_arr.append([[x10, y10, z10], [x12, y12, z12]]) elif num[0] > 0 and num[1] > 0 and not num[2] > 0: # 0,1点要投影的情况 x20, y20, z20 = fun2(your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], A, B,C, D) x21, y21, z21 = fun2(your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], A, B,C, D) x_arr.append(np.array([x20, x21])) y_arr.append(np.array([y20, y21])) z_arr.append(np.array([z20, z21])) arr.append([[your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2]], [x20, y20, z20], [x21, y21, z21]]) new_arr.append([[x20, y20, z20], [x21, y21, z21]]) elif not num[0] > 0 and not num[1] > 0 and num[2] > 0: # 2点被投影的情况 x20, y20, z20 = fun2(your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], A, B,C, D) x21, y21, z21 = fun2(your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], A, B,C, D) x_arr.append(np.array([x20, x21])) y_arr.append(np.array([y20, y21])) z_arr.append(np.array([z20, z21])) arr.append([[your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2]], [x21, y21, z21], [your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2]]]) arr.append([[your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2]], [x20, y20, z20],[x21, y21, z21]]) new_arr.append([[x20, y20, z20], [x21, y21, z21]]) elif not num[0] > 0 and num[1] > 0 and not num[2] > 0: # 1点被投影的情况 x10, y10, z10 = fun2(your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], A, B,C, D) x12, y12, z12 = fun2(your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], A, B,C, D) x_arr.append(np.array([x10, x12])) y_arr.append(np.array([y10, y12])) z_arr.append(np.array([z10, z12])) arr.append([[your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2]], [x12, y12, z12], [your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2]]]) arr.append([[your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2]], [x10, y10, z10],[x12, y12, z12]]) new_arr.append([[x10, y10, z10], [x12, y12, z12]]) elif num[0] > 0 and not num[1] > 0 and not num[2] > 0: # 0点被投影的情况 x01, y01, z01 = fun2(your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2], A, B,C, D) x02, y02, z02 = fun2(your_mesh.vectors[i][0][0], your_mesh.vectors[i][0][1], your_mesh.vectors[i][0][2], your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2], A, B,C, D) x_arr.append(np.array([x01, x02])) y_arr.append(np.array([y01, y02])) z_arr.append(np.array([z01, z02])) arr.append([[your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2]], [x02, y02, z02], [your_mesh.vectors[i][2][0], your_mesh.vectors[i][2][1], your_mesh.vectors[i][2][2]]]) arr.append([[your_mesh.vectors[i][1][0], your_mesh.vectors[i][1][1], your_mesh.vectors[i][1][2]], [x01, y01, z01],[x02, y02, z02]]) new_arr.append([[x01, y01, z01], [x02, y02, z02]]) #新点是切割位的几何中心 if len(x_arr)!=0: x = np.mean(np.array(x_arr).reshape(1, -1)[0]) y = np.mean(np.array(y_arr).reshape(1, -1)[0]) z = np.mean(np.array(z_arr).reshape(1, -1)[0]) for i in range(len(new_arr)): new_arr[i].append([x,y,z]) arr.append(new_arr[i]) arr=np.array(arr) data = np.zeros(arr.shape[0], dtype=mesh.Mesh.dtype) data['vectors']=arr return [x_arr,y_arr,z_arr],mesh.Mesh(data) def get_volume(your_mesh): sum=0 for i in range(len(your_mesh.x)): add=np.linalg.det(np.array( [your_mesh.x[i],your_mesh.y[i],your_mesh.z[i]])) if add<0: add=-add sum+=add sum/=6 return sum my_list=[] my_list.append([[-1,-1,1],[1,1,1], [-1,1,1]]) my_list.append([[-1,-1,1],[1,1,1], [1,-1,1]]) my_list.append([[-1,-1,-1],[1,1,-1], [1,-1,-1]]) my_list.append([[-1,-1,-1],[1,1,-1], [-1,1,-1]]) my_list.append([[-1,-1,-1],[1,-1,1], [-1,-1,1]]) my_list.append([[-1,-1,-1],[1,-1,1], [1,-1,-1]]) my_list.append([[-1,1,-1],[1,1,1], [-1,1,1]]) my_list.append([[-1,1,-1],[1,1,1], [1,1,-1]]) my_list.append([[1,-1,1],[1,1,-1], [1,-1,-1]]) my_list.append([[1,-1,1],[1,1,-1], [1,1,1]]) my_list.append([[-1,-1,-1],[-1,1,1], [-1,1,-1]]) my_list.append([[-1,-1,-1],[-1,1,1], [-1,-1,1]]) my_arr=np.array(my_list) data = np.zeros(my_arr.shape[0], dtype=mesh.Mesh.dtype) data['vectors']=my_arr cube=mesh.Mesh(data) # tmesh=fun3(cube,1,1,1,-10,1) arr,tmesh=fun4(cube,1,0,0,0.5,1) fig = plt.figure() ax = plt.axes(projection='3d') ax.add_collection3d(mplot3d.art3d.Poly3DCollection(tmesh.vectors,alpha=0.7)) # 自动缩放网格尺寸 scale = tmesh.points.flatten() ax.auto_scale_xyz(scale, scale, scale) print(get_volume(tmesh)/get_volume(cube)) pyplot.show() my_list=[] my_list.append([[-1,-1,1],[-0.5,1,1], [-1,1,1]]) my_list.append([[-1,-1,1],[-0.5,1,1], [-0.5,-1,1]]) my_list.append([[-1,-1,-1],[-0.5,1,-1], [-0.5,-1,-1]]) my_list.append([[-1,-1,-1],[-0.5,1,-1], [-1,1,-1]]) my_list.append([[-1,-1,-1],[-0.5,-1,1], [-1,-1,1]]) my_list.append([[-1,-1,-1],[-0.5,-1,1], [-0.5,-1,-1]]) my_list.append([[-1,1,-1],[-0.5,1,1], [-1,1,1]]) my_list.append([[-1,1,-1],[-0.5,1,1], [-0.5,1,-1]]) my_list.append([[-0.5,-1,1],[-0.5,1,-1], [-0.5,-1,-1]]) my_list.append([[-0.5,-1,1],[-0.5,1,-1], [-0.5,1,1]]) my_list.append([[-1,-1,-1],[-1,1,1], [-1,1,-1]]) my_list.append([[-1,-1,-1],[-1,1,1], [-1,-1,1]]) my_arr=np.array(my_list) data = np.zeros(my_arr.shape[0], dtype=mesh.Mesh.dtype) data['vectors']=my_arr cube2=mesh.Mesh(data) for i in range(len(cube2.vectors)): for j in range(3): cube2.vectors[i][j][0] +=0.75 tmesh=cube2 fig = plt.figure() ax = plt.axes(projection='3d') ax.add_collection3d(mplot3d.art3d.Poly3DCollection(tmesh.vectors,alpha=0.7)) # 自动缩放网格尺寸 scale = tmesh.points.flatten() ax.auto_scale_xyz(scale, scale, scale) print(get_volume(cube2)/get_volume(cube)) pyplot.show()