Имеет ли значение порядок, в котором нарисованы линии графика?
Вы можете записать точки с определенным порогом в массив / вектор и сравнить.
Quick'n'dirtyможно было бы использовать 2 двоичных (монохромных, просто черно-белых) изображения:
- Одно изображение будет «экраном печати» ( BitmapData.draw () ) графика(например, черным по белому)
- Другое изображение будет белым (пустым) 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