c# 如何检测与边缘点分开的相交圆

c# how to detect intersecting circles as separate from edgepoints

我正在尝试从已排序的边缘点列表中创建 2 个(或更多)圆。 egdepoint 只是一个点。边缘点列表构成圆的边缘。在边缘点之间画一条线给出了图片中的黑线。所以没有半径,圆的大小可以变化。

看起来像这样:

我的想法是像图2那样拆分。接下来,像this文章中那样创建圆圈。当然还有拳头、中点和最后一点。

我创建了一种方法来检测边缘点是顺时针还是逆时针排序。不幸的是,我一直在研究如何检测这些 "split points" 图片当然可以旋转。

结果应该是 2(或更多)个带有边缘点的列表:

那么我怎样才能检测到这些 "split points"?或者有没有更好的方法来检测相交的圆圈是分开的?

输入:类似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 个点选取一次,然后验证所有内部点)。如果有更多的重叠圆圈,这将成为一个效率较低的过程,因此您必须仔细定义算法。获得所有参考圆后,处理所有边缘点(假设这些点位于图形外部)。使用圆心、半径、距离公式和公差,确定哪些点位于哪个圆上。符合公差超过一个圆的点我想就是你要找的点。