以下是计算 stl 三维颗粒模型各种度量指标的 Python 代码及注释:\n\npython\nimport numpy as np\nimport math\n\n# 计算圆度\ndef calculate_circularity(volume, surface_area):\n radius = (3 * volume / (4 * math.pi)) ** (1/3)\n expected_surface_area = 4 * math.pi * radius ** 2\n circularity = expected_surface_area / surface_area\n return circularity\n\n# 计算球形度\ndef calculate_sphericity(volume, surface_area):\n radius = (3 * volume / (4 * math.pi)) ** (1/3)\n expected_surface_area = 4 * math.pi * radius ** 2\n sphericity = surface_area / expected_surface_area\n return sphericity\n\n# 计算内径比\ndef calculate_inner_diameter_ratio(volume, surface_area):\n radius = (3 * volume / (4 * math.pi)) ** (1/3)\n inner_diameter = 2 * radius\n inner_diameter_ratio = inner_diameter / surface_area\n return inner_diameter_ratio\n\n# 计算矩形度\ndef calculate_rectangularity(volume, surface_area):\n length = (volume / surface_area) ** (1/3)\n rectangularity = surface_area / (6 * length ** 2)\n return rectangularity\n\n# 计算棱角性\ndef calculate_angularity(surface_area, perimeter):\n angularity = perimeter / surface_area\n return angularity\n\n# 计算等效Feret长短轴比\ndef calculate_equivalent_feret_aspect_ratio(points):\n min_x = np.min(points[:, 0])\n max_x = np.max(points[:, 0])\n min_y = np.min(points[:, 1])\n max_y = np.max(points[:, 1])\n equivalent_feret_aspect_ratio = (max_y - min_y) / (max_x - min_x)\n return equivalent_feret_aspect_ratio\n\n# 计算等效椭圆长短轴比\ndef calculate_equivalent_ellipse_aspect_ratio(points):\n center_x = np.mean(points[:, 0])\n center_y = np.mean(points[:, 1])\n distances = np.sqrt((points[:, 0] - center_x) ** 2 + (points[:, 1] - center_y) ** 2)\n max_distance = np.max(distances)\n min_distance = np.min(distances)\n equivalent_ellipse_aspect_ratio = max_distance / min_distance\n return equivalent_ellipse_aspect_ratio\n\n# 计算等效Feret椭圆周长比\ndef calculate_equivalent_feret_ellipse_perimeter_ratio(points):\n center_x = np.mean(points[:, 0])\n center_y = np.mean(points[:, 1])\n distances = np.sqrt((points[:, 0] - center_x) ** 2 + (points[:, 1] - center_y) ** 2)\n max_distance = np.max(distances)\n equivalent_feret_ellipse_perimeter_ratio = max_distance * math.pi / points.shape[0]\n return equivalent_feret_ellipse_perimeter_ratio\n\n# 计算外接矩形长短轴比\ndef calculate_bounding_rectangle_aspect_ratio(points):\n min_x = np.min(points[:, 0])\n max_x = np.max(points[:, 0])\n min_y = np.min(points[:, 1])\n max_y = np.max(points[:, 1])\n bounding_rectangle_aspect_ratio = (max_y - min_y) / (max_x - min_x)\n return bounding_rectangle_aspect_ratio\n\n# 计算形状因子\ndef calculate_shape_factor(volume, surface_area):\n shape_factor = (36 * math.pi * volume ** 2) / (surface_area ** 3)\n return shape_factor\n\n# 计算凸度\ndef calculate_convexity(volume, surface_area, volume_convex_hull, surface_area_convex_hull):\n convexity = (volume / volume_convex_hull) / (surface_area / surface_area_convex_hull)\n return convexity\n\n# 计算卡尺比\ndef calculate_caliper_ratio(points):\n min_x = np.min(points[:, 0])\n max_x = np.max(points[:, 0])\n min_y = np.min(points[:, 1])\n max_y = np.max(points[:, 1])\n caliper_ratio = (max_y - min_y) / (max_x - min_x)\n return caliper_ratio\n\n# 计算凸包比\ndef calculate_convex_hull_ratio(points, convex_hull_points):\n convex_hull_area = calculate_area(convex_hull_points)\n area = calculate_area(points)\n convex_hull_ratio = convex_hull_area / area\n return convex_hull_ratio\n\n# 计算多边形面积\ndef calculate_area(points):\n area = 0\n n = len(points)\n for i in range(n):\n j = (i + 1) % n\n area += points[i][0] * points[j][1] - points[j][0] * points[i][1]\n area /= 2\n return abs(area)\n\n# 示例用法\npoints = np.array([[0, 0], [1, 0], [1, 1], [0, 1]]) # 假设有一个四边形的点集\nvolume = 1.0 # 假设体积为1.0\nsurface_area = 4.0 # 假设表面积为4.0\nvolume_convex_hull = 1.2 # 假设凸包体积为1.2\nsurface_area_convex_hull = 4.5 # 假设凸包表面积为4.5\n\ncircularity = calculate_circularity(volume, surface_area)\nsphericity = calculate_sphericity(volume, surface_area)\ninner_diameter_ratio = calculate_inner_diameter_ratio(volume, surface_area)\nrectangularity = calculate_rectangularity(volume, surface_area)\nangularity = calculate_angularity(surface_area, 4.0)\nequivalent_feret_aspect_ratio = calculate_equivalent_feret_aspect_ratio(points)\nequivalent_ellipse_aspect_ratio = calculate_equivalent_ellipse_aspect_ratio(points)\nequivalent_feret_ellipse_perimeter_ratio = calculate_equivalent_feret_ellipse_perimeter_ratio(points)\nbounding_rectangle_aspect_ratio = calculate_bounding_rectangle_aspect_ratio(points)\nshape_factor = calculate_shape_factor(volume, surface_area)\nconvexity = calculate_convexity(volume, surface_area, volume_convex_hull, surface_area_convex_hull)\ncaliper_ratio = calculate_caliper_ratio(points)\nconvex_hull_ratio = calculate_convex_hull_ratio(points, points)\n\nprint("圆度:", circularity)\nprint("球形度:", sphericity)\nprint("内径比:", inner_diameter_ratio)\nprint("矩形度:", rectangularity)\nprint("棱角性:", angularity)\nprint("等效Feret长短轴比:", equivalent_feret_aspect_ratio)\nprint("等效椭圆长短轴比:", equivalent_ellipse_aspect_ratio)\nprint("等效Feret椭圆周长比:", equivalent_feret_ellipse_perimeter_ratio)\nprint("外接矩形长短轴比:", bounding_rectangle_aspect_ratio)\nprint("形状因子:", shape_factor)\nprint("凸度:", convexity)\nprint("卡尺比:", caliper_ratio)\nprint("凸包比:", convex_hull_ratio)\n\n\n注释中对每个函数进行了说明,代码中使用了NumPy库进行向量化计算,以提高性能。示例用法中给出了一个四边形的点集以及对应的体积、表面积、凸包体积和凸包表面积,以便演示各种度量指标的计算结果。

Python 代码计算 STL 三维颗粒模型形状特征:圆度、球形度、内径比等

原文地址: https://www.cveoy.top/t/topic/puR4 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录