在Core Graphics中斜切路径/形状

Aar*_*man 7 core-graphics objective-c shape uibezierpath

我正试图在核心图形中斜切路径.有没有人已经为任意形状做过这个,如果是这样,他们是否愿意共享代码?

我在下面列出了我的实现.我用三个变量来确定伞:CGFloat bevelSize,UIColor highlightColor,UIColor shadow.请注意,光源的角度始终为135度.我还没有完成这个,但这里基本上是我要做的,分成两部分.第一部分,产生焦点:

  1. 我找到了路径中每条相邻线之间角度的平分线.
  2. 对于弧,平分线是垂直于由弧的两个端点产生的线的线,源自中点.这应该照顾使用电弧的大多数情况.我不拿弧线和线的平分线.在这些情况下,弧平分线应该可以正常工作.
  3. 然后,我根据每个相邻平分线的交点计算焦点.
  4. 如果焦点位于其使用的形状内,否则将被丢弃.

产生焦点的目的是按比例"缩小"形状.

第二部分有点复杂.我必须创建斜面形状的每个边/部分.我这样做是通过bevelSize沿着从最近的焦点延伸到所讨论的点的线的半径来绘制(由)原始形状的每个点.当我有两个连续的'bevelPoints'时,我创建了一个UIBezierPath,它从bevelPoints延伸到原始点并返回到bevelPoints(注意,这包括弧).这会创建一个我可以用来填充的"边/段".在直边,我只是填充阴影或高光颜色,取决于侧面的角度.对于弧,我确定弧度'弧'.如果该弧包含一个过渡角(M_PI_4或M_PI + M_PI_4),我用渐变填充它(从阴影到高光或高亮到阴影,这是合适的).否则我用纯色填充它.

更新

我把我的答案(见下文)分成了一个单独的博文.我不再使用您在上面看到的实现细节,但我将其全部保留在那里以供参考.我希望这可以帮助其他人使用Core Graphics.

Aar*_*man 3

所以我最终设法编写了一个例程来对核心图形中的任意形状进行斜角处理。最终的工作量很大,比我最初预期的要多得多,但这是一个有趣的项目。我已经在我的博客上发布了解释和执行斜角的代码。请注意,我没有为此创建完整的类(或类集)。这段代码被集成到一个更大的类中,我用它来完成所有核心图形绘制。然而,对大多数任意形状进行倒角所需的所有代码都在那里。

更新

我已将代码重写为直接 c 并将其移至单独的文件中。它不再依赖于任何其他实例变量,因此可以从任何上下文中调用斜切函数。

我在这里解释了我用来斜角的代码和过程:Beveling Shapes In Core Graphics

这是代码:Github:CGPathBevel

该代码并不完美:我愿意接受建议/更正/更好的做事方式。