在 Paper.js 中调整矩形的大小

Tib*_*asz 4 javascript canvas paperjs

我在 Paper.js 中创建了一个非常普通的矩形,我想调整它的大小,但我找不到任何明显的方法来做到这一点。

var rect = new Rectangle([0, 0],[width,height]);
rect.center = mousePoint;
var path = new Path.Rectangle(rect, 4);
path.fillColor = fillColor;
path.meta = fillColor;
Run Code Online (Sandbox Code Playgroud)

有一种缩放转换方法,但它并不是真正用于鼠标交互,我的目标是创建一个可以调整组件大小的句柄。

Are*_*rel 13

请注意,PaperJS 具有三种不同的矩形:

  • Rectangle— 这是定义矩形的基本类型(数据结构)。基本上,左上角的点、宽度和高度。(屏幕上不显示任何内容。)这种矩形可以通过设置其 size 属性来调整大小,例如:

    let rect;
    const originalSize = [50, 50];
    const newSize = [100, 100];
    
    rect = new Rectangle([10, 50], originalSize);
    rect.size = newSize;
    
    Run Code Online (Sandbox Code Playgroud)
  • Path.Rectangle— 这是一种生成组成矩形路径的 Segment 列表的方法。这确实会显示,但 Path 缺少与矩形关联的方法。例如, aPath.Rectangle没有size属性(因此尝试修改它没有效果)。要调整路径大小,您可以使用该scale()方法作为另一个答案的建议,或修改其Segments

    rect = new Path.Rectangle([210, 50], originalSize);
    rect.strokeColor = "red";
    rect.strokeWidth = 3;
    
    rect.segments[0].point = rect.segments[0].point.add([-25, 25]);  // lower left point
    rect.segments[1].point = rect.segments[1].point.add([-25, -25]); // upper left point
    rect.segments[2].point = rect.segments[2].point.add([25, -25]);  // upper right point
    rect.segments[3].point = rect.segments[3].point.add([25, 25]);  // lower right point
    
    
    Run Code Online (Sandbox Code Playgroud)
  • Shape.Rectangle— 这种矩形被显示公开其形状的属性,例如size. 要调整 a 的大小,Shape.Rectangle您可以size直接修改其属性:

    rect = new Shape.Rectangle([410, 50], originalSize)
    rect.strokeColor = "blue"
    rect.strokeWidth = 3
    
    rect.size = newSize
    
    Run Code Online (Sandbox Code Playgroud)

最有可能的是,如果您想绘制一个矩形事后修改其属性,那么您要查找的矩形是Shape.Rectangle.

这是一个草图,可让您使用不同类型的矩形。


Nik*_*des 4

您可以通过将矩形的预期宽度/高度除以矩形的当前宽度/高度来计算缩放比例。

然后您可以使用该缩放“系数”来应用缩放。

根据上面的代码,您可以使用以下方法获取矩形的当前宽度/高度:rect.bounds.widthrect.bounds.height

这是您可以使用的功能

var rectangle = new Shape.Rectangle({
    from: [0, 0],
    to: [100, 50],
    fillColor: 'red'
});


function resizeDimensions(elem,width,height){
    //calc scale coefficients and store current position
    var scaleX = width/elem.bounds.width;
    var scaleY = height/elem.bounds.height;
    var prevPos = new Point(elem.bounds.x,elem.bounds.y);

    //apply calc scaling
    elem.scale(scaleX,scaleY);

    //reposition the elem to previous pos(scaling moves the elem so we reset it's position);
    var newPos = prevPos + new Point(elem.bounds.width/2,elem.bounds.height/2);
    elem.position = newPos;
}


resizeDimensions(rectangle,300,200)
Run Code Online (Sandbox Code Playgroud)

这是它的草图。

请注意,上述函数还会将元素重新定位到其先前的位置,但它将使用左上角定位。Paper.js 使用元素的中心来定位它们,因此我澄清这一点,以免造成混乱