def rotate_coord_sys(old_u, old_v, new_norm):
"""Rotate a coordinate system to be perpendicular to the given normal."""
new_u = old_u
new_v = old_v
old_norm = np.cross(old_u, old_v)
# Project old normal onto new normal
ndot = np.dot(old_norm, new_norm)
# If projection is leq to -1, simply reverse
if ndot <= -1:
new_u = -new_u
new_v = -new_v
return new_u, new_v
# Otherwise, compute new normal
perp_old = new_norm - ndot * old_norm
dperp = (old_norm + new_norm) / (1 + ndot)
new_u -= dperp * np.dot(new_u, perp_old)
new_v -= dperp * np.dot(new_v, perp_old)
return new_u, new_v
评论列表
文章目录