Сравнение сгенерированного пользователем линейного графика с произвольно сгенерированным программой - PullRequest
0 голосов
/ 10 августа 2010

Программа покажет студенту линейный график. Студент должен будет воссоздать этот линейный график, перемещая персонажа от детектора движения или к нему с помощью клавиш со стрелками, создавая график расстояния-времени. Я могу захватить точки данных, которые программа генерирует при рисовании своего графика. Я также могу зафиксировать данные, собранные студентом. Как я могу сравнить эти два графика, допуская некоторую терпимость со стороны студента? Должен ли я попытаться обнаружить неправильные графики по мере их отрисовки или после записи всех точек данных? В то время как некоторые графики будут линейными и их легко сравнивать, другие будут кусочно-зависимыми функциями с положительным, отрицательным и нулевым наклоном через случайные интервалы.

Спасибо!

1 Ответ

0 голосов
/ 10 августа 2010

Имеет ли значение порядок, в котором нарисованы линии графика?

Вы можете записать точки с определенным порогом в массив / вектор и сравнить.

Quick'n'dirtyможно было бы использовать 2 двоичных (монохромных, просто черно-белых) изображения:

  1. Одно изображение будет «экраном печати» ( BitmapData.draw () ) графика(например, черным по белому)
  2. Другое изображение будет белым (пустым) BitmapData, которое вы будете использовать для записи черных пикселей там, где рисует пользователь / студент (когда мышь нажата).

например,

userBitmapData.setPixel(mouseX,mouseY,0x000000);

Когда рисование завершено (либо мышь отпущена, либо выбранное вами правило), вы запускаете функцию, которая проверяет количество черных пикселей в источнике (исходный график) изображение сопоставляется в изображении назначения (пользовательский график).

Либо вы создаете BitmapData, содержащую два других растровых изображения, смешанных в режиме «Разница», так что все, что не является черным, не совпадает, или просто проходит через циклвсе пиксели один рази вручную проверьте, совпадают ли пиксели.Обратите внимание, что это зависит от того факта, что размеры (ширина, высота) двух изображений одинаковы.

Вот небольшой фрагмент кода, иллюстрирующий это:

function compare(source:BitmapData,destination:BitmapData,threshold:Number):Boolean{
    var commonPixels:Number = 0, totalPixels:Number = 0;

    for(var j:int = 0 ; j < source.height ; j++){
        for(var i:int = 0 ; i < source.width; i++){
            pixels++;
            if(source.getPixel(i,j) == destination.getPixel(i,j)) commonPixels++;
        }
    }
    trace('matching: ' + (commonPixels/pixels * 100) + ' % ');//delete this line,just testing
    if(commonPixels/pixels >= threshold) return true;
    else                     return false;  
}

//usage:
trace('is the graph correct ?: ' + compare(graphBitmapData,userBitmapData,0.7));

Vector / ArrayВерсия была бы похожа, но не было бы никаких визуальных подсказок.В зависимости от ваших настроек, вы можете захотеть протестировать, что будет работать лучше для вас: BitmapData занимает больше памяти, чем массивы, но вы можете легко создать растровое изображение, добавить его в список отображения и проверить, выглядит ли он правильно и т. Д.

Если скорость имеет значение:

  • с использованием Vector.вместо массива может быть быстрее
  • зацикливание в обратном направлении (наибольшее число до 0, уменьшение) также должно немного ускорить процесс
  • вы, вероятно, получите один цикл вместо двух, например

    var пикселей: int = source.width * source.height;для (пикселей; пикселей> = 0; пикселей -)

HTH

...