我正在尝试从已排序的边缘点列表中创建2个(或更多)圆圈。 egdepoint只是一个点。边缘点列表构成圆的边缘。在边缘点之间绘制线条会在图片中显示黑线。因此,没有半径,圆圈的大小可能会有所不同。
看起来像这样:
我的想法是将其拆分为图片2.接下来,创建像this文章中的圈子。当然有拳头,中间和最后一点。
我创建了一种方法来检测边缘点是顺时针还是逆时针排序。不幸的是,我被困在如何检测这些"分裂点"图片可以旋转。
结果应该是带有边缘点的2(或更多)列表:
那我怎样才能发现这些"分裂点?#34;?或者有更好的方法来检测相交的圆圈吗?
答案 0 :(得分:1)
输入:类似Point []的东西。输出:像List [Circle]之类的东西 假设输入按照由重叠圆圈组成的某个图片的外边缘周围的位置进行排序。图片内部的任何点都不包括在内。
我想的更多,如果考虑坡度,我认为你可以更容易找到这些点。斜率变化很大的点是您要寻找的点。
[修改过的思想 - 首先找到过渡点,然后是圈子。] 首先使用函数计算两点之间的线段的斜率。当您绕过一个圆圈时,您将有一个合理的坡度变化(您必须通过检查点的接近程度来发现这一点)。假设您有像{A,B,C,D,...}这样的分数。计算A-> B和B-> C的斜率。如果点均匀间隔,那么差异或平均差异可能是公差(这里你必须小心过渡点 - 可能计算整个点集的平均值)。如果在某一点K-> L和L-> M的斜率与J-> K和K-> L非常不同,则将该指数记录为转变点。一旦遍历整个集合(包括Y-> Z和Z-> A的测试,如果它是封闭的形状),记录的索引应该定义过渡点。使用每个线段的中点作为每个圆的第三个点。 (例如,如果您将I和M标识为过渡点,则使用I,K和M来定义圆圈。)
[原创思想 - 先找到圈子] 使用引用的文章根据三个点确定圆的中心。然后通过测试参考点周围的一些点来确定它是否真的是一个有趣的圆圈。 (比如说,每隔5或10点挑一次,然后核实所有内部点)。对于更多重叠的圆圈,这将成为一个不太有效的过程,因此您必须仔细定义算法。获得所有参考圆后,处理所有边缘点(假设这些是图形外部的点)。使用中心,半径,距离公式和公差,确定哪个点在哪个圆上。在多个圆上符合容差的点是我想要的点。