Paper JS:波浪线,沿着路径刷
Paper JS: Wavy Line, Brush Along a Path
我正在尝试使用 Paper.js 绘制一条波浪线。此刻绘制了一条波浪线,但波浪高度不规则,尤其是在角落处。
我也是靠simplify()
和smooth()
的方法,就是画完之后路径才会变圆。
对于小波浪这不是问题,对于大波浪它变得相当明显。 (增加minDistance
和maxDistance
,还有waveSideStep
)
paper.setup(document.getElementById('papercanvas'));
let wavePath;
let waveEndAngle;
this.wave_ = new paper.Tool();
this.wave_.minDistance = 5;
this.wave_.maxDistance = 5;
this.wave_.onMouseDown = function(event) {
new paper.Layer().activate();
wavePath = new paper.Path();
wavePath.strokeColor = '#000';
wavePath.strokeWidth = 10;
wavePath.strokeCap = 'square';
wavePath.strokeJoin = 'round';
wavePath.add(event.point);
};
this.wave_.onMouseDrag = function(event) {
let waveSideStep = Math.sin(wavePath.length / 10) * 10;
wavePath.add(new paper.Point(
event.point.x + Math.cos(event.delta.angleInRadians + (Math.PI / 2)) * waveSideStep,
event.point.y + Math.sin(event.delta.angleInRadians + (Math.PI / 2)) * waveSideStep));
waveEndAngle = event.delta.angle - 90;
};
this.wave_.onMouseUp = function(event) {
wavePath.smooth();
wavePath.simplify();
paper.view.draw();
};
canvas {
width: 100%;
height: 100%;
}
canvas[resize] {
width: 100%;
height: 100%;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/paper.js/0.10.2/paper-core.js"></script>
<canvas id="papercanvas" width="600" height="600"></canvas>
有没有更好的画波浪线的方法?
或者,是否有一种简单的方法可以将值重复(和弯曲)到路径上,类似于在 Illustrator 中使用画笔的方式?
有趣的工具:-)
我没有足够的时间来回答完整的问题,但我的建议是:
- 创建一个高度 smoothed/simplified 版本的鼠标轨迹的轨迹路径(平滑时给予高容差)
- 围绕这条轨迹曲线计算一个简单的波浪,这个结果可以是每一步smoothed/simplified(在onMouseDrag函数中)
就是这样。
我正在尝试使用 Paper.js 绘制一条波浪线。此刻绘制了一条波浪线,但波浪高度不规则,尤其是在角落处。
我也是靠simplify()
和smooth()
的方法,就是画完之后路径才会变圆。
对于小波浪这不是问题,对于大波浪它变得相当明显。 (增加minDistance
和maxDistance
,还有waveSideStep
)
paper.setup(document.getElementById('papercanvas'));
let wavePath;
let waveEndAngle;
this.wave_ = new paper.Tool();
this.wave_.minDistance = 5;
this.wave_.maxDistance = 5;
this.wave_.onMouseDown = function(event) {
new paper.Layer().activate();
wavePath = new paper.Path();
wavePath.strokeColor = '#000';
wavePath.strokeWidth = 10;
wavePath.strokeCap = 'square';
wavePath.strokeJoin = 'round';
wavePath.add(event.point);
};
this.wave_.onMouseDrag = function(event) {
let waveSideStep = Math.sin(wavePath.length / 10) * 10;
wavePath.add(new paper.Point(
event.point.x + Math.cos(event.delta.angleInRadians + (Math.PI / 2)) * waveSideStep,
event.point.y + Math.sin(event.delta.angleInRadians + (Math.PI / 2)) * waveSideStep));
waveEndAngle = event.delta.angle - 90;
};
this.wave_.onMouseUp = function(event) {
wavePath.smooth();
wavePath.simplify();
paper.view.draw();
};
canvas {
width: 100%;
height: 100%;
}
canvas[resize] {
width: 100%;
height: 100%;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/paper.js/0.10.2/paper-core.js"></script>
<canvas id="papercanvas" width="600" height="600"></canvas>
有没有更好的画波浪线的方法?
或者,是否有一种简单的方法可以将值重复(和弯曲)到路径上,类似于在 Illustrator 中使用画笔的方式?
有趣的工具:-)
我没有足够的时间来回答完整的问题,但我的建议是:
- 创建一个高度 smoothed/simplified 版本的鼠标轨迹的轨迹路径(平滑时给予高容差)
- 围绕这条轨迹曲线计算一个简单的波浪,这个结果可以是每一步smoothed/simplified(在onMouseDrag函数中)
就是这样。