【三维建模】计算三维平面切割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()