请给出python计算stl三维颗粒模型的圆度球形度内径比矩形度棱角性等效Feret长短轴比等效椭圆长短轴比等效Feret椭圆周长比外接矩形长短轴比形状因子凸度卡尺比凸包比的代码及注释
以下是计算stl三维颗粒模型各种度量指标的Python代码及注释:
import numpy as np
import math
# 计算圆度
def calculate_circularity(volume, surface_area):
radius = (3 * volume / (4 * math.pi)) ** (1/3)
expected_surface_area = 4 * math.pi * radius ** 2
circularity = expected_surface_area / surface_area
return circularity
# 计算球形度
def calculate_sphericity(volume, surface_area):
radius = (3 * volume / (4 * math.pi)) ** (1/3)
expected_surface_area = 4 * math.pi * radius ** 2
sphericity = surface_area / expected_surface_area
return sphericity
# 计算内径比
def calculate_inner_diameter_ratio(volume, surface_area):
radius = (3 * volume / (4 * math.pi)) ** (1/3)
inner_diameter = 2 * radius
inner_diameter_ratio = inner_diameter / surface_area
return inner_diameter_ratio
# 计算矩形度
def calculate_rectangularity(volume, surface_area):
length = (volume / surface_area) ** (1/3)
rectangularity = surface_area / (6 * length ** 2)
return rectangularity
# 计算棱角性
def calculate_angularity(surface_area, perimeter):
angularity = perimeter / surface_area
return angularity
# 计算等效Feret长短轴比
def calculate_equivalent_feret_aspect_ratio(points):
min_x = np.min(points[:, 0])
max_x = np.max(points[:, 0])
min_y = np.min(points[:, 1])
max_y = np.max(points[:, 1])
equivalent_feret_aspect_ratio = (max_y - min_y) / (max_x - min_x)
return equivalent_feret_aspect_ratio
# 计算等效椭圆长短轴比
def calculate_equivalent_ellipse_aspect_ratio(points):
center_x = np.mean(points[:, 0])
center_y = np.mean(points[:, 1])
distances = np.sqrt((points[:, 0] - center_x) ** 2 + (points[:, 1] - center_y) ** 2)
max_distance = np.max(distances)
min_distance = np.min(distances)
equivalent_ellipse_aspect_ratio = max_distance / min_distance
return equivalent_ellipse_aspect_ratio
# 计算等效Feret椭圆周长比
def calculate_equivalent_feret_ellipse_perimeter_ratio(points):
center_x = np.mean(points[:, 0])
center_y = np.mean(points[:, 1])
distances = np.sqrt((points[:, 0] - center_x) ** 2 + (points[:, 1] - center_y) ** 2)
max_distance = np.max(distances)
equivalent_feret_ellipse_perimeter_ratio = max_distance * math.pi / points.shape[0]
return equivalent_feret_ellipse_perimeter_ratio
# 计算外接矩形长短轴比
def calculate_bounding_rectangle_aspect_ratio(points):
min_x = np.min(points[:, 0])
max_x = np.max(points[:, 0])
min_y = np.min(points[:, 1])
max_y = np.max(points[:, 1])
bounding_rectangle_aspect_ratio = (max_y - min_y) / (max_x - min_x)
return bounding_rectangle_aspect_ratio
# 计算形状因子
def calculate_shape_factor(volume, surface_area):
shape_factor = (36 * math.pi * volume ** 2) / (surface_area ** 3)
return shape_factor
# 计算凸度
def calculate_convexity(volume, surface_area, volume_convex_hull, surface_area_convex_hull):
convexity = (volume / volume_convex_hull) / (surface_area / surface_area_convex_hull)
return convexity
# 计算卡尺比
def calculate_caliper_ratio(points):
min_x = np.min(points[:, 0])
max_x = np.max(points[:, 0])
min_y = np.min(points[:, 1])
max_y = np.max(points[:, 1])
caliper_ratio = (max_y - min_y) / (max_x - min_x)
return caliper_ratio
# 计算凸包比
def calculate_convex_hull_ratio(points, convex_hull_points):
convex_hull_area = calculate_area(convex_hull_points)
area = calculate_area(points)
convex_hull_ratio = convex_hull_area / area
return convex_hull_ratio
# 计算多边形面积
def calculate_area(points):
area = 0
n = len(points)
for i in range(n):
j = (i + 1) % n
area += points[i][0] * points[j][1] - points[j][0] * points[i][1]
area /= 2
return abs(area)
# 示例用法
points = np.array([[0, 0], [1, 0], [1, 1], [0, 1]]) # 假设有一个四边形的点集
volume = 1.0 # 假设体积为1.0
surface_area = 4.0 # 假设表面积为4.0
volume_convex_hull = 1.2 # 假设凸包体积为1.2
surface_area_convex_hull = 4.5 # 假设凸包表面积为4.5
circularity = calculate_circularity(volume, surface_area)
sphericity = calculate_sphericity(volume, surface_area)
inner_diameter_ratio = calculate_inner_diameter_ratio(volume, surface_area)
rectangularity = calculate_rectangularity(volume, surface_area)
angularity = calculate_angularity(surface_area, 4.0)
equivalent_feret_aspect_ratio = calculate_equivalent_feret_aspect_ratio(points)
equivalent_ellipse_aspect_ratio = calculate_equivalent_ellipse_aspect_ratio(points)
equivalent_feret_ellipse_perimeter_ratio = calculate_equivalent_feret_ellipse_perimeter_ratio(points)
bounding_rectangle_aspect_ratio = calculate_bounding_rectangle_aspect_ratio(points)
shape_factor = calculate_shape_factor(volume, surface_area)
convexity = calculate_convexity(volume, surface_area, volume_convex_hull, surface_area_convex_hull)
caliper_ratio = calculate_caliper_ratio(points)
convex_hull_ratio = calculate_convex_hull_ratio(points, points)
print("圆度:", circularity)
print("球形度:", sphericity)
print("内径比:", inner_diameter_ratio)
print("矩形度:", rectangularity)
print("棱角性:", angularity)
print("等效Feret长短轴比:", equivalent_feret_aspect_ratio)
print("等效椭圆长短轴比:", equivalent_ellipse_aspect_ratio)
print("等效Feret椭圆周长比:", equivalent_feret_ellipse_perimeter_ratio)
print("外接矩形长短轴比:", bounding_rectangle_aspect_ratio)
print("形状因子:", shape_factor)
print("凸度:", convexity)
print("卡尺比:", caliper_ratio)
print("凸包比:", convex_hull_ratio)
注释中对每个函数进行了说明,代码中使用了NumPy库进行向量化计算,以提高性能。示例用法中给出了一个四边形的点集以及对应的体积、表面积、凸包体积和凸包表面积,以便演示各种度量指标的计算结果
原文地址: https://www.cveoy.top/t/topic/hLKU 著作权归作者所有。请勿转载和采集!