将用户生成的折线图与由程序随机生成的折线图进行比较

时间:2010-08-10 03:31:41

标签: actionscript-3 graphing

该程序将向学生显示折线图。学生必须通过使用箭头键将角色移离或移向运动检测器来重新创建该线图,从而创建距离 - 时间图。我可以捕获程序在绘制图形时生成的数据点。我还可以捕获学生的数据点。如何比较两个图表,同时允许学生的一些容忍度?我是否应该在绘制时或在记录所有数据点后尝试检测错误的图形?虽然一些图形是线性的并且易于比较,但其他图形将是随机间隔具有正,负和零斜率的分段函数。

谢谢!

1 个答案:

答案 0 :(得分:0)

绘制图形线的顺序是否重要?

您可以将具有特定阈值的点记录到数组/矢量中并进行比较。

快速的方法是使用2个二进制(单色,黑白)图像:

  1. 一张图片将是图表的“打印屏幕”(BitmapData.draw())(例如白底黑字)
  2. 另一个图像将是一个白色(空白)BitmapData,用于写入黑色像素 用户/学生绘制的位置(按下鼠标时)。
  3. 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占用的内存比阵列多,但您可以轻松创建位图,将其添加到显示列表并检查是否正确等等。

    如果速度是个问题:

    • 使用Vector。而不是数组可能会更快
    • 反向循环(最高数字为0,递减)也应该加快一些事情
    • 你可能只用一个循环而不是两个循环 e.g。

      var pixels:int = source.width * source.height; for(pixels; pixels&gt; = 0; pixels - )

    HTH