CAShapeLayer + BezierPath 处理图形编辑

2020-07-17  本文已影响0人  Realank

我们做图形编辑的时候,做了一个ShapeOperator类来操作图形,里面存储了图形的尺寸位置、旋转角度等信息,可以生成贝塞尔曲线,将其赋值给 CAShapeLayer即可完成渲染

旋转

SO上找到了操作贝塞尔曲线旋转的最佳实践:https://stackoverflow.com/questions/13738364/rotate-cgpath-without-changing-its-position

平移

直接改变控制点即可

编辑控制点

以矩形为例,矩形有四个控制点,即几个角,如果没有旋转,拖动任意控制点就能改变图形的大小,也很直观,但是增加了旋转以后,复杂度陡然提升

矩形的表示
控制点转换
有旋转的控制点变换追加平移
  1. 我们插入了下面的图形,边长 a,图形中心点 (x, y)
  1. 然后旋转这个图形到下图,
  1. 接着拖动图形最下面的这个顶点,让图形变大成边长b,我们期望的是下图的效果

想达到上面的效果,我们有两种途径:

如果想达成期望的效果,在编辑图形的时候,还要对图形进行平移,这样旋转以后就能使顶部的点与原先重合

我们按途径1,以不变旋转中心点的方式旋转以后,图形的中心点变成了 (x", y"),可以从下图看到,(x", y") 与 (x', y') 存在平移,而此平移的变化由来,就是以 (x, y) 为中心,将(x', y')旋转图形所旋转的角度,变到了(x", y") ,移动量就是 (x" - x', y" - y')

这样,在编辑的时候,计算编辑前后的中心点变化,并应用上面的变换,得到图形需要平移的量,追加给图形,就可以达到预期的效果了

总结

图形编辑,有时候看起来很简单直观的事情,在实际代码上,就会非常困难,最近在做曲线的旋转,又是一个大坑,因为曲线的起始点,终点、控制点三个点,位置的不同,决定了曲线的形状,拖动终点或起点的时候,三个点都会变化,而且一会正一会负,需要根据象限分别判断曲线是凸的还是凹的,头大啊。。

上一篇 下一篇

猜你喜欢

热点阅读