我试图将已知明确定义的形状(例如盒子,圆柱体;具有可配置的位置,旋转和尺寸)拟合到一组点,其中法线通过采样3D网格生成。我目前的方法是为每个形状定义自定义拟合函数,并将其传递给第三方优化函数:
fitness = get_fitness(shape_parameters, points)
best_parameters = external.optimise(get_fitness, initial_parameters, points)
(作为参考,我目前正在使用带有边界的Python 3和scipy.optimize.minimize
,但语言无关紧要)。
这个矩形的适应度函数看起来像
def get_fitness(parameters, points):
side_fitnesses = []
for side in [top, right, bottom, left, back, front]:
dists = get_side_distances(parameters, points, side)
ndevs = get_side_normal_deviations(parameters, points, side)
side_fitnesses.append(combine_dists_and_ndevs(dists, ndevs))
fitnesses = choose_best_side_for_each_point(side_fitnesses)
return mean(fitnesses)
然而,这意味着我必须确定异常值(有/没有缓存),我一次只能拟合一个形状。
例如(在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