canvas - 如何使用带有 paper.js 的 SVG 创建画笔?
问题描述
我有一个使用 paper.js 设置的简单画布,当用户单击并拖动鼠标时,它会创建一条路径。然后我想沿着这条路径拉伸 SVG 以创建画笔效果。(与 Adobe Illustrator 的画笔上的“拉伸以适应笔划长度”属性相同)有谁知道我如何实现这一点?我想在画布中重新创建 adobe illustrator 中的画笔效果示例:
我已将画笔作为 svg 导入,但 path.importSVG(brush) 没有做任何事情。我是 paper.js 的新手,不知道从哪里开始。
// Brush
var brush = '<svg[...]</svg>'
// Symbol
var symbol = new Symbol(project.importSVG(brush, {
expandShapes: true
}));
// The minimum distance the mouse has to drag before firing the next onMouseDrag event
tool.minDistance = 5;
var path;
/* Click */
function onMouseDown(event) {
// Create a new path and select it
path = new Path();
path.strokeColor = '#ffffff';
path.selected = true;
// Add a segment to the path where you clicked
path.add(event.point);
}
/* Drag */
function onMouseDrag(event) {
// Every drag event, add a segment to the path at the position of the mouse
path.add(event.point);
}
/* Up */
function onMouseUp(event) {
var placed = symbol.place(event.point);
placed.scale(0.5);
}
解决方案
您可以在每次鼠标拖动时将 SVG 导入新路径(我建议每隔n 个事件添加 SVG,和/或使用低不透明度),在您的onMouseDrag
函数中,但为了获得更好的性能,您可以使用Symbols。
var path = new Path();
// [...]
path.importSVG(brush);
// Create a symbol from the path:
var symbol = new Symbol(path);
const N_EVENTS_TO_SKIP = 10;
var n = 0;
/* Drag */
function onMouseDrag(event) {
// skip some events
n++;
if(n < N_EVENTS_TO_SKIP) {
return;
}
n = 0;
// place the symbol
var placed = symbol.place(event.point);
}
推荐阅读
- python - 找不到我的数据集的异常值(更具体地说是 IQR)
- python - Django:将 cURL 转换为 python 请求
- windows - 自定义 psobject 截断使用 add-member 添加的结果
- python - 将数据帧从请求转换为结构化格式
- javascript - Chrome 中的 Tampermonkey - 如何在不影响网站的情况下使用 jquery
- r - 如何将样本保存在 R 中的数组或矩阵中?
- wpf - 在 WPF 中搜索
- mysql - 在主数据库失败的情况下如何创建到另一个数据库的辅助连接
- javascript - Angular Reactive Forms:如何填充多选复选框表单?
- angular - NGRX 效果错误地触发了多个动作