使用python实现:判断任意坐标点在STL几何模型的内部或外部
简介
在STL几何模型处理的过程中,经常需要判断一个点是否在模型的内部。网上给出的资料主要是使用C++ vtk的,而python vtk的很少。本文给出了一段精简版的python代码,实现判断任意坐标点在STL几何模型的内部或外部。
代码
首先定义三个函数
import vtk
def create_enclosed_points(path):
# 读取STL文件
reader = vtk.vtkSTLReader()
reader.SetFileName(path)
reader.Update()
# 获取STL模型的几何数据
polydata = reader.GetOutput()
# 创建vtkSelectEnclosedPoints对象
select_enclosed_points = vtk.vtkSelectEnclosedPoints()
select_enclosed_points.SetSurfaceData(polydata)
select_enclosed_points.SetTolerance(0.001) # 设置容差值,可根据实际情况进行调整
select_enclosed_points.Update()
return select_enclosed_points
def create_test_points(points_array):
points = vtk.vtkPoints()
for item in points_array:
points.InsertNextPoint(item[0], item[1], item[2]) # 第i个待测试点
# 创建vtkPolyData对象,并将待测试点添加到其中
test_points = vtk.vtkPolyData()
test_points.SetPoints(points)
return test_points
def get_is_insides(enclosed_points, test_points):
# 将待测试点设置为输入点
enclosed_points.SetInputData(test_points)
# 执行点的包含性检查
enclosed_points.Update()
# 检查点是否在STL模型内部
is_insides = enclosed_points.IsInside
return is_insides
调用方式
enclosed_points = create_enclosed_points(
"data/GRAIN_PNG/m/orb.stl")
input_data = create_test_points([(0.0, 0.0, 0.5), (0.0, 1.1, 0.5)])
is_insides = get_is_insides(enclosed_points, input_data)
print(is_insides(0)) # 第一个待测试点
print(is_insides(1)) # 第二个待测试点
代码中,路径"data/GRAIN_PNG/m/orb.stl"
是一个半径为1的标准球体,需要判断坐标(0.0, 0.0, 0.5)和(0.0, 1.1, 0.5)这两个测试点是否在球体内。
运行代码后,返回结果为:
1
0
这表明,第一个测试点在球内,第二个测试点在球外