Estoy trabajando en un proyecto que requiere que los usuarios finales puedan dibujar en el navegador como svg-edit y enviar datos SVG al servidor para su procesamiento.Raphael JS Implementación de una herramienta "Lápiz" de manera eficiente
Empecé a jugar con el marco Raphael y parece prometedor.
Actualmente estoy tratando de implementar una herramienta de lápiz o línea de freeline. Básicamente, estoy dibujando un nuevo camino basado en el porcentaje de movimiento del mouse en el área de dibujo. Sin embargo, al final esto va a crear una gran cantidad de caminos para lidiar.
¿Es posible acortar un camino SVG convirtiendo el movimiento del ratón para usar curva y caminos de línea en lugar de la línea segmentos?
A continuación se muestra proyecto de código que nos prepararon rápidamente para hacer el trabajo ...
// 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;
}
}
});
});
Esto se ve interesante. Sin embargo, imagino que esto hará que mis curvas se vean más segmentadas. –
El algoritmo tiene un valor de error ajustable que puede usar para decidir qué tan cerca quiere que la línea resultante se asemeje a la línea original. El artículo de wikipedia, por supuesto, exagera un poco en sus diagramas para ilustrar cómo funciona el algoritmo. Básicamente cada vez que reduces el número de puntos en una línea, estás haciendo que la línea sea más "segmentada".Al igual que los juegos usan objetos 3D de polígono bajo para mejorar la velocidad. Mismo principio aquí pero en 2D. – slebetman