适合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太不准确,无法使用。 而对于大多数其他形状,这是非常准确的。 但是这种差异意味着我不能用这个作为一个普遍的解决办法。 一些偏移(修正)仍然必须适用于某些形状,使他们看起来居中。 哎呀。