javascript - 在 PaperJS 中是否可以明确设置直线路径的长度?

标签 javascript canvas vector-graphics paperjs

据我所知,更改单个路径长度的唯一方法似乎是path.scale(x)。然而,我想让线的长度围绕其原始长度略微振荡,这很难用 scale 来实现,因为如果你给它随机值,你实际上会以它的长度随机游走而告终,最终可能会远离其原始长度。

是否可以显式设置线路径的长度,比如path.length = 10?根据文档,这似乎是不可能的。为什么不??实现我想要的结果的最佳方式是什么?

最佳答案

您可以通过注意 paperjs 中的路径不是几何形状来做到这一点,尽管它们可能已被指定为一个。它们是分段点的数组;这就是为什么不能直接设置线的长度的原因。一条线有两个线段点 - 一个是线的起点,一个是线的终点。通过操纵第二个线段点,您可以调整线的长度。这sketch (以下代码)说明了如何执行此操作。要调整原始行的长度,请取消注释最后一行代码。

line = new Path.Line([100,100], [200, 300]);
line.strokeColor = 'black';
line.strokeWidth = 5;

// paths in paper are arrays of segments, not instances of
// circle or line or rectangle. so find the vector that
// represents the delta between the first point and the
// second point.
vector = line.segments[0].point - line.segments[1].point;

// adjustment for the line - this would vary in your case
factor = 0.9;

// I'm drawing a new line here to make it easy to see
p0 = line.segments[0].point;
p1 = p0 - vector * factor;

newline = new Path.Line(p0, p1);
newline.strokeColor = 'red';
newline.strokeWidth = 2;

// but to adjust your original line just use the following
//line.segments[1].point = p1;

如果您选择这样做,您可以将原始矢量存储在属性 line.data 中,这是一个空对象,纸张可以根据用户的需要创建该对象。所以 line.data.vector = vector; 将允许您保留每一行的原始向量。您可以使用以下命令将行的长度设置为特定长度:

var v = line.data.vector.clone();
v.length = 10;         // specific length
line.segments[1].point = p0 - v;

关于javascript - 在 PaperJS 中是否可以明确设置直线路径的长度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34529248/

相关文章:

javascript - 使用 jQuery Ajax 将 javascript 变量发送到 PHP 脚本

javascript - vue.js 和属性中的槽

javascript - 即使重新选择相同的选项,也会为选择运行更改事件

javascript - 使用 slider 值调整 Canvas 元素中矩形的大小

html - 如何在 Firefox 中为掩码设置自定义位置?

c# - 混叠问题

javascript - 有没有办法让 Ubuntu 服务器在 NPM 进程失败时自动重新启动?

javascript - 如何在允许单指绘图的同时允许两指滚动 HTML Canvas 元素?

html - Box2dweb,移动 Canvas ?

c++ - 使用 glm-library OpenGL 计算法线