def barycentric_generate(hits, tris):
'''Create scalars to be used by points and triangles'''
# where the hit lands on the two tri vecs
tv = tris[:, 1] - tris[:, 0]
hv = hits - tris[:, 0]
d1a = np.einsum('ij, ij->i', hv, tv)
d1b = np.einsum('ij, ij->i', tv, tv)
scalar1 = np.nan_to_num(d1a / d1b)
t2v = tris[:, 2] - tris[:, 0]
d2a = np.einsum('ij, ij->i', hv, t2v)
d2b = np.einsum('ij, ij->i', t2v, t2v)
scalar2 = np.nan_to_num(d2a / d2b)
# closest point on edge segment between the two points created above
cp1 = tv * np.expand_dims(scalar1, axis=1)
cp2 = t2v * np.expand_dims(scalar2, axis=1)
cpvec = cp2 - cp1
cp1_at = tris[:,0] + cp1
hcp = hits - cp1_at # this is cp3 above. Not sure what's it's for yet
dhcp = np.einsum('ij, ij->i', hcp, cpvec)
d3b = np.einsum('ij, ij->i', cpvec, cpvec)
hcp_scalar = np.nan_to_num(dhcp / d3b)
hcp_vec = cpvec * np.expand_dims(hcp_scalar, axis=1)
# base of tri on edge between first two points
d3 = np.einsum('ij, ij->i', -cp1, cpvec)
scalar3 = np.nan_to_num(d3 / d3b)
base_cp_vec = cpvec * np.expand_dims(scalar3, axis=1)
base_on_span = cp1_at + base_cp_vec
# Where the point occurs on the edge between the base of the triangle
# and the cpoe of the base of the triangle on the cpvec
base_vec = base_on_span - tris[:,0]
dba = np.einsum('ij, ij->i', hv, base_vec)
dbb = np.einsum('ij, ij->i', base_vec, base_vec)
scalar_final = np.nan_to_num(dba / dbb)
p_on_bv = base_vec * np.expand_dims(scalar_final, axis=1)
perp = (p_on_bv) - (cp1 + base_cp_vec)
return scalar1, scalar2, hcp_scalar, scalar3, scalar_final
评论列表
文章目录