|
|
@ -19,18 +19,17 @@ public class Puzzle15Processor { |
|
|
|
private static final int GRID_SIZE = 4; |
|
|
|
private static final int GRID_SIZE = 4; |
|
|
|
private static final int GRID_AREA = GRID_SIZE * GRID_SIZE; |
|
|
|
private static final int GRID_AREA = GRID_SIZE * GRID_SIZE; |
|
|
|
private static final int GRID_EMPTY_INDEX = GRID_AREA - 1; |
|
|
|
private static final int GRID_EMPTY_INDEX = GRID_AREA - 1; |
|
|
|
private static final String TAG = "Puzzle15Processor"; |
|
|
|
private static final String TAG = "Puzzle15Processor"; |
|
|
|
|
|
|
|
|
|
|
|
private int[] mIndexes; |
|
|
|
private int[] mIndexes; |
|
|
|
private int[] mTextWidths; |
|
|
|
private int[] mTextWidths; |
|
|
|
private int[] mTextHeights; |
|
|
|
private int[] mTextHeights; |
|
|
|
|
|
|
|
|
|
|
|
private Mat mRgba; |
|
|
|
|
|
|
|
private Mat mRgba15; |
|
|
|
private Mat mRgba15; |
|
|
|
|
|
|
|
|
|
|
|
private Mat[] mCells; |
|
|
|
private Mat[] mCells; |
|
|
|
private Mat[] mCells15; |
|
|
|
private Mat[] mCells15; |
|
|
|
private boolean mShowTileNumbers = true; |
|
|
|
private boolean mShowTileNumbers = true; |
|
|
|
|
|
|
|
|
|
|
|
public Puzzle15Processor() { |
|
|
|
public Puzzle15Processor() { |
|
|
|
mTextWidths = new int[GRID_AREA]; |
|
|
|
mTextWidths = new int[GRID_AREA]; |
|
|
@ -38,13 +37,8 @@ public class Puzzle15Processor { |
|
|
|
|
|
|
|
|
|
|
|
mIndexes = new int [GRID_AREA]; |
|
|
|
mIndexes = new int [GRID_AREA]; |
|
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < GRID_AREA; i++) { |
|
|
|
for (int i = 0; i < GRID_AREA; i++) |
|
|
|
Size s = Core.getTextSize(Integer.toString(i + 1), 3/* CV_FONT_HERSHEY_COMPLEX */, 1, 2, null); |
|
|
|
|
|
|
|
mTextHeights[i] = (int) s.height; |
|
|
|
|
|
|
|
mTextWidths[i] = (int) s.width; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mIndexes[i] = i; |
|
|
|
mIndexes[i] = i; |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* this method is intended to make processor prepared for a new game */ |
|
|
|
/* this method is intended to make processor prepared for a new game */ |
|
|
@ -67,34 +61,33 @@ public class Puzzle15Processor { |
|
|
|
for (int i = 0; i < GRID_SIZE; i++) { |
|
|
|
for (int i = 0; i < GRID_SIZE; i++) { |
|
|
|
for (int j = 0; j < GRID_SIZE; j++) { |
|
|
|
for (int j = 0; j < GRID_SIZE; j++) { |
|
|
|
int k = i * GRID_SIZE + j; |
|
|
|
int k = i * GRID_SIZE + j; |
|
|
|
// mCells[k] = mRgba.submat(i * height / GRID_SIZE, (i + 1) * height / GRID_SIZE, j * width / GRID_SIZE, (j + 1) * width / GRID_SIZE);
|
|
|
|
|
|
|
|
mCells15[k] = mRgba15.submat(i * height / GRID_SIZE, (i + 1) * height / GRID_SIZE, j * width / GRID_SIZE, (j + 1) * width / GRID_SIZE); |
|
|
|
mCells15[k] = mRgba15.submat(i * height / GRID_SIZE, (i + 1) * height / GRID_SIZE, j * width / GRID_SIZE, (j + 1) * width / GRID_SIZE); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < GRID_AREA; i++) { |
|
|
|
|
|
|
|
Size s = Core.getTextSize(Integer.toString(i + 1), 3/* CV_FONT_HERSHEY_COMPLEX */, 1, 2, null); |
|
|
|
|
|
|
|
mTextHeights[i] = (int) s.height; |
|
|
|
|
|
|
|
mTextWidths[i] = (int) s.width; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* this method to be called from the outside. it processes the frame and shuffles |
|
|
|
/* this method to be called from the outside. it processes the frame and shuffles |
|
|
|
* the tiles as specified by mIndexes array |
|
|
|
* the tiles as specified by mIndexes array |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
public synchronized Mat puzzleFrame(Mat inputPicture) { |
|
|
|
public synchronized Mat puzzleFrame(Mat inputPicture) { |
|
|
|
int rows = inputPicture.rows(); |
|
|
|
int rows = inputPicture.rows(); |
|
|
|
int cols = inputPicture.cols(); |
|
|
|
int cols = inputPicture.cols(); |
|
|
|
|
|
|
|
|
|
|
|
int type = inputPicture.type(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
rows = rows - rows%4; |
|
|
|
rows = rows - rows%4; |
|
|
|
cols = cols - cols%4; |
|
|
|
cols = cols - cols%4; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < GRID_SIZE; i++) { |
|
|
|
for (int i = 0; i < GRID_SIZE; i++) { |
|
|
|
for (int j = 0; j < GRID_SIZE; j++) { |
|
|
|
for (int j = 0; j < GRID_SIZE; j++) { |
|
|
|
int k = i * GRID_SIZE + j; |
|
|
|
int k = i * GRID_SIZE + j; |
|
|
|
mCells[k] = inputPicture.submat(i * inputPicture.rows() / GRID_SIZE, (i + 1) * inputPicture.rows() / GRID_SIZE, j * inputPicture.cols()/ GRID_SIZE, (j + 1) * inputPicture.cols() / GRID_SIZE); |
|
|
|
mCells[k] = inputPicture.submat(i * inputPicture.rows() / GRID_SIZE, (i + 1) * inputPicture.rows() / GRID_SIZE, j * inputPicture.cols()/ GRID_SIZE, (j + 1) * inputPicture.cols() / GRID_SIZE); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
rows = rows - rows%4; |
|
|
|
rows = rows - rows%4; |
|
|
|
cols = cols - cols%4; |
|
|
|
cols = cols - cols%4; |
|
|
@ -115,23 +108,22 @@ public class Puzzle15Processor { |
|
|
|
|
|
|
|
|
|
|
|
drawGrid(cols, rows, mRgba15); |
|
|
|
drawGrid(cols, rows, mRgba15); |
|
|
|
|
|
|
|
|
|
|
|
return mRgba15; |
|
|
|
return mRgba15; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public void toggleTileNumbers() { |
|
|
|
public void toggleTileNumbers() { |
|
|
|
mShowTileNumbers = !mShowTileNumbers; |
|
|
|
mShowTileNumbers = !mShowTileNumbers; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public void deliverTouchEvent(int x, int y) { |
|
|
|
public void deliverTouchEvent(int x, int y) { |
|
|
|
int rows = mRgba15.rows(); |
|
|
|
int rows = mRgba15.rows(); |
|
|
|
int cols = mRgba15.cols(); |
|
|
|
int cols = mRgba15.cols(); |
|
|
|
|
|
|
|
|
|
|
|
int row = (int) Math.floor(y * GRID_SIZE / rows); |
|
|
|
int row = (int) Math.floor(y * GRID_SIZE / rows); |
|
|
|
int col = (int) Math.floor(x * GRID_SIZE / cols); |
|
|
|
int col = (int) Math.floor(x * GRID_SIZE / cols); |
|
|
|
|
|
|
|
|
|
|
|
if (row < 0 || row >= GRID_SIZE || col < 0 || col >= GRID_SIZE) { |
|
|
|
if (row < 0 || row >= GRID_SIZE || col < 0 || col >= GRID_SIZE) { |
|
|
|
Log.e(TAG, "It is not expected to get touch event outside of picture"); |
|
|
|
Log.e(TAG, "It is not expected to get touch event outside of picture"); |
|
|
|
return ; |
|
|
|
return ; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -172,7 +164,6 @@ public class Puzzle15Processor { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private static void shuffle(int[] array) { |
|
|
|
private static void shuffle(int[] array) { |
|
|
|
for (int i = array.length; i > 1; i--) { |
|
|
|
for (int i = array.length; i > 1; i--) { |
|
|
|
int temp = array[i - 1]; |
|
|
|
int temp = array[i - 1]; |
|
|
@ -199,5 +190,4 @@ public class Puzzle15Processor { |
|
|
|
} |
|
|
|
} |
|
|
|
return sum % 2 == 0; |
|
|
|
return sum % 2 == 0; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|