我正在尝试将两个椭圆拟合到 body 的顶 View /轮廓上。为了简单起见,我们使用以下示例:
正如您所看到的,这个简单的 body 由一个长核心(蓝色)和一个头部(红色)组成。实际上,这个轮廓将是一种颜色,我在这里只是使用两种颜色来实现可视化目的。
我知道如何将单个椭圆拟合到该轮廓的任意部分,但是考虑到这两个椭圆实际上是相连的约束,我不知道如何拟合两个椭圆。在这种特殊情况下,约束是两个椭圆永远不会分开,并且椭圆 1 和椭圆 2 之间只能有一定的角度。
我很感激任何告诉我如何编写函数的指针,以便在调用 magic_fitting_function(body_outline)
后,程序返回两个底层椭圆的坐标:
编辑1: 可以使解决这个问题更容易的最低要求是什么?例如。如果给我一点、两点等等,这怎么可能简化问题?
编辑2: 我正在寻找一种独立于编程语言的解决方案。
编辑3: 关于如何以编程方式制定这两个椭圆彼此之间存在某种关系的约束有任何提示吗?例如:我知道小椭圆总是位于大椭圆长轴的一端。而且小椭圆相对于大椭圆只能旋转±90度。
最佳答案
我从来没有解决过这个问题,所以我只是提出一个建议。
首先,为整个图形生成一个边界椭圆,以确定最顶部和最底部的点。 (如果您有更好的方法来找到这些点,则可能不需要此步骤。)
接下来,使用修改后的二分搜索来检测“脖子”的位置。 (在这里,我假设您的边界椭圆具有垂直方向,就好像图形站立或倒立一样。)生成两组边界椭圆:一组具有从图形顶部到 1/的椭圆图形的 4 点(意味着如果您通过边界椭圆画一条线,则 1/4 点位于左上角点和中间点之间),并且从 1/4 点到图形底部有一个椭圆,一个是从图的顶部到 3/4 点有一个椭圆,一个是从 3/4 点到图的底部有一个椭圆;总面积较小的一组椭圆能够更好地封装头部。继续搜索(例如,接下来测试从顶部到 1/8 点/7/8 点和/或从顶部到 3/8 点/5/8 点的椭圆),直到最小化总边界椭圆集的面积;椭圆相交的点是颈部。 (不需要太精确,如果你把琴颈放在 34/256 点或 35/256 点,可能没有太大区别。)
要检测颈部,您可能需要使用边界框而不是边界椭圆。
最后,调整两个边界椭圆以满足它们的角度约束,例如通过以 5% 的增量移动它们的极值点(因此假设头部椭圆的极值点在 y 坐标 0 和 50 上,而 body 椭圆的极值点在 y 坐标 50 和 200 上,调整它们,使它们的极值 y -坐标在 0 和 60 以及 40 和 200 上)。
关于java - 将两个椭圆拟合到 body 轮廓,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17367171/