使UIBezierPath / CGPath适合循环

时间:2017-05-29 09:53:12

标签: ios swift core-graphics uibezierpath cgpath

我需要在任意形状的路径中找到圆圈的内部。

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

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.

但缩放过程不是问题;它真的是如何计算所需的规模。

基于边界框的方法不适合非矩形形状,并且非常适合于诸如圆形的形状。

任何人都可以建议一种方法来适应圆圈内部的任意路径吗?感谢。

[编辑 - 后来的大量研究]

在此图片中可以看到问题:

Unsuitability of rectangular drawing system

  • 蓝色矩形代表修剪到路径的原生图像。

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

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

我需要计算红色圆圈,所以我可以用它来缩放路径。

原来这被称为最小封闭圆问题(AKA最小封闭圆)。

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

[另一个编辑,时间过得真快]

在中国意义上,这是一个非常“有趣”的问题。

目前的做法是:

  • 获取路径中的所有点。由于CGPath/UIBEzier没有此功能,因此必须使用(可耻的)apply(:)方法遍历路径。这包括控制点,因此它与最终结果不同,但希望它足够接近。

  • 将所有点合并到一个数组中。万世奇妙的flatMap()

  • 从点创建一些json,加载一些javascript *,通过JavaScriptCore将json提供给javascript方法。有趣,有趣的时间,在console.log()中花费几个小时......最后,获得一个圆圈作为回报。

  • 获得圆圈的界限;在转换时使用它作为路径的框架设备。

  • 然后,如果它有效,将MEC JS移植到Swift中,并希望在这个过程中我永远不必使用UnsafeMutablePointer。

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

[另一个编辑,经过一周的辛勤工作]

好的,这是一个棘手的问题。有些形状适合使用rects定中心,有些则使用定界圆定中心。检测哪个是诀窍。

这可能是因为我能够从UIBezierPath / CGPath获得的路径点的质量,但是对于一小部分形状的计算boundingCircle使用起来太不准确了。而对于大多数其他形状,它是非常准确的。但这种差异意味着我不能将其作为一般解决方案;一些偏移(修正)仍然必须应用于某些形状,使它们看起来居中。哎呀。

0 个答案:

没有答案