如何在paperjs中拖动/调整大小和旋转矩形?

Mar*_*ark 3 graphics transformation paperjs

我想在 paperjs 中拖动矩形并调整其大小,我还想旋转矩形并调整其大小,同时保持其相对尺寸。

理想情况下,我想通过拖动鼠标的一个角(锚点)来这样做。什么数学或功能有助于在 paperjs 中做到这一点?

我已经通过使用缩放和修改角来尝试这个,但它不能像我想要的那样工作。有人可以指出我的解决方案吗?

提前致谢。

bma*_*ton 8

这是一个可以帮助您入门的简单解决方案。它不处理旋转,因为我不确定您如何设想 UI 工作,但是通过修改边界框来调整矩形的大小,您应该能够毫无问题地旋转它。

paperjs 草图

我决定构建我自己的 UI 并继续使示例更加复杂,以便在没有更多信息的情况下尽可能多地解决你们的问题。这是新草图:

新草图

用户界面是

  1. 单击矩形以通过拖动来移动它
  2. 单击一个角并拖动以调整其大小
  3. 按住 Control 键单击一个角以旋转它

单击角落有点棘手,但这是留给读者的练习。它们是彩色圆圈,只是为了强调每个段点所在的Path位置。

代码要点:

  • 使用矩形的边界进行缩放。Path.Rectangle就纸而言,它不是矩形。它是连接四个线段点的四条曲线(恰好是直线)。当您需要处理矩形以获取其中心、左上角等时,您需要一个Rectangle. 使用矩形的边界 ( Path.Rectangle.bounds)缩放可见矩形。代码用一个额外的浅绿色矩形说明了边界,因此它是可见的(旋转时最容易看到)。

  • onMouseDown()设置状态onMouseDrag()并设置每个状态所需的数据,例如,保存用于调整大小的比例基础。

  • onMouseDrag() 实现移动、调整大小和旋转。

tool.onMouseDrag = function(e) { if (rect.data.state === 'moving') { rect.position = rect.position + e.point - e.lastPoint; adjustRect(rect); } else if (rect.data.state === 'resizing') { // scale by distance from down point var bounds = rect.data.bounds; var scale = e.point.subtract(bounds.center).length / rect.data.scaleBase.length; var tlVec = bounds.topLeft.subtract(bounds.center).multiply(scale); var brVec = bounds.bottomRight.subtract(bounds.center).multiply(scale); var newBounds = new Rectangle(tlVec + bounds.center, brVec + bounds.center);
rect.bounds = newBounds;
adjustRect(rect); } else if (rect.data.state === 'rotating') { // rotate by difference of angles, relative to center, of // the last two points. var center = rect.bounds.center; var baseVec = center - e.lastPoint; var nowVec = center - e.point; var angle = nowVec.angle - baseVec.angle; rect.rotate(angle); adjustRect(rect); } }

  • 移动非常简单 - 只需计算事件的当前点和最后一个点之间的差异,然后将矩形的位置改变那么多。

  • 调整大小并不那么明显。策略是根据scaleBase.length鼠标按下点和矩形中心之间的原始距离 ( )调整 x 和 y 边界。请注意,虽然 paper-full.js 允许使用带有点的运算符(“+”、“-”、“*”、“/”),但我多次使用原始subtract()multiply()方法 - 我发现将计算链接起来很自然道路。

  • 旋转使用了非常好的纸上概念,即一个点也定义了一个向量,而一个向量有一个角度。它只是记录事件lastPointpoint相对于矩形中心之间的角度差异,并根据该差异旋转矩形。

  • moveCircles()并且adjustRect()只是用于更新角圆和浅绿色矩形的簿记功能。

  • 极其错误的实现 (2认同)