编写Python函数根据两个numpy数组点求等边三角形第三个顶点
等边三角形顶点计算实现方案
原理说明
- 平面内给定两个顶点,等边三角形的第三个顶点存在两个合法解,分别在两点连线的两侧,以下实现默认返回连线逆时针侧的结果,需要另一侧可修改对应旋转/偏移参数。
- 实现支持numpy向量化操作,可直接适配任意长度的输入数组,无需循环逐点计算。
实现代码
版本1:输入为复数形式的一维点数组(匹配你描述的shape(N,)输入输出要求)
如果你的x、y数组元素为复数,每个复数代表平面上的一个点,可直接使用该版本:
import numpy as np def equilateral(x: np.ndarray, y: np.ndarray) -> np.ndarray: assert x.shape == y.shape and x.ndim == 1, "x和y必须为shape(N,)的一维数组" # 逆时针旋转60度的复数因子,需要另一侧结果替换为 0.5 - 1j * np.sqrt(3)/2 rot_factor = 0.5 + 1j * np.sqrt(3) / 2 return (y - x) * rot_factor + x
调用示例:
x = np.array([0+0j, 1+0j]) y = np.array([1+0j, 2+1j]) z = equilateral(x, y) # 输出z为[0.5+0.8660254j, 0.6339746+1.3660254j],shape为(2,)
版本2:输入为二维点坐标数组
如果你的输入是两组二维点,每组N个点,点集数组shape为(N,2),可使用该版本:
import numpy as np def equilateral(p1: np.ndarray, p2: np.ndarray) -> np.ndarray: assert p1.shape == p2.shape and p1.shape[-1] == 2, "输入点集shape必须为(N,2)" dx = p2[..., 0] - p1[..., 0] dy = p2[..., 1] - p1[..., 1] # 需要另一侧结果可把加减符号互换 zx = (p1[..., 0] + p2[..., 0]) / 2 - dy * np.sqrt(3) / 2 zy = (p1[..., 1] + p2[..., 1]) / 2 + dx * np.sqrt(3) / 2 return np.stack([zx, zy], axis=-1)
内容的提问来源于stack exchange,提问作者Richard
相关产品推荐
相关产品推荐

