gpt4 book ai didi

javascript - Raphael JS 高效实现 "Pencil"工具

转载 作者:可可西里 更新时间:2023-11-01 02:10:10 31 4
gpt4 key购买 nike

我正在做一个项目,要求最终用户能够在浏览器中绘图,就像 svg-edit并将SVG数据发送给服务器进行处理。

我开始玩 Raphael框架,看起来很有希望。

目前我正在尝试实现铅笔或自由线类型的工具。基本上我只是根据绘图区域中鼠标移动的百分比绘制一条新路径。然而,最终这将创建大量的路径来处理。

Is it possible to shorten an SVG path by converting mouse movement to use Curve and Line paths instead of line segments?

下面是我为完成这项工作而草拟的代码草稿......

    // Drawing area size const
var SVG_WIDTH = 620;
var SVG_HEIGHT = 420;

// Compute movement required for new line
var xMove = Math.round(SVG_WIDTH * .01);
var yMove = Math.round(SVG_HEIGHT * .01);

// Min must be 1
var X_MOVE = xMove ? xMove : 1;
var Y_MOVE = yMove ? yMove : 1;

// Coords
var start, end, coords = null;
var paperOffset = null;
var mouseDown = false;

// Get drawing area coords
function toDrawCoords(coords) {
return {
x: coords.clientX - paperOffset.left,
y: coords.clientY - paperOffset.top
};
}

$(document).ready(function() {
// Get area offset
paperOffset = $("#paper").offset();
paperOffset.left = Math.round(paperOffset.left);
paperOffset.top = Math.round(paperOffset.top);
// Init area
var paper = Raphael("paper", 620, 420);
// Create draw area
var drawArea = paper.rect(0, 0, 619, 419, 10)
drawArea.attr({fill: "#666"});

// EVENTS
drawArea.mousedown(function (event) {
mouseDown = true;
start = toDrawCoords(event);
$("#startCoords").text("Start coords: " + $.dump(start));
});
drawArea.mouseup(function (event) {
mouseDown = false;
end = toDrawCoords(event);
$("#endCoords").text("End coords: " + $.dump(end));
buildJSON(paper);
});
drawArea.mousemove(function (event) {
coords = toDrawCoords(event);
$("#paperCoords").text("Paper coords: " + $.dump(coords));
// if down and we've at least moved min percentage requirments
if (mouseDown) {
var xMovement = Math.abs(start.x - coords.x);
var yMovement = Math.abs(start.y - coords.y);
if (xMovement > X_MOVE || yMovement > Y_MOVE) {
paper.path("M{0} {1}L{2} {3}", start.x, start.y, coords.x, coords.y);
start = coords;
}
}
});


});

最佳答案

查看 Douglas-Peucker 算法以简化您的生产线。

我不知道任何 javascript 实现(尽管谷歌搜索将我引导到谷歌地图开发者论坛)但这里有一个很容易理解的 tcl 实现:http://wiki.tcl.tk/27610

这里有一篇解释该算法的维基百科文章(连同伪代码):http://en.wikipedia.org/wiki/Ramer%E2%80%93Douglas%E2%80%93Peucker_algorithm

关于javascript - Raphael JS 高效实现 "Pencil"工具,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4600533/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com