2015-11-06 6 views
1

Я бы хотел использовать Seshat -а написанный от руки математический выражающий парсер - для проекта, над которым я работаю, но у меня есть некоторые проблемы с пониманием того, как обеспечить программу своим правильным вводом, файл InkML или SCG Ink.Преобразование данных инсульта в SCG Формат чернил

Я подробно рассмотрел онлайн-пример, который существует here, и я вижу, что они получают массив Javascript с информацией об инсультах из поля HTML Canvas с применением this JS library, но я не знаю, что произойдет с этим массивом после того, как он будет отправлен на свой сервер.

Я читал SCG Ink spec, и я думаю, что было бы относительно легко разобрать массив в формате, но я надеюсь, что есть что-то очевидное, что я пропустил, что сделало бы это тривиальным. Любая помощь будет принята с благодарностью.

ответ

2

Я послал по электронной почте автора Seshat, и он предложил преобразовать вход в SCG Ink, который оказался довольно простым, если вы используете библиотеки JavaScript, используемые в http://cat.prhlt.upv.es/mer/. В частности, вы хотите jquery.sketchable.memento.min.js, jquery.sketchable.min.js и jsketch.min.js в дополнение к обычным старым jQuery. Вот что я сделал, если кто-то еще интересуется Seshat.

Обратите внимание на той же странице, что в main.js они применяют Sketchable библиотеку в области холста HTML с этим блоком кода:

var $canvas = $('#drawing-canvas').sketchable({ 
    graphics: { 
    strokeStyle: "red", 
    firstPointSize: 2 
    } 
}); 

Теперь мы посмотрим на их submitStrokes() функции можно увидеть, как принять штрихи от Sketchable и конвертировать в SCG Ink. Строка var strokes = $canvas.sketchable('strokes'); получает штрихи, а затем линия strokes = transform(strokes); применяет быстрое преобразование для извлечения только необходимых им данных. Вот transform() функции для справки:

function transform(strokes) { 
    for (var i = 0; i < strokes.length; ++i) 
    for (var j = 0, stroke = strokes[i]; j < stroke.length; ++j) 
     strokes[i][j] = [ strokes[i][j][0], strokes[i][j][1] ]; 
    return strokes; 
}; 

Значения возвращается сюда transform() это трехмерный массив штрихов и точек. (Каждый элемент первого измерения является штрихом, каждый элемент второго измерения является точкой, а третий размер - x-, y-координатами.) На этом сайте они идут вперед и POST этот массив на сервер, который должен обрабатывать окончательное преобразование в чернила SCG. Я написал функцию JavaScript для ее обработки:

function strokesToScg(strokes) { 
    var scg = 'SCG_INK\n' + strokes.length + '\n' 
    strokes.forEach(function (stroke) { 
    scg += stroke.length + '\n' 
    stroke.forEach(function (p) { 
     scg += p[0] + ' ' + p[1] + '\n' 
    }) 
    }) 

    return scg 
} 

И все. Значение, возвращаемое с strokesToScg(), представляет собой строку, описывающую последовательность штрихов в формате SCG Ink.