使用Paper.js在贝塞尔曲线中插入新点的理想手柄位置
Ideal handle location for insertion of a new point in a bezier curve with Paper.js
我在paper.js中构建了一个工具,可以插入新的控制点,效果很好,我遇到的问题是,我还必须计算每个新控制点的手柄位置(除非我遗漏了什么,否则paper似乎不会为你做这件事),事实证明这是一项艰巨的任务。下面的代码是我目前正在处理的,点已成功添加到控制柄中,但它会使曲线变形。我希望添加控制柄的方式使曲线不会变形。
gEditor.MoveTool.onMouseDown = function (event) {
gEditor.HitResult = paper.project.hitTest(event.point, gEditor.HitOptions);
var location = gEditor.HitResult.location;
var newPoint = gEditor.HitResult.item.insert(location.index + 1, event.point);
var prevSegment, nextSegment;
if (location.index - 1 >= 0){
prevSegment = gEditor.HitResult.item.segments[location.index - 1];
}
if (location.index + 2 < gEditor.HitResult.item.length) {
nextSegment = gEditor.HitResult.item.segments[location.index + 2];
}
if (prevSegment && nextSegment) {
newPoint.handleIn = {
x: prevSegment.point.x - ((prevSegment.point.x + newPoint.point.x) / 2),
y: prevSegment.point.y - ((prevSegment.point.y + newPoint.point.y) / 2),
};
newPoint.handleOut = {
x: nextSegment.point.x - ((nextSegment.point.x + newPoint.point.x) / 2),
y: nextSegment.point.y - ((nextSegment.point.y + newPoint.point.y) / 2),
};
}
}
我看过de Cateljau的算法,并认为我需要的是某种形式的算法,但我不知道如何实现它,因为我看到的每个例子基本上都是绘制曲线,而不是找到句柄的X、Y位置。
curve.divide()
。完成命中测试后:
path = HitResult.item;
if (HitResult.type == 'stroke') {
var location = HitResult.location;
path.curves[location.index].divide(location);
}
相关文章:
- 将新数据项插入对象
- 谷歌地图设置中心到一个新点击的区域
- D3,移除点以用新点刷新
- 谷歌地图多边形 - 添加新点后重新绘制
- 当新数据插入 MySQL 时,AJAX 通知警报弹出或发出声音
- D3 js 更新图只是在顶部添加新点
- JavaScript 在执行点插入元素
- 节点发布 将新记录插入我的数据库不会返回新条目的数据
- Java - JWebBrowser无法加载新点到地图
- 如何将新元素插入'这'子元素Jquery
- 在散点图中添加新点
- 为什么没有将新条目插入数据库
- 如果在onFrame中添加了新点,Path.scale将被忽略
- 添加新点时移动图表
- 如何使用Javascript将新值插入到每个键值的数组
- 在Google Maps API中从Lat和Long创建一个新点
- 如何从angularjs中的子控制器将新行插入表中
- 使用Paper.js在贝塞尔曲线中插入新点的理想手柄位置
- 使用 JS 将新代码插入页面,并带有变量
- JQuery Steps -计算步数(当它们动态变化时),以便我可以在特定点插入/删除