`
smiky
  • 浏览: 257725 次
  • 性别: 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
分享到:
评论

相关推荐

    旋转门的VRML程序

    使用了多个Transform节点进行位置变换,配合Shape节点定义门框的形状。此处使用了Cylinder几何体来构建门框,通过调整radius和height属性,设置门框的尺寸。Appearance节点内的Material属性用于设定门框的外观颜色、...

    qt实现qgaphicsitem的拖动连线等操作

    在这个类中,我们将重写几个关键方法以实现拖动和缩放功能: 1. `boundingRect()`:返回项的边界矩形,用于确定项的可见区域。 2. `paint()`:根据边界矩形绘制项的外观。 3. `shape()`:返回项的轮廓形状,用于...

    2021年Visio常用地几个技巧,很方便哦~.pdf

    3. 键盘的Shift同时用鼠标拖动,可以调节选中节点及相关线的位置及角度;键盘的Ctrl同时用鼠标拖动,可以调节选中节点的位置及角度。 4. Ctrl+Alt,放大局部。 5. 所选形状向左旋转(“形状”菜单,“旋转或翻转”子...

    C# 类似Visio图形拖拽实现

    在C#编程中,实现类似Visio的图形拖拽...随着需求的增加,可以扩展更多的图形类型和交互逻辑,如节点的旋转、缩放、连接线的样式选择等。这个WindowsFormsDemo项目将是一个很好的起点,帮助你深入理解和实践这些概念。

    010_QTreeWidgetDemo.rar

    2. **自定义项**:每个节点(QTreeWidgetItem)都可以包含多个列,并且可以自定义每一列的显示内容,例如在这里可能用于展示图片的名称、大小、类型等信息。 3. **交互性**:用户可以通过鼠标点击、拖拽等方式与...

    Qt实现高级思维导图

    在创建思维导图时,我们可以使用QGraphicsItem作为节点的基础,每个节点都是一个可自定义的图形对象,包含文本、图标等元素。QGraphicsItem支持事件处理,使得我们能实现点击、拖动等交互功能。通过继承QGraphics...

    HYPERMESH入门指南

    - **永久菜单**:位于屏幕右下角,包含多个关键功能按钮。 - **Z(Zoom)**:用于图形的缩放。 - 点击后,在需要放大的区域绘制一个矩形即可实现局部放大。 - **zP(Refresh)**:刷新当前视图。 - **zR(Rotate...

    基于jQuery Circlr插件实现产品图片360度旋转

    - **支持水平和垂直方向的旋转**:用户可以通过鼠标拖动图片进行360度旋转,也可以设置在垂直方向上移动鼠标时旋转图片。 - **移动触摸事件的支持**:Circlr插件支持移动设备上的触摸事件,用户可以通过多点触控来...

    OSG嵌入Qt窗体的范例

    例如,当检测到鼠标按下时记录初始位置,然后在鼠标移动时计算位移并应用到3D模型上。旋转可以通过计算鼠标在X-Y平面上的相对角度实现,缩放则可以基于鼠标滚轮的滚动量调整模型的大小。 在实现交互功能的过程中,...

    osg事件响应源码

    在osgEventDemo中,开发者可能创建了一个或多个osg::NodeVisitor类的子类,这些子类重写了访问节点时的行为,以响应特定的鼠标或键盘事件。例如,一个名为`osgGA::MouseMoveHandler`的类可能会处理鼠标移动事件,...

    java 3d 魔方源代码

    这个模型通常由多个立方体组成,每个立方体代表魔方的一个小块。通过Java 3D的几何对象(如Box或Cube)以及变换组(TransformGroup)来实现。变换组允许开发者对物体进行旋转、平移和缩放操作,模拟魔方的转动动作。...

    flash+xml360度图片旋转展示代码

    4. 设置旋转逻辑:编写代码处理用户输入,例如鼠标拖动或触摸滑动,计算相应的旋转角度。 5. 动画渲染:使用Tween类或帧动画实现平滑的旋转过渡效果。 6. 更新显示:实时更新图片的位置和角度,达到360度旋转的视觉...

    位图显示和画图

    混合模式允许我们以不同的方式结合两个或多个图形,创造出各种视觉效果。 在实际应用中,画图常常与事件处理相结合,如鼠标点击或移动事件,以实现交互式绘图。例如,用户可以通过拖动鼠标来画线或填充区域。此外,...

    Puppet3D-1.9V

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

    jtopo编辑拓扑图功能实现

    这个库提供了丰富的功能,使得开发者能够轻松地构建动态、交互式的网络拓扑视图,适用于教学、模拟或者网络管理等多个场景。在本篇文章中,我们将深入探讨jtopo的核心特性以及如何利用它来实现拓扑图的编辑功能。 1...

    openinventor实现选择

    9. **自定义选择行为**:除了基本的点选,还可以扩展选择功能,例如基于区域的选择、连续选择(拖动鼠标选择多个物体)、或者根据特定条件(如材质、颜色)进行选择。 10. **交互性**:结合键盘和鼠标操作,可以...

    vrml案例文件太阳系

    4. **原型(Prototypes)**:为了重用和简化代码,VRML引入了原型概念,可以将一组节点和它们的字段封装在一起,然后在多个地方实例化。 5. **交互性(Interactivity)**:VRML支持用户交互,如点击、拖动等,这...

    irrlichtCollision_irrlichtcollision_irrlicht_

    碰撞检测允许程序识别并响应两个或多个物体之间的相互作用,从而实现物理真实感。 一、自动碰撞检测(通过爬楼梯和滑动) Irrlicht引擎提供了自动碰撞检测系统,这使得游戏对象能够动态地与3D环境交互。例如,当...

    flash基础知识点总结

    * 选择工具:按住 Shift 选取多个对象,变形对象时按住 Ctrl 或 Alt 键可在线边上添加节点,拖动对象时按住 Ctrl 或 Alt 键可以复制对象。 * 部分选取工具:通过节点控制对象形状,选中节点后按 del 或删除键可以...

    java毕业设计-JAVA3D的网络三维技术的设计与实现(源代码+论文+说明).zip

    场景图是一个层次结构,其中每个节点代表一个3D对象,可以是几何形状、变换或者组合其他对象。这些节点可以包含属性,如颜色、材质和位置,以及对其他节点的操作,如旋转、缩放和翻译。 5. **交互和事件处理**: ...

Global site tag (gtag.js) - Google Analytics