如何将弧度应用于多个调整大小的拖动处理程序

用户11907970

考虑以下:

您有一个带有 8 个手柄的调整大小框,每个手柄都包含一个调整其父框大小的函数。一切都是花里胡哨,但在应用 CSS 变换来旋转 x 度后,一切都变得糟糕透了。

如何应用弧度等,以便每个处理程序在拖动处理程序时计算正确的值?

这是完整工作代码演示感谢作者

这是人们试图实现的Resizer 处理程序插图

---- 代码示例 ----

/**
 * Drag Resize Bottom Right Corner
**/ 
drag_br: function( e ) {
  var self = this;

  self.layoutRect( {
    x: self._startPos.x,
    y: self._startPos.y,
    w: self._startPos.w + ( e.clientX - self._startPos.clientX ),
    h: self._startPos.h + ( e.clientY - self._startPos.clientY )
  });

  self._repaint();
},

/**
 * Drag Resize Top Right Corner
**/ 
drag_tr: function( e ) {
  var self = this;

  self.layoutRect( {
    x: self._startPos.x ,
    y: self._startPos.y + ( e.clientY - self._startPos.clientY ),
    w: self._startPos.w + ( e.clientX - self._startPos.clientX ),
    h: self._startPos.h - ( e.clientY - self._startPos.clientY )
  });

  self._repaint();
},   

/**
 * Drag Resize Top Left Corner
**/ 
drag_tl: function( e ) {
  var self = this;

  self.layoutRect( {
    x: self._startPos.x + ( e.clientX - self._startPos.clientX ),
    y: self._startPos.y + ( e.clientY - self._startPos.clientY ),
    w: self._startPos.w - ( e.clientX - self._startPos.clientX ),
    h: self._startPos.h - ( e.clientY - self._startPos.clientY )
  });

  self._repaint();
},  

/**
 * Drag Resize Bottom Left Corner
**/ 
drag_bl: function( e ) {
  var self = this;

  self.layoutRect( {
    x: self._startPos.x + ( e.clientX - self._startPos.clientX ),
    y: self._startPos.y,
    w: self._startPos.w - ( e.clientX - self._startPos.clientX ),
    h: self._startPos.h + ( e.clientY - self._startPos.clientY )
  });

  self._repaint();
}, 

/**
 * Drag Resize Top Edge
**/ 
drag_t: function( e ) {
  var self = this;

  self.layoutRect( {
    x: self._startPos.x,
    y: self._startPos.y + ( e.clientY - self._startPos.clientY ),
    w: self._startPos.w,
    h: self._startPos.h - ( 2 * ( e.clientY - self._startPos.clientY ) )
  });

  self._repaint();
}, 

/**
 * Drag Resize Left Edge
**/ 
drag_l: function( e ) {
  var self = this;

  self.layoutRect( {
    x: self._startPos.x + ( e.clientX - self._startPos.clientX ),
    y: self._startPos.y,
    w: self._startPos.w - ( 2 * ( e.clientX - self._startPos.clientX ) ),
    h: self._startPos.h
  });

  self._repaint();
}, 

/**
 * Drag Resize Bottom Edge
**/ 
drag_b: function( e ) {
  var self = this;

  self.layoutRect( {
    x: self._startPos.x,
    y: self._startPos.y - ( e.clientY - self._startPos.clientY ),
    w: self._startPos.w,
    h: self._startPos.h + ( 2 * ( e.clientY - self._startPos.clientY ) )
  });

  self._repaint();
}, 

/**
 * Drag Resize Right Edge
**/ 
drag_r: function( e ) {
  var self = this;

  self.layoutRect( {
    x: self._startPos.x - ( e.clientX - self._startPos.clientX ),
    y: self._startPos.y,
    w: self._startPos.w + ( 2 * ( e.clientX - self._startPos.clientX ) ),
    h: self._startPos.h
  });

  self._repaint();
}, 

我已经搜索了一个可能的解决方案,但每个结果都带有(使用插件/jQuery)或不完整的解决方案。

有什么问题?

当前,当单击拖动应用错误的计算时,演示有一个变换旋转(45度)。如果没有应用变换旋转,它会按预期工作。这可以通过从 CSS 面板中移除transform:rotate(45deg)来实现。

卡达斯

我的不好,与我在评论中所说的相反,三角学并不是那么基本,主要是因为它引起的坐标问题很少。原谅我的画,希望很清楚:

  • 您想知道X要添加到矩形宽度的蚂蚁是什么
  • B 是你的角度 (45°),在 JS 和弧度中给出 Math.PI / 4
  • 你知道dXdY哪些是你多么拖坐标
  • A是拖动的角度,Z是距离

在此处输入图片说明

现在,这些是需要了解的有用规则: 勾股定理和基本三角学:

  • 毕达哥尔说因为正方形三角形,你有Z² = dX² + dY²,所以在 JS 中:

var Z = Math.sqrt(Math.pow(dX, 2) + Math.pow(dY, 2));

  • 三角学说,cos(A) = dX / Z在 JS 中给出(cosa是 的倒数cos):

var A = Math.acos(dX / Z);

  • 出于同样的原因,您拥有cos(A + B) = X / Z,这意味着:

var X = Z * cos(A + B);

最后要知道的是,要获得高度而不是宽度,您将使用sin而不是cos..

其他问题:

  • Y轴的坐标系是颠倒的:在三角学中,当你向上时,它是正的,在屏幕上,这(通常)相反 - >需要否定dY以获得直角
  • 当垂直距离已经用直角计算出来了,往上的时候需要把结果取反(因为你实际上是给矩形减去了高度)
  • 在图片中,鼠标可能在水平线下方,在这种情况下,您需要减去角度而不是添加它们(我建议您绘制它)并使用A - B而不是A + B!!!
  • 我不会详细介绍这个,第一个想法是Math.abs(A-B)用来获得水平线以下的角度,但实际上你需要使用,A-B以便当鼠标角度在“内部”B(之间)时,角度为负水平线和你的角度)

现在对于右下角的最终代码,希望您能管理其余部分(X在示例中是dWhere):

    drag_br: function( e ) {
      var self = this;

      var dX = e.clientX - self._startPos.clientX,
          dY = self._startPos.clientY - e.clientY, // same as -(e.clientY - self._startPos.clientY)
          Z = Math.sqrt(Math.pow(dX, 2) + Math.pow(dY, 2)),
          B = Math.PI / 4,
          A, dW, dH;

      if(Z === 0){ //no division by zero please
        dW = 0;
        dH = 0;
      }else{
        A = Math.acos(dX / Z);
        if(dY >= 0){ //dragged up from horizontal line
          dW = Z * Math.cos(A + B);
          dH = -Z * Math.sin(A + B);
        }else{ //dragged down from horizontal line
          dW = Z * Math.cos(A - B);
          dH = Z * Math.sin(A - B);
        }
      }

      self.layoutRect( {
        x: self._startPos.x,
        y: self._startPos.y,
        w: self._startPos.w + dW,
        h: self._startPos.h + dH
      });

      self._repaint();
    },

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何将点击处理程序应用于模板内的多个元素-EXTJS

来自分类Dev

如何将拖动应用于矩形/图像?

来自分类Dev

如何将内容大小优先级应用于自调整大小 UITableViewCell 内的两个视图

来自分类Dev

如何将光标指针属性应用于(单击)事件处理程序?

来自分类Dev

jQuery处理程序-如何将操作应用于动态添加的元素

来自分类Dev

如何将多个函数应用于numpy数组?

来自分类Dev

如何将jquery命令应用于多个div?

来自分类Dev

如何将javascript应用于多个类?

来自分类Dev

如何将组织事务应用于多个项目

来自分类Dev

如何将linkActive应用于多个链接?

来自分类Dev

如何将javascript应用于多个类?

来自分类Dev

如何将多个条件应用于 .Find?

来自分类Dev

如何将具有多个变量的文本文件应用于批处理控制台

来自分类Dev

将一键式事件处理程序应用于多个元素

来自分类Dev

如何将函数应用于多个列以在R中创建多个新列?

来自分类Dev

如何将多个类应用于jQuery中的多个Div

来自分类Dev

如何将DigiCert EV证书应用于ClickOnce应用程序

来自分类Dev

如何将基于声明的身份验证应用于.NET 4应用程序?

来自分类Dev

如何将应用程序图标应用于Theme.DeviceDefault.Light.DarkActionBar?

来自分类Dev

如何将父应用程序的布局和资产应用于已安装的引擎?

来自分类Dev

如何将年龄限制应用于 Android 应用程序?

来自分类Dev

如何将多处理应用于滑动窗口

来自分类Dev

如何将后处理方面应用于网站项目?

来自分类Dev

将事件处理程序应用于动态控制

来自分类Dev

如何将汇总功能应用于数据表的多个列

来自分类Dev

当某些观测值为0时,如何将模型应用于多个子集。

来自分类Dev

熊猫如何将多个功能应用于数据框

来自分类Dev

如何将多个谓词应用于java.util.Stream?

来自分类Dev

如何将功能应用于多个熊猫数据框

Related 相关文章

  1. 1

    如何将点击处理程序应用于模板内的多个元素-EXTJS

  2. 2

    如何将拖动应用于矩形/图像?

  3. 3

    如何将内容大小优先级应用于自调整大小 UITableViewCell 内的两个视图

  4. 4

    如何将光标指针属性应用于(单击)事件处理程序?

  5. 5

    jQuery处理程序-如何将操作应用于动态添加的元素

  6. 6

    如何将多个函数应用于numpy数组?

  7. 7

    如何将jquery命令应用于多个div?

  8. 8

    如何将javascript应用于多个类?

  9. 9

    如何将组织事务应用于多个项目

  10. 10

    如何将linkActive应用于多个链接?

  11. 11

    如何将javascript应用于多个类?

  12. 12

    如何将多个条件应用于 .Find?

  13. 13

    如何将具有多个变量的文本文件应用于批处理控制台

  14. 14

    将一键式事件处理程序应用于多个元素

  15. 15

    如何将函数应用于多个列以在R中创建多个新列?

  16. 16

    如何将多个类应用于jQuery中的多个Div

  17. 17

    如何将DigiCert EV证书应用于ClickOnce应用程序

  18. 18

    如何将基于声明的身份验证应用于.NET 4应用程序?

  19. 19

    如何将应用程序图标应用于Theme.DeviceDefault.Light.DarkActionBar?

  20. 20

    如何将父应用程序的布局和资产应用于已安装的引擎?

  21. 21

    如何将年龄限制应用于 Android 应用程序?

  22. 22

    如何将多处理应用于滑动窗口

  23. 23

    如何将后处理方面应用于网站项目?

  24. 24

    将事件处理程序应用于动态控制

  25. 25

    如何将汇总功能应用于数据表的多个列

  26. 26

    当某些观测值为0时,如何将模型应用于多个子集。

  27. 27

    熊猫如何将多个功能应用于数据框

  28. 28

    如何将多个谓词应用于java.util.Stream?

  29. 29

    如何将功能应用于多个熊猫数据框

热门标签

归档