Algorithm 将形状与点匹配

Algorithm 将形状与点匹配,algorithm,shapes,data-fitting,Algorithm,Shapes,Data Fitting,我正在尝试将已知的定义良好的形状(例如长方体、圆柱体;具有可配置的位置、旋转和尺寸)拟合到一组点,这些点具有从采样3D网格生成的法线。我当前的方法是为每个形状定义自定义拟合函数,并将其传递给第三方优化函数: fitness=get\u fitness(形状参数、点) 最佳参数=外部。优化(获取适合度、初始参数、点数) (作为参考,我目前使用的是Python3和带边界的,但语言与此无关) 矩形的适应度函数类似于 def get_fitness(参数、点): 侧配度=[] 对于[顶部、右侧、底部、

我正在尝试将已知的定义良好的形状(例如长方体、圆柱体;具有可配置的位置、旋转和尺寸)拟合到一组点,这些点具有从采样3D网格生成的法线。我当前的方法是为每个形状定义自定义拟合函数,并将其传递给第三方优化函数:

fitness=get\u fitness(形状参数、点)
最佳参数=外部。优化(获取适合度、初始参数、点数)
(作为参考,我目前使用的是Python3和带边界的,但语言与此无关)

矩形的适应度函数类似于

def get_fitness(参数、点):
侧配度=[]
对于[顶部、右侧、底部、左侧、后部、前部]中的侧面:
距离=获取边距离(参数、点、边)
ndevs=获取侧面正常偏差(参数、点、侧面)
侧边配件。附加(合并区和无损检测(区、无损检测))
适合度=为每个点(侧面适合度)选择最佳侧面
返回平均值(拟合度)
然而,这意味着我必须确定异常值(有/没有缓存),并且一次只能适应一个形状

例如(在2D中),对于这些点(具有法线),我希望得到以下结果:

请注意,返回了多个形状,并且忽略了异常值。通常,输入数据中可以有多个、一个或零个形状。后处理可以删除无效(如太小)结果

注:我真正的问题是3D。我有真实世界对象的3D网格表示的片段,这意味着我拥有的信息不仅仅是上面示例中的点/法线(例如面区域和连接)

进一步阅读:


PS:我不确定StackOverflow是否是解决此问题的最佳StackExchange站点

那么您将不得不使用体积处理网格。这改变了很多事情

  • 分割对象

    正在选择包围其内部的所有面。。。因此,它与此类似:

    所以只要在未使用的网格中找到一个点。。。和“填充”体积,直到你击中它所组成的所有面。选择这些面作为属于新对象的面。并将它们设置为已使用。。。小心触摸物体可能会导致使用面两次或更多

    你们也可以在向量数学/空间上这样做,所以只要测试一下从某个内点到某个面的线是否碰到了其他面。。。如果没有,你找到了你的表面。。。近似

  • 处理对象(可选)

    通过对属于同一平面的面进行分组,可以进一步将对象网格分割为由其组成的“平面”对象。。。或内部封闭边缘/轮廓。。。然后检测它们是什么

    • 三角
    • 长方形
    • 多边形
    • 圆盘
    从“面数”和“面类型”可以检测基本对象,如:

    cone = 1 disc + 1 curved surface with singular edge point parallel to disc center
    box/cube = 6 rectangles/squares
    cylinder = 2 discs + 1 curved surface with center axis going through discs centers
    
  • 计算单个对象的基本几何特性(可选)

    像BBOX或,表面,体积,几何。重心,质心

    现在只要决定它是什么类型的对象。例如,表面积和体积之间的比率可以提示球体或椭球体,如果OBB与边匹配,则提示框,如果几何中心和质心相同,则提示对称对象

  • 将网格传递给可能的对象类型拟合功能

    因此,根据项目符号#2、#3您可以知道哪些对象可能是哪些形状,因此只需使用拟合函数确认即可

    要简化此过程,您可以使用#3中的属性。例如,请参见类似内容:

    因此,您可以为基本3D形状提出类似的技术


  • 您好,您能再澄清一点吗?例如,对于您介绍的示例:形状的数量是固定的吗?两者的相对位置是固定的吗?您希望优化的是尺寸、方向还是两者?在给定的示例中,右下角的第三个矩形将使“异常值”完全有效。。。首先确定轮廓,然后创建一条穿过所有点的多段线,换句话说,首先对点进行重新排序/分组。然后在多段线上找到边和交叉/连接点,这将把你的集合划分为多个组,然后决定一个组是直线还是曲线。。。拟合它,最后在拟合的直线和曲线上检测您的形状。。。正如你所看到的,这类事情可能太多了,所以答案是…之后确定简单的形状很容易(甚至更快),例如矩形是由4条90度角的连接线组成,其中两对线的长度相同。。。所以你可以匹配+/-一些误差。。。如你所述,你的目标是3D,但什么形状是平面形状或体积形状,如球体、长方体等?你的数据集来自哪里。。。如果已经处理了原始数据中可能还有一些信息可以简化您的任务谢谢@Spektre,我已经用更多信息更新了问题。你认为我应该编辑问题以删除所有2D吗?这可能使问题更难处理