Рафаэль Дж. С. Эффективное внедрение инструмента «Карандаш» - PullRequest
12 голосов
/ 05 января 2011

Я работаю над проектом, который требует, чтобы конечные пользователи могли рисовать в браузере так же, как svg-edit и отправлять данные SVG на сервер для обработки.

Я начал играть с Raphael , и это выглядит многообещающе.

В настоящее время я пытаюсь реализовать инструмент типа карандаша или freeline. По сути, я просто рисую новый путь, основанный на проценте движения мыши в области рисования. Тем не менее, в конце концов, это создаст огромное количество путей для решения.

Возможно ли сократить путь SVG путем преобразования движения мыши для использования Кривые и прямые пути вместо линии Сегменты?

Ниже приведен черновик кода, который я набрал для выполнения работы ...

    // 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; 
      }
     }
    });


   }); 

Ответы [ 4 ]

3 голосов
/ 05 января 2011

Вот инструмент для рисования, который работает с iPhone или мышью http://irunmywebsite.com/raphael/drawtool2.php Однако также обратите внимание на "игровую утилиту" Daves @ http://irunmywebsite.com/raphael/raphaelsource.php, которая генерирует данные пути при рисовании.

3 голосов
/ 05 января 2011

Взгляните на алгоритм Дугласа-Пекера, чтобы упростить вашу линию.

Я не знаю ни одной реализации javascript (хотя поиск в Google направил меня на форумы для разработчиков карт Google), но вот реализация tcl, которая достаточно проста для понимания: http://wiki.tcl.tk/27610

А вот статья в википедии, объясняющая алгоритм (вместе с псевдокодом): http://en.wikipedia.org/wiki/Ramer%E2%80%93Douglas%E2%80%93Peucker_algorithm

0 голосов
/ 13 августа 2013

У меня проблема с симларий, я рисую, используя мышь вниз и команду М. Затем я сохраняю этот путь в базе данных на сервере. Проблема, которую я имею, связана с разрешением. У меня есть фоновое изображение, где пользователи рисуют линии и фигуры по частям изображения, но если изображение отображается с одним разрешением, а пути создаются в этом разрешении, а затем открываются с другим, возможно, более низким разрешением, мои пути сдвигаются неправильно измерен. Я предполагаю, что я спрашиваю: есть ли способ нарисовать путь над изображением и убедиться, что независимо от размера базового изображения, путь остается пропорционально правильным.

0 голосов
/ 16 января 2012

Я работаю над чем-то похожим.Я нашел способ постепенного добавления команд пути путем небольшого обхода Raphael API, как описано в моем ответе здесь .В современных браузерах, на которых я тестировал, это работает достаточно хорошо, но степень, с которой ваши линии выглядят плавными, зависит от того, насколько быстро может работать обработчик перемещения мыши.

Вы можете попробовать мой метод для рисования путей с использованием отрезков линий, а затемвыполнить сглаживание после того, как начальный зазубренный путь прорисован (или как-то еще), обрезая координаты, используя Ramer – Douglas – Peucker, как предложил slebetman, и преобразовав оставшиеся L s в команды кривой SVG.

...