`
smiky
  • 浏览: 253765 次
  • 性别: Icon_minigender_1
  • 来自: 天门
社区版块
存档分类
最新评论

鼠标拖动时旋转(多个节点以同一点旋转)

 
阅读更多

示例以raphaeljs在操作

在旋转时要搞明白一个问题,相对于谁在旋转?

这里有一个节点,x为170,y为160,width为150,height为50,没有旋转此时它的matrix为(1,0,0,1,0,0),

此时我们调用rotate(90,235,185)会使它以轴心圆心90度


 

 旋转之后结果:



 

 这个时候也不管什么matrix,x,y如果此时我想以左上角为圆心来旋转此节点,应该怎么操作?

聪明的同学肯定相到了,直接rotate(90,170,160+50)就可以了,那么为什么这样就可以了呢?

左上角在直接坐标系中的坐标是(210,110)根据圆心所在位置很简单就可以算出来或者根据matrix来计算

x =170 * 0 -(160+50) + 430 = 210 (x = matrix['a'] * x + matrix['c']*y+e)

y=170*1- 210*0 - 60=110(y = matrix['b'] * x + matrix['d']*y+f)

在大部分情况下我知道节点此时的左上角坐标为(210,110)为什么我不能用rotate(90,210,110)而要用rotate(90,170,210),它们的区别在那里?

第一种做法肯定是对的,那么第二种错在那?

问题的根源在这里,这里有两个坐标系,一个是画布的直接坐标系,一个是节点本身的坐标系,节点旋转时是以其本身的坐标系来计算圆心的,一个节点不管你怎么旋转它的x,y是不会变化的(相对于它自己),此时根据它来计算对应的旋转坐标。

如果直接指定画布坐标系的坐标给节点rotate,那么节点会认为这是我本身的坐标系,于是就出错了。

 

那么在知道画布坐标的情况下,怎么计算出相对于节点的坐标,比如说这里有(210,110)怎么算出其相对节点为(170,210)?

一般情况下,在节点旋转后我们会根据matrix*(x,y)得出实际坐标,那么在知道实际坐标后除以matrix就能得出相对于节点的坐标了,根据实际坐标*matrix的反置矩阵即可算出来

matrixproto.invert = function () {
            var me = this,
                x = me.a * me.d - me.b * me.c;
            return new Matrix(me.d / x, -me.b / x, -me.c / x, me.a / x, (me.c * me.f - me.d * me.e) / x, (me.b * me.e - me.a * me.f) / x);
        };

 所以关键点在于旋转是以节点本身的坐标系为依准的。

 

明白了这一点,那么处理多个节点旋转就很方便了。

获取到旋转中心后,分别计算此中心相对于各节点的坐标就OK了

/**
					 * 旋转时是相对于旋转系里面的坐标来定的,比如说一个节点以500,0来旋转,
					 * 这个500,0是相对于节点本身的坐标系,对节点来说是500,0,对直角坐标系来说
					 * 就要乘以matrix才是真正的坐标,
					 * 现在己知旋转的圆心在直角坐标系中的圆心,要计算出相对于节点的坐标系的坐标
					 * 即要除以matrix才是直正的坐标
					 * 
					 * 多个节点相对于一点旋转,就要计算出这点相对于节点的做标
					 */
					var matrix = selectedNode.getMatrix().invert();
					var ncx = matrix['a'] * cx + matrix['c'] * cy + matrix['e'];
					var ncy = matrix['b'] * cx + matrix['d'] * cy + matrix['f'];
					selectedNode.rotate( offsetAngle, ncx, ncy );

 


 

 

 

 

 

 

  • 大小: 3.4 KB
  • 大小: 9.8 KB
  • 大小: 2 KB
  • 大小: 4.1 KB
  • 大小: 2.2 KB
  • 大小: 3.4 KB
分享到:
评论

相关推荐

    计算机辅助设计3dsmax试题.doc

    15、用车削命令生成旋转物体时,可以使顶盖和底盖平整的参数选项是焊接内核 16、在复合物体中,可用于多个二维平面物体和一个三维几何体之间进行相加、相减运 算的物体命令是图形合并 17、用于将一个物体复制多个,...

    Puppet3D-1.9V

    我们可以在编辑器中使用鼠标直接拖动骨骼节点,完成绑定。接着,用户可以利用控制工具对每个关节进行精细的控制,包括位置、旋转和缩放。而这些控制工具则极其方便,例如自由变形工具可以拉伸、压缩、平移模型,并且...

    易佳工艺软件

    水平移动选中关键点: 通过鼠标可以把选中的关键点(多个)进行水平移动 垂直移动选中关键点: 通过鼠标可以把选中的关键点(多个)进行垂直移动 2009/12/19 10.9.5.7 1. 编辑增加关键点的工具下面有二级菜单: ...

    VC++常用的共用函数100多页

    45、当向列表框中添加多个项时如何防止闪烁 55 46、如何向编辑控件中添加文本 55 47、如何访问预定义的GDI对象 55 48、如何获取GDI对象的属性信息 56 49、如何实现一个橡皮区矩形 56 50、如何更新翻转背景颜色的文本...

    VC++常用功能实例

    45、当向列表框中添加多个项时如何防止闪烁 55 46、如何向编辑控件中添加文本 55 47、如何访问预定义的GDI对象 55 48、如何获取GDI对象的属性信息 56 49、如何实现一个橡皮区矩形 56 50、如何更新翻转背景颜色的文本...

    [Flash.ActionScript.3.0动画教程

    8.3.8 弹簧连接多个物体 8.4 本章重点公式 8.5 小结 第9章 碰撞检测 9.1 碰撞检测方法 9.2 hitTestObject 与 hitTestPoint 9.2.1 碰撞检测两个影片 9.2.2 影片与点的碰撞检测 9.2.3 使用 shapeFlag 执行碰撞检测 9.2...

    超实用的jQuery代码段

    6.15 使用拖动方式选择多个元素 6.16 在两个Tab标签之间进行元素拖动 6.17 拖动表格选择多行数据 6.18 拖动表格时自动选中复选框 6.19 拖动表格行并放置到目标位置 6.20 表格的拖动排序 6.21 拖动调整控件的大小 ...

    C#编程经验技巧宝典

    24 <br>0050 using关键字的用法 24 <br>0051 变量的作用域 25 <br>2.5 其他 26 <br>0052 有效使用this对象 26 <br>0053 如何声明变量 26 <br>0054 如何声明相同类型的多个变量 26 ...

    C#程序开发范例宝典(第2版).part08

    精选570个典型范例,全面覆盖实用和热点技术,涉及面广,实用性强源于实际项目开发,帮助读者短时间掌握更多实用技术,提高编程水平范例经过精心编排,重点、难点突出,易学易懂书后附录提供快速索引,即查、即学、...

    protel2004封装

    在分类过程中,最好分的比较细一点,虽然看起来库比较多,但是一则管理比较方便,维护、修改、添加等都十分容易,二则在调用元件时一目了然,作者就是这样管理和用运的,比在原来的库中用运方便的多。 六、 创建和...

    C#开发实例大全(基础卷).软件开发技术联盟(带详细书签) PDF 下载

    实例220 动态创建多个Button控件 295 11.2 TextBox控件应用 296 实例221 制作多行文本框 296 实例222 制作密码文本框 297 实例223 在TextBox控件中显示回车符 297 实例224 只允许输入数字的TextBox控件 298 实例225 ...

    Visual C++编程技巧精选集 光盘

    81.如何通过控件实现鼠标拖动文本效果 第3章 标题栏和菜单栏 82.如何获取程序窗口标题栏的高度 83.如何获取程序窗口标题栏的按钮尺寸 84.如何获取程序窗口标题栏的文字 85.如何获取程序窗口标题栏的文字颜色 86....

    delphi 开发经验技巧宝典源码

    0031 使两个变量位于同一个地址空间 23 0032 利用动态数组作为函数参数 24 0033 调用Register过程的注意事项 24 0034 在Delphi中禁止使用result 24 0035 如何在Delphi中录制代码 24 0036 如何编译器会...

Global site tag (gtag.js) - Google Analytics