如何创建几何体重心处的36等分圆周并投影点云节点?
点云节点投影至重心圆周的实现方法
一、创建重心处的圆周并划分为36段
由于你已将几何体重心移至坐标原点(0,0),圆周中心即为原点,具体步骤如下:
- 确定圆周半径:建议取所有节点到原点的欧氏距离最大值,确保所有节点投影后均落在圆周上。计算方式为对每个节点(x,y),距离
d = √(x² + y²),取所有d中的最大值作为半径R。 - 计算等分角度:36段对应的角度间隔为
360°/36 = 10°,转换为弧度是π/18。每个等分点的角度为θ_i = i*(2π/36),其中i从0到35。 - 生成等分点坐标:每个等分点的坐标为
(R*cosθ_i, R*sinθ_i)。
二、将节点投影至圆周
投影逻辑为:从原点出发,沿节点所在射线延伸至圆周,交点即为投影点,步骤如下:
- 计算节点到原点的距离
d = √(x² + y²); - 若节点在原点(d≈0),可指定任意一个圆周等分点作为投影结果(例如第一个等分点);
- 非原点节点的投影坐标为
((x/d)*R, (y/d)*R),即沿径向将节点缩放至圆周上。
代码实现示例(Python)
import math # 用户提供的节点数据 nodes = [ (0, -1.0, -2.0), (1, -1.0, -1.0), (2, -1.0, 0.0), (3, -1.0, 1.0), (4, -2.0, 1.0), (5, -2.0, 2.0), (6, -1.0, 2.0), (7, 0.0, 2.0), (8, 1.0, 2.0), (9, 2.0, 2.0), (10, 2.0, 1.0), (11, 1.0, 1.0), (12, 0.0, 1.0), (13, 0.0, 0.0), (14, 0.0, -1.0), (15, 0.0, -2.0), ] # 1. 计算圆周半径R(取节点到原点的最大距离) max_distance = 0.0 for _, x, y in nodes: dist = math.hypot(x, y) if dist > max_distance: max_distance = dist R = max_distance # 2. 生成36个圆周等分点 num_segments = 36 circle_points = [] for i in range(num_segments): angle = 2 * math.pi * i / num_segments x = R * math.cos(angle) y = R * math.sin(angle) circle_points.append((x, y)) # 3. 投影所有节点到圆周 projected_nodes = [] for node_num, x, y in nodes: dist = math.hypot(x, y) if dist < 1e-9: # 处理原点处的节点 proj_x, proj_y = circle_points[0] else: proj_x = (x / dist) * R proj_y = (y / dist) * R projected_nodes.append((node_num, proj_x, proj_y)) # 输出示例结果 print("圆周等分点(前5个):") for idx, (x, y) in enumerate(circle_points[:5], 1): print(f"第{idx}个:({x:.4f}, {y:.4f})") print("\n节点投影结果(前5个):") for node_num, x, y in projected_nodes[:5]: print(f"节点{node_num}:({x:.4f}, {y:.4f})")
内容的提问来源于stack exchange,提问作者Urvish
相关产品推荐
相关产品推荐

