如何在指定周长的正八边形周长上生成指定数量的均匀分布点坐标
如何在指定周长的正八边形周长上生成指定数量的均匀分布点坐标
嘿,我来帮你搞定这个问题!你之前用numpy生成圆的均匀点的思路很清晰,现在要做正八边形的话,核心逻辑是类似的——只不过圆是平滑曲线,正八边形是8条等长直线段组成的图形,所以我们需要先确定八边形的顶点,再把整个周长均匀分成n段,在每条边上生成对应的点就行。
步骤拆解与代码实现
首先我们先理清楚关键参数,再一步步写代码:
确定正八边形的基础参数
你已经算出周长30.72m、8条边,所以每条边长是side_length = perimeter / n_sides = 30.72 / 8 = 3.79m。接下来要算正八边形的外接圆半径R(也就是中心到顶点的距离),根据正多边形边长公式:side_length = 2 * R * sin(π/8),所以可以反推出R的值。生成正八边形的顶点坐标
正八边形的8个顶点均匀分布在半径为R的圆上,相邻顶点的角度差是45度(也就是π/4弧度),用numpy很容易生成这些顶点的坐标。生成均匀分布的周长点
因为正八边形每条边长度相等,我们可以把整个周长的长度比例分成n份(从0到1,每份占1/n),每个比例值对应周长上的一个点。对于每个比例值,我们只需要判断它落在第几条边上,再通过线性插值算出具体坐标即可。
下面是完整的可运行代码:
import numpy as np # 自定义参数:可按需修改 perimeter = 30.72 # 八边形周长 n_sides = 8 # 边数,固定为8 n = 100 # 你想要的点数量,比如100个,可调整 # 计算每条边的长度 side_length = perimeter / n_sides # 计算正八边形的外接圆半径(中心到顶点的距离) R = side_length / (2 * np.sin(np.pi / n_sides)) # 生成8个顶点的角度(从0到2π,不含终点,避免重复第一个顶点) theta_vertices = np.linspace(0, 2 * np.pi, n_sides, endpoint=False) # 计算顶点的x、y坐标 x_vertices = R * np.cos(theta_vertices) y_vertices = R * np.sin(theta_vertices) # 把第一个顶点追加到末尾,方便遍历最后一条边(第7个顶点→第0个顶点) x_vertices = np.append(x_vertices, x_vertices[0]) y_vertices = np.append(y_vertices, y_vertices[0]) # 生成n个均匀分布的周长比例值(从0到1,共n个点,不含终点避免重复) t = np.linspace(0, 1, n, endpoint=False) # 初始化存储坐标的数组 coordinates = np.zeros((n, 2)) for i in range(n): # 判断当前点落在第几条边上 edge_idx = int(t[i] * n_sides) # 计算在这条边上的相对位置比例(0到1之间) t_edge = t[i] * n_sides - edge_idx # 通过线性插值计算当前点坐标:起点 + 边向量 × 相对比例 coordinates[i, 0] = x_vertices[edge_idx] + t_edge * (x_vertices[edge_idx+1] - x_vertices[edge_idx]) coordinates[i, 1] = y_vertices[edge_idx] + t_edge * (y_vertices[edge_idx+1] - y_vertices[edge_idx]) # 如果你需要和之前圆的代码一样的列表格式 coordinates_list = list(zip(coordinates[:, 0], coordinates[:, 1]))
代码说明
- 当你设置
n=8时,生成的就是正八边形的8个顶点,完全符合预期; - 当
n>8时,每个边上会均匀分布对应数量的点,比如n=16时,每条边上会有2个点(顶点+中点); - 所有点之间的距离都是
perimeter/n,保证了在周长上的均匀分布。
备注:内容来源于stack exchange,提问作者HJA24




