public double findMatchTSS(MyFilterData search, BitmapData refData, MyPlayer RefPlayer, ref int targetX, ref int targetY) { // 3 steps searcj matchRatePair dataRecord = new matchRatePair(Double.PositiveInfinity, targetX, targetY); MyFilterData refKernelGet = new MyFilterData(); // the data copy from ref frame of kernel size int x = targetX; int y = targetY; for (int stepLength = refData.Width / 4; stepLength > 0; stepLength /= 2) { //cc compareBlock(search, refData, RefPlayer, x, y, dataRecord); //lt compareBlock(search, refData, RefPlayer, x - stepLength, y - stepLength, dataRecord); //ct compareBlock(search, refData, RefPlayer, x, y - stepLength, dataRecord); //rt compareBlock(search, refData, RefPlayer, x + stepLength, y - stepLength, dataRecord); //lc compareBlock(search, refData, RefPlayer, x - stepLength, y, dataRecord); //rc compareBlock(search, refData, RefPlayer, x + stepLength, y, dataRecord); //ld compareBlock(search, refData, RefPlayer, x - stepLength, y + stepLength, dataRecord); //cd compareBlock(search, refData, RefPlayer, x, y + stepLength, dataRecord); //rd compareBlock(search, refData, RefPlayer, x + stepLength, y + stepLength, dataRecord); x = dataRecord.x; y = dataRecord.y; } targetX = dataRecord.x; targetY = dataRecord.y; return(dataRecord.rate); }
private void compareBlock(MyFilterData search, BitmapData refData, MyPlayer RefPlayer, int x, int y, matchRatePair dataRecord) {// compare the (x , y) similar rate && flash dataRecord & view if (!RefPlayer.flashIgnore) { RefPlayer.OnPlay(new MyPlayer.PlayEventArgs(-1, MyPlayer.PlayState.KEEP, x, y, compressKernelSize, compressKernelSize)); } MyFilterData refKernelGet = new MyFilterData(); refKernelGet.fill(refData, x, y, MyFilter.BorderMethod.ZERO, CompressKernel); double distance = MyFilterData.compare(search, refKernelGet, criteria); if (dataRecord > distance) {// find min distance dataRecord.rate = distance; dataRecord.x = x; dataRecord.y = y; if (!RefPlayer.flashIgnore) { MyDeal.tryDraw(MatchViewer, refKernelGet.transToBitmap()); } } Thread.Sleep(sleepTime); }
public double findMatchNormal(MyFilterData search, BitmapData refData, MyPlayer RefPlayer, ref int targetX, ref int targetY) { // 2D loorer methd if x,y < 0 ? all seach : local primary matchRatePair dataRecord = new matchRatePair(Double.PositiveInfinity, 0, 0); MyFilterData refKernelGet = new MyFilterData(); // the data copy from ref frame of kernel size int farDistance2 = 128; //define half of this is mean the distance value from target is far int nearDistance2 = 32; //define half of this is mean the distance value from target is near int farJumpStap = compressKernelSize; // define search pixel jump step lenth when seach in far area if ((targetX < 0) || (targetY < 0)) {// search all pixels for (int y = 0 + compressKernelSize / 2; y < refData.Height; y += 1) { for (int x = 0 + compressKernelSize / 2; x < refData.Width; x += 1) { if ((!RefPlayer.flashIgnore) && (x % 3 == 0))// reduce the reflash view frequence { RefPlayer.OnPlay(new MyPlayer.PlayEventArgs(-1, MyPlayer.PlayState.KEEP, x, y, compressKernelSize, compressKernelSize)); } refKernelGet.fill(refData, x, y, MyFilter.BorderMethod.ZERO, CompressKernel); double distance = MyFilterData.compare(search, refKernelGet, criteria); if (dataRecord > distance) {// find min distance dataRecord.rate = distance; dataRecord.x = x; dataRecord.y = y; if (!RefPlayer.flashIgnore) { MyDeal.tryDraw(MatchViewer, refKernelGet.transToBitmap()); } } Thread.Sleep(sleepTime); } } targetX = dataRecord.x; targetY = dataRecord.y; return(dataRecord.rate); } else {//local primary // the far area left & top posion int fx = targetX - farDistance2 / 2; int fy = targetY - farDistance2 / 2; // the near area posion int nl = targetX - nearDistance2 / 2; int nt = targetY - nearDistance2 / 2; int nr = targetX + nearDistance2 / 2; int nb = targetY + nearDistance2 / 2; int jumpStap = farJumpStap; for (int y = (fy < (0 + compressKernelSize / 2) ? (0 + compressKernelSize / 2) : fy); (y < refData.Height) && (y < fy + farDistance2); y += jumpStap) { for (int x = (fx < (0 + compressKernelSize / 2) ? (0 + compressKernelSize / 2) : fx); (x < refData.Width) && (x < fx + farDistance2); x += jumpStap) { if ((x >= nl) && (x < nr) && (y >= nt) && (y < nb)) {// in near jumpStap = 1; } else {//in far jumpStap = farJumpStap; } compareBlock(search, refData, RefPlayer, x, y, dataRecord); } } targetX = dataRecord.x; targetY = dataRecord.y; return(dataRecord.rate); } }