7

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

我在下面包含了我的实现。我使用三个变量来确定斜角:CGFloat bevelSizeUIColor highlightColorUIColor shadow。请注意,光源的角度始终为 135 度。我还没有完成这个实现,但这基本上是我想要做的,分为两部分。第一部分,生成焦点:

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

生成焦点的目的是按比例“缩小”形状。

第二部分稍微复杂一些。我必须创建斜面形状的每一边/段。我通过绘制“in”来做到这一点(由bevelSize) 沿从最近的焦点延伸到相关点的直线半径的原始形状的每个点。当我有两个连续的“bevelPoints”时,我创建了一个 UIBezierPath,它从 bevelPoints 延伸到原始点并返回到 bevelPoints(注意,这包括弧)。这会创建一个我可以用来填充的“边/段”。在直边上,我只是根据边的角度填充阴影或高光颜色。对于弧,我确定弧度“弧”。如果该弧包含过渡角度(M_PI_4 或 M_PI + M_PI_4),我会用渐变填充它(从阴影到高光或从高光到阴影,无论哪种方式都合适)。否则我用纯色填充它。

更新

我已将我的答案(见下文)拆分为单独的博客文章。我不再使用您在上面看到的实现细节,但我将其全部保留以供参考。我希望这可以帮助其他希望使用 Core Graphics 的人。

4

1 回答 1

3

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

更新

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

我在这里解释我以前斜切的代码和过程:Beveling Shapes In Core Graphics

这是代码:Github:CGPathBevel

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

于 2012-05-29T20:35:04.497 回答