该程序将向学生显示折线图。学生必须通过使用箭头键将角色移离或移向运动检测器来重新创建该线图,从而创建距离 - 时间图。我可以捕获程序在绘制图形时生成的数据点。我还可以捕获学生的数据点。如何比较两个图表,同时允许学生的一些容忍度?我是否应该在绘制时或在记录所有数据点后尝试检测错误的图形?虽然一些图形是线性的并且易于比较,但其他图形将是随机间隔具有正,负和零斜率的分段函数。
谢谢!
答案 0 :(得分:0)
绘制图形线的顺序是否重要?
您可以将具有特定阈值的点记录到数组/矢量中并进行比较。
快速的方法是使用2个二进制(单色,黑白)图像:
e.g。
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占用的内存比阵列多,但您可以轻松创建位图,将其添加到显示列表并检查是否正确等等。
如果速度是个问题:
你可能只用一个循环而不是两个循环 e.g。
var pixels:int = source.width * source.height; for(pixels; pixels&gt; = 0; pixels - )
HTH