You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python计算meshcut切割网格所得截面轮廓及凸包的周长?

离散轮廓周长计算方案

一、直接计算原始离散轮廓的周长

核心前提:确保离散点是沿着轮廓依次排列的(乱序会导致结果完全错误),步骤如下:

  • 依次计算相邻两点的欧氏距离并累加
  • 最后补充第一个点与最后一个点的距离,实现轮廓闭合

Python代码示例:

import math

def calculate_contour_perimeter(points):
    perimeter = 0.0
    num_points = len(points)
    for i in range(num_points):
        x1, y1 = points[i]
        x2, y2 = points[(i+1) % num_points]
        distance = math.hypot(x2 - x1, y2 - y1)
        perimeter += distance
    return perimeter

# 示例调用
# points = [(x0,y0), (x1,y1), ..., (xn,yn)]
# print(calculate_contour_perimeter(points))

二、凸包周长的计算

分为「获取凸包」和「计算凸包周长」两步:

1. 获取离散点的凸包

方案一:依赖第三方库(便捷高效)

用scipy.spatial.ConvexHull直接生成凸包点集:

from scipy.spatial import ConvexHull

def get_convex_hull(points):
    hull = ConvexHull(points)
    # 返回按顺序排列的凸包点
    convex_hull_points = [points[i] for i in hull.vertices]
    return convex_hull_points

方案二:手动实现算法(无依赖)

用Andrew算法(时间复杂度O(n log n)):

def convex_hull_andrew(points):
    # 按x坐标排序,x相同则按y排序
    points = sorted(points)
    lower = []
    for p in points:
        while len(lower) >= 2 and cross(lower[-2], lower[-1], p) <= 0:
            lower.pop()
        lower.append(p)
    upper = []
    for p in reversed(points):
        while len(upper) >= 2 and cross(upper[-2], upper[-1], p) <= 0:
            upper.pop()
        upper.append(p)
    # 去掉重复的首尾点
    return lower[:-1] + upper[:-1]

def cross(o, a, b):
    # 计算叉积判断转向
    return (a[0] - o[0])*(b[1] - o[1]) - (a[1] - o[1])*(b[0] - o[0])

2. 计算凸包周长

复用之前的轮廓周长计算函数即可:

def calculate_convex_hull_perimeter(points):
    convex_hull = get_convex_hull(points)  # 或用convex_hull_andrew(points)
    return calculate_contour_perimeter(convex_hull)

三、关于meshcut工具的说明

meshcut核心功能是切割网格生成截面点集,本身没有内置周长计算函数。你只需提取它输出的二维点集,再用上述方法自行计算即可。


内容的提问来源于stack exchange,提问作者daisy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 13:25:17