适合UIBezierPath / CGPath圈

我需要将任意形状的pathassembly到一个圆的内部。

我可以通过计算大小,构build目标矩形,然后缩放path以适合目标矩形,来适应圆的矩形path。

let targetSize = circleDiameter / sqrt(2) let destRect = CGRect(x: 0, y: 0, width: targetSize, height: targetSize) // ... Scale the path to the rect, using boundingBox of path. 

但是扩展过程不是问题; 这真的是如何计算所需的规模。

基于边界框的方法对于非矩形形状提供了很差的适应性,并且对于诸如圆形的形状很不适合。

任何人都可以提出一种方法来适应任何一个圆的内部path? 谢谢。

[编辑 – 以后大量的研究]

在这个图像中可以看到问题:

矩形绘图系统不适合

  • 蓝色矩形表示原始图像,修剪到path。

  • 红色圆圈是最小的边界圆。

  • 绿色矩形表示边界圆的边界框。

我需要计算红圈,所以我可以用它来缩放path。

原来这就是所谓的最小包围圆问题(AKA最小的围合圆)。

唉,我找不到任何已知algorithm的Swift或Objective-C实现,并可能需要解决一些Java / JS / C ++代码。 如果有人能节省我的时间,请做! 温暖的模糊入境。

[另一个编辑,时间飞逝]

从中国的angular度来看,这是一个相当“有趣”的问题。

目前的做法是:

  • 获取path中的所有点。 由于CGPath/UIBEzier没有这个function,path必须使用(可耻的) apply(:)方法来走路。 这包括控制点,所以它不是最终的结果,但希望它足够接近。

  • 将所有点合并到一个数组中。 万岁flatMap()

  • 从点创build一些JSON,加载一些JavaScript *,通过JavaScriptCore将JSON提供给JavaScript方法。 有趣,有趣的时刻,在console.log()中花费几个小时…最后,获得一个回报。

  • 得到圈子的界限; 在转换时使用它作为path的框架设备。

  • 那么,如果它的工作,将MEC JS移植到Swift中,希望在这个过程中永远不用使用UnsafeMutablePointer。

  • 感谢: https : //www.nayuki.io/page/smallest-enclosing-circle

[另一个编辑,经过一个星期的努力工作]

好的,这是一个棘手的问题。 有些形状适合使用矩形进行居中,而另一些则使用边界圆形进行居中。 检测哪个是相当诡计。

这可能是因为我能从UIBezierPath / CGPath获得path点的质量,但是对于一小部分形状的计算的boundingCircle太不准确,无法使用。 而对于大多数其他形状,这是非常准确的。 但是这种差异意味着我不能用这个作为一个普遍的解决办法。 一些偏移(修正)仍然必须适用于某些形状,使他们看起来居中。 哎呀。