0

プログラムは学生に折れ線グラフを表示します。生徒は、矢印キーを使用してモーション ディテクターからキャラクターを離したり近づけたりして、距離と時間のプロットを作成し、その折れ線グラフを再作成する必要があります。グラフを描画するときにプログラムが生成するデータ ポイントをキャプチャできます。また、生徒が生成したデータ ポイントを取得することもできます。学生側の許容範囲を考慮しながら、2 つのグラフを比較するにはどうすればよいですか? グラフが描画されているとき、またはすべてのデータ ポイントが記録された後に、間違ったグラフを検出しようとする必要がありますか? 一部のグラフは線形で比較が容易ですが、他のグラフはランダムな間隔で正、負、ゼロの勾配を持つ区分関数になります。

ありがとう!

4

1 に答える 1

0

グラフの線が描かれる順序は重要ですか?

特定のしきい値を持つポイントを配列/ベクトルに記録して比較できます。

手っ取り早い方法は、2 つのバイナリ (モノクロ、白黒のみ) 画像を使用することです。

  1. 1 つの画像は、グラフの「印刷画面」( BitmapData.draw() ) になります (例: 白地に黒)
  2. もう 1 つのイメージは、ユーザー/生徒が描画する (マウスが押されている間) 黒のピクセルを書き込むために使用する白 (空白) の BitmapData になります。

例えば

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

描画が完了したら (マウスを放すか、設定したルールを選択)、ソース (元のグラフ) 画像の黒いピクセルがどれだけ宛先 (ユーザー グラフ) 画像に一致するかをチェックする関数を実行します。

差分モードでブレンドされた他の 2 つのビットマップを含む BitmapData を作成して、黒でないものはすべて一致しないようにするか、すべてのピクセルを 1 回ループして、ピクセルが一致するかどうかを手動で確認します。これは、2 つの画像の寸法 (幅、高さ) が同じであるという事実に依存していることに注意してください。

これを説明するためのコードを次に示します。

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));

ベクトル/配列バージョンも同様ですが、視覚的な手がかりはありません。セットアップに応じて、どちらが最適かをテストすることをお勧めします。BitmapData は配列よりも多くのメモリを必要としますが、Bitmap を簡単に作成して表示リストに追加し、正しく表示されるかどうかを確認することができます。

速度が問題になる場合:

  • ベクターを使用。配列の代わりに高速になる可能性があります
  • 逆にループする(最大数を0に、デクリメントする)ことも少しスピードアップするはずです
  • あなたはおそらく2つではなく1つのループで逃げるでしょう。

    var ピクセル:int = source.width * source.height; for(ピクセル; ピクセル >=0; ピクセル--)

HTH

于 2010-08-10T16:03:47.633 に答える