三维空间中 点线面距离计算

def dist_O_A_B(O,A,B):
    # r.t. https://blog.csdn.net/qq_32867925/article/details/114294753
    # 计算点O到A,B连线的垂足点
    xo,yo,zo=O
    x1,y1,z1=A
    x2,y2,z2=B

    k=-( (x1-xo)*(x2-x1)+(y1-yo)*(y2-y1)+(z1-zo)*(z2-z1) ) / ( (x2-x1)**2+(y2-y1)**2+(z2-z1)**2)
    xn=k*(x2-x1)+x1
    yn=k*(y2-y1)+y1
    zn=k*(z2-z1)+z1
    N=[xn,yn,zn]
    return N

def points_to_screen(points):
    # r.t. https://blog.csdn.net/qq_29912325/article/details/106917141
    # 4个点计算平面方程,拟合求解
    n=points.shape[0]
    A=np.ones(shape=[n,3])
    b=np.zeros(shape=[n])
    for i in range(n):
        A[i,0]=points[i][0]
        A[i,1]=points[i][1]
        b[i]=points[i][2]

    coefficients, residuals, rank, singular_values = np.linalg.lstsq(A, b, rcond=None)
    # # 提取平面方程的系数
    A_screen, B_screen, D_screen = coefficients
    C_screen = 1  # 设定 C 为 1

    #print("平面方程:{}x + {}y + {}z + {} = 0".format(A_screen, B_screen, C_screen, D_screen))
    return A_screen,B_screen,C_screen,D_screen

def dist_point_to_screen(p,v,A,B,C,D):
    # r.t. https://blog.csdn.net/qq_42679415/article/details/136740895
    # 向量和平面的交点计算
    x0,y0,z0=p
    a,b,c=v
    t=-( A*x0+B*y0+c*z0+D ) / (a*A+b*B+c*C)

    C=p-t*v

    return C

def angle_two_vector(vec1,vec2):
    x1,y1,z1=vec1
    x2,y2,z2=vec2
    n1=np.linalg.norm(vec1)
    n2=np.linalg.norm(vec2)
    dot=np.dot(vec1,vec2)
    cos_=dot/( n1*n2 )
    return np.arccos(cos_)
在Python计算三维空间某个点到三角形表面的最短距离通常涉及到向量几何和点线面之间的距离计算。首先,我们需要假设给定的是一个已知的三维三角形顶点列表和目标点。以下是一个基本步骤的概述: 1. 确定三角形的三个顶点,例如 `A`, `B`, 和 `C`。 ```python A = (x1, y1, z1) B = (x2, y2, z2) C = (x3, y3, z3) ``` 2. 计算目标点到每个边的向量,并找到其两个非共线边构成的平面。 3. 使用向量叉乘得到法向量 `n = cross_product AB, AC`。 4. 然后,计算目标点 `P` 到该法向量的投影 `proj_n = dot_product(n, P - A) / length(n)`。 5. 根据这个投影,确定哪条边上离点 `P` 最近。如果投影小于0,则最近点在AB段;如果投影大于等于边长AC,最近点在AC段;否则在BC段。 6. 接着,检查目标点是否在线段上,如果是则直接计算到这条线段两端点的距离并取最小值。 7. 如果不在,计算目标点到最近边的垂足 `Q`,其位置是 `Q = A + proj_n * n`。 8. 最后,计算从 `Q` 到对面顶点(不是最近边上的顶点)的距离作为最短距离。 ```python # 向量函数 def cross_product(v1, v2): x = v1[1] * v2[2] - v1[2] * v2[1] y = v1[2] * v2[0] - v1[0] * v2[2] z = v1[0] * v2[1] - v1[1] * v2[0] return [x, y, z] def dot_product(v1, v2): return v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2] def distance_to_triangle(P, A, B, C): # ... 进行上述步骤计算 ...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值