gpt4 book ai didi

iphone - CGPathRef 交集

转载 作者:行者123 更新时间:2023-12-03 16:05:33 27 4
gpt4 key购买 nike

有没有办法找出两个 CGPathRef 是否相交。就我而言,所有 CGPath 都有 closePath。

例如,我有两条路径。一条路径是旋转一定角度的矩形,另一条路径是弯曲路径。两条路径的原点会经常变化。在某些时候它们可能会相交。我想知道它们什么时候相交。如果您有任何解决方案,请告诉我。

提前致谢

最佳答案

将一条路径设为剪切路径,绘制另一条路径,然后搜索在剪切过程中幸存下来的像素:

// initialise and erase context
CGContextAddPath(context, path1);
CGContextClip(context);

// set fill colour to intersection colour
CGContextAddPath(context, path2);
CGContextFillPath(context);

// search for pixels that match intersection colour

这是有效的,因为裁剪 = 相交。

不要忘记,交集取决于内部性的定义,而内部性的定义有多种。此代码使用绕数填充规则,您可能需要偶数规则或其他规则。如果内在性不会让你彻夜难眠,那么这段代码应该没问题。

我之前的回答涉及将透明曲线绘制到 RGBA 上下文。该解决方案优于旧解决方案,因为它是

  1. 更简单
  2. 使用四分之一的内存作为 8 位灰度上下文就足够了
  3. 不再需要复杂且难以调试的透明代码

谁能要求更多?

我想您可以要求一个完整的实现,准备好剪切和粘贴,但这会破坏乐趣并混淆原本简单的答案。

较旧、较难理解且效率较低的答案

以 50% 的透明度单独将两个 CGPathRefs 绘制到归零、CGBitmapContextCreate-ed RGBA 内存缓冲区中,并检查是否有任何像素值 > 128 . 这适用于任何支持 CoreGraphics 的平台(即 iOS 和 OSX)。

伪代码

// zero memory

CGContextRef context;
context = CGBitmapContextCreate(memory, wide, high, 8, wide*4, CGColorSpaceCreateDeviceRGB(), kCGImageAlphaPremultipliedLast);
CGContextSetRGBFillColor(context, 1, 1, 1, 0.5); // now everything you draw will be at 50%

// draw your path 1 to context

// draw your path 2 to context

// for each pixel in memory buffer
if(*p > 128) return true; // curves intersect
else p+= 4; // keep looking

让光栅化版本的分辨率成为您的精度,并选择适合您的性能需求的精度。

关于iphone - CGPathRef 交集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1021801/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com