【SDU Chart Team - Core】组件旋转模块、组件缩放模块、组件翻转模块

组件旋转模块、组件缩放模块、组件翻转模块

这些组件模块解决了一些组件变换问题。其中组件旋转模块基于组件基础模块,并给出了实现;组件缩放模块和组件翻转模块是一个抽象的框架,需要留给具体的组件来实现。

组件旋转模块

解决了组件的旋转和多级旋转问题,并借助核心中提供的几何框架实现了组件坐标系。

多级旋转下的等价过程

需要用一种问题分解的手段解决。可以利用等价形式将问题简化:

  • 旋转下移动至 moveTo ( x , y ) \text{moveTo}(x, y) moveTo(x,y)

    设当前中心的画布坐标为 c c c,等价于 move ( x − c . x , y − c . y ) \text{move}(x-c.x, y-c.y) move(xc.x,yc.y)

  • 更新旋转状态 onCorePointMoved ( c ) \text{onCorePointMoved}(c) onCorePointMoved(c)

    其中一个关键问题是需要保证旋转中心具有稳定性,即旋转前后旋转中心始终在 c c c。那么实际上这个问题等价于旋转绑定(应用旋转)后 moveTo ( c . x , c . y ) \text{moveTo}(c.x, c.y) moveTo(c.x,c.y)

  • 设置旋转绑定状态 setRotateBinded ( f l a g ) \text{setRotateBinded}(flag) setRotateBinded(flag)

    • 若从假到真,则等价于将其从父亲为空变更为父亲为父旋转绑定组件
    • 若从真到假,则等价于将其从父亲为父旋转绑定组件变更为父亲为空
  • 旋转绑定 moveBindEvent ( d x , d y ) \text{moveBindEvent}(dx, dy) moveBindEvent(dx,dy)

    在旋转状态下使所有非子旋转绑定组件不动, 使子旋转绑定组件移动到 ( d x , d y ) (dx, dy) (dx,dy),等价于

    1. 先让所有组件不动
    2. 再让其中子旋转绑定组件移动到 ( d x , d y ) (dx, dy) (dx,dy)

    又因为只有旋转组件会发生变化,所以第一步也等价于先记录旋转组件的位置,再进行旋转绑定,最后使他们回到原位置。

  • 旋转下变更父子关系 rotateRelinkEvent ( p r e v , n o w ) \text{rotateRelinkEvent}(prev, now) rotateRelinkEvent(prev,now)

    设prev的绝对旋转角度为 θ 1 θ_1 θ1 n o w now now的绝对旋转角度为 θ 2 θ_2 θ2;设当前中心的画布坐标为c,则等价于 θ = θ + θ 1 − θ 2 θ=θ+θ_1-θ_2 θ=θ+θ1θ2,然后 moveTo ( c . x , c . y ) \text{moveTo}(c.x, c.y) moveTo(c.x,c.y)

组件旋转模块工作流


参考前面推导出的等价过程,上图是旋转组件中的调用关系。

组件缩放模块

组件的缩放步骤并不是唯一的,项目中只实现了最广义最简单的矩形类别的缩放。

矩形的缩放

两种等价形式:

  • 先变换大小,后移动
  • 先移动,后变换大小

两者也是相互等价的,任一实现斗式正确的。

然而对于子级组件缩放有严格限制,要求先缩放后移动。

缩放绑定

过程类似一定绑定,唯一的不同是子组件的缩放需要进行移动,保持子组件中心到组件中心的距离相对整个矩形不变。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值