当前位置: 首页 > article >正文

使用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

这表明,第一个测试点在球内,第二个测试点在球外


http://www.kler.cn/a/231893.html

相关文章:

  • 【.NET 8 实战--孢子记账--从单体到微服务】--简易权限--完善TODO标记的代码
  • 【计算机网络】协议定制
  • Flume 单机与集群部署详细教程
  • day-83 最少翻转次数使二进制矩阵回文 II
  • mybatis-plus: mapper-locations: “classpath*:/mapper/**/*.xml“配置!!!解释
  • React Native 全栈开发实战班 - 网络与数据之网络请求基础
  • go 内存二进制数据操作
  • Redis——缓存设计与优化
  • Python面试题13-18
  • vue3 mathjax2.7.7 数学公式
  • Chrome 沙箱逃逸 -- Plaid CTF 2020 mojo
  • 服务器运存使用率多少正常?
  • Spring Cloud Netflix Eureka的参数调优
  • 在windows的控制台实现贪吃蛇小游戏
  • 预测模型:MATLAB线性回归
  • 【芯片设计- RTL 数字逻辑设计入门 11.1 -- 状态机实现 移位运算与乘法 1】
  • 8.0 Zookeeper 四字命令教程详解
  • ruoyi-nbcio中xxl-job的安装与使用
  • C# async/await的使用
  • Java微服务学习Day1
  • facebook广告投流有几种方式
  • XSS攻击 - 不要再硬背了
  • svg基础(五)滤镜-高斯模糊,混合模式,偏移,颜色变换
  • [C/C++] -- JSON for Modern C++
  • Centos 内存和硬盘占用情况以及top作用
  • JVM 性能调优 - 参数基础(2)