保持PaperJS拖动项目的焦点(草图)
我有一个函数clastEstpointData
要确定一条线的最接点,通过显示红点并确定需要拖动哪个点来突出显示该点。
我的公差有问题,当我拖动太快时,鼠标会“掉落”这一点。
How can I ensure I don't exceed the tolerance of 30px
See Sketch for working version
line = new Path.Line([90, 90], [250, 250]);
line.strokeColor = 'black';
line.strokeWidth = 3;
var redDot = new Path.Circle({
center: view.center,
radius: 3,
fillColor: 'transparent',
position: [90, 90]
});
function onMouseDrag(e) {
var cpd = closestPointData(e);
if (cpd.closestDistance < 30) {
line.segments[cpd.closestPointIndex].point = e.point;
redDot.position = cpd.usePoint;
}
}
function onMouseMove(e) {
var cpd = closestPointData(e);
if (cpd.closestDistance < 30) {
redDot.position = cpd.usePoint;
redDot.fillColor = 'red';
}else{
redDot.fillColor = 'transparent';
}
}
// Determine which of the line segment points is closest to the mouse pointer
function closestPointData(e) {
var closestPointIndex = null;
var closestDistance = Infinity;
var usePoint; // segment point coordinates
// console.log(line.segments);
// get point from each end of segment
for (var i = 0; i < line.segments.length; i++) {
var pointAt = line.getPointAt(line.segments[i]);
var distance = e.point.getDistance(pointAt);
// Qualify shortest distance
if (distance < closestDistance) {
closestDistance = distance;
closestPointIndex = i;
usePoint = pointAt;
}
}
return {
closestPointIndex: closestPointIndex,
closestDistance: closestDistance,
usePoint: usePoint
};
}
I have a function closestPointData
to determine the closest point of a line, highlight that point by showing a red dot and to determine which point needs to be dragged.
I'm having a problem with the tolerance, when I drag too fast, the mouse "drops" the point.
How can I ensure I don't exceed the tolerance of 30px
See Sketch for working version
line = new Path.Line([90, 90], [250, 250]);
line.strokeColor = 'black';
line.strokeWidth = 3;
var redDot = new Path.Circle({
center: view.center,
radius: 3,
fillColor: 'transparent',
position: [90, 90]
});
function onMouseDrag(e) {
var cpd = closestPointData(e);
if (cpd.closestDistance < 30) {
line.segments[cpd.closestPointIndex].point = e.point;
redDot.position = cpd.usePoint;
}
}
function onMouseMove(e) {
var cpd = closestPointData(e);
if (cpd.closestDistance < 30) {
redDot.position = cpd.usePoint;
redDot.fillColor = 'red';
}else{
redDot.fillColor = 'transparent';
}
}
// Determine which of the line segment points is closest to the mouse pointer
function closestPointData(e) {
var closestPointIndex = null;
var closestDistance = Infinity;
var usePoint; // segment point coordinates
// console.log(line.segments);
// get point from each end of segment
for (var i = 0; i < line.segments.length; i++) {
var pointAt = line.getPointAt(line.segments[i]);
var distance = e.point.getDistance(pointAt);
// Qualify shortest distance
if (distance < closestDistance) {
closestDistance = distance;
closestPointIndex = i;
usePoint = pointAt;
}
}
return {
closestPointIndex: closestPointIndex,
closestDistance: closestDistance,
usePoint: usePoint
};
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我认为,仅当没有
onMouseMove
时,onMousedRag
处理程序才有用,否则,它会有些混乱。I would do it this way.
In my opinion, the
onMouseDrag
handler is usefull only when there is noonMouseMove
, otherwise, it gets a bit confusing.I would do it this way.