You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在指定周长的正八边形周长上生成指定数量的均匀分布点坐标

如何在指定周长的正八边形周长上生成指定数量的均匀分布点坐标

嘿,我来帮你搞定这个问题!你之前用numpy生成圆的均匀点的思路很清晰,现在要做正八边形的话,核心逻辑是类似的——只不过圆是平滑曲线,正八边形是8条等长直线段组成的图形,所以我们需要先确定八边形的顶点,再把整个周长均匀分成n段,在每条边上生成对应的点就行。

步骤拆解与代码实现

首先我们先理清楚关键参数,再一步步写代码:

  1. 确定正八边形的基础参数
    你已经算出周长30.72m、8条边,所以每条边长是 side_length = perimeter / n_sides = 30.72 / 8 = 3.79m。接下来要算正八边形的外接圆半径R(也就是中心到顶点的距离),根据正多边形边长公式:side_length = 2 * R * sin(π/8),所以可以反推出R的值。

  2. 生成正八边形的顶点坐标
    正八边形的8个顶点均匀分布在半径为R的圆上,相邻顶点的角度差是45度(也就是π/4弧度),用numpy很容易生成这些顶点的坐标。

  3. 生成均匀分布的周长点
    因为正八边形每条边长度相等,我们可以把整个周长的长度比例分成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

火山引擎 最新活动