here is my very long submitted solution, which is basically a dfs starts x image, checks if it has an overlap in some direction another image, if , it rotates image accordingly if needed.
It is a bit long as it gives option browse for data folder at end for save folder.
Can run as recursive or see algorithm is actually doing at runtime.
Just check the "runAlgorithm" function.
Needs compiled as Desktop AIR project if anybody interested in compiling it.
package
{
import com.adobe.images.PNGEncoder;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.filesystem.File;
import flash.filesystem.FileMode;
import flash.filesystem.FileStream;
import flash.geom.Matrix;
import flash.geom.Rectangle;
import flash.net.URLLoader;
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequest;
import flash.text.TextField;
import flash.text.TextFormat;
import flash.utils.ByteArray;
import flash.utils.getTimer;
[SWF(width='800', height = '600', backgroundColor='#000000', frameRate='30')]
public class PuzzleAIR extends Sprite
{
public var cx:int = 0;
public var cy:int = 0;
public var allBitmaps:Array = new Array();
public var array:Array;
public var current:int = 0;
public var startingIndex:int = -1;
public var fullBitmap:MovieClip;
public var minx: = .MAX_VALUE, miny:= .MAX_VALUE;
public var recursive:Boolean = true;
private var btn:Sprite = new Sprite();
private var text:TextField = new TextField();
public var startTime:int = 0;
public var elapsed:int = 0;
//hashmaps:
public var leftMap:Object = {};
public var rightMap:Object = {};
public var topMap:Object = {};
public var bottomMap:Object = {};
//end of hashmaps
public function PuzzleAIR()
{
stage.scaleMode = "noScale";
stage.align = "TL";
fullBitmap = new MovieClip();
addChild(fullBitmap);
btn.graphics.clear();
btn.graphics.beginFill(0x4d4d4d);
btn.graphics.drawRect(0,0,80,40);
btn.graphics.endFill();
btn.x = 400;
btn.y= 300;
addChild(btn);
text.x = 20;
text.y = 10;
text.selectable = false;
text.defaultTextFormat = new TextFormat("Arial","14","0xffffff");
text.text = "Start";
btn.addChild(text);
btn.buttonMode = true;
btn.addEventListener(MouseEvent.CLICK, openDirectory);
}
private function openDirectory(event:MouseEvent):void
{
var file:File = new File();
file.browseForDirectory("Select Data Directory");
file.addEventListener(Event.SELECT, dirSelected);
}
private function dirSelected(event:Event):void
{
btn.removeEventListener(MouseEvent.CLICK, openDirectory);
removeChild(btn);
var file:File = event.currentTarget as File;
array = (file.getDirectoryListing());
for(var i:int = 0; i < array.length; ++i)
{
var loader:URLLoader = new URLLoader(new URLRequest(array[i].url));
loader.dataFormat = URLLoaderDataFormat.BINARY;
loader.addEventListener(Event.COMPLETE, imageLoaded);
}
}
private function byteArrayCompare(b1:ByteArray , b2:ByteArray):Boolean
{
if(b1.toString() == b2.toString()) return true;
var i:int = 0;
var length:uint = b1.length;
for (i = 0; i < length/4; i++) {
if(b1[length - (i+1) * 4 + 0] != b2[i * 4 + 0]) return false;
if(b1[length - (i+1) * 4 + 1] != b2[i * 4 + 1]) return false;
if(b1[length - (i+1) * 4 + 2] != b2[i * 4 + 2]) return false;
if(b1[length - (i+1) * 4 + 3] != b2[i * 4 + 3]) return false;
}
return true;
}
public var stack:Array = new Array();
private function imageLoaded(e:Event):void
{
var bmpData:BitmapData = new BitmapData(52, 52, false, 0x000000);
var ba:ByteArray = (e.currentTarget as URLLoader).data;
bmpData.lock();
for(var i:int = 0; i < 52; ++i)
{
for(var j:int = 0; j < 52; ++j)
{
var r:int = ba.readUnsignedByte();
var g:int = ba.readUnsignedByte();
var b:int = ba.readUnsignedByte();
var color:uint = (255 << 24 | r << 16 | g << 8 | b);
bmpData.setPixel(j,i,color);
}
}
var topRow:ByteArray = bmpData.getPixels(new Rectangle(1,0,50,1));
var topRowMinusOne:ByteArray = bmpData.getPixels(new Rectangle(1,1,50,1));
var bottomRow:ByteArray = bmpData.getPixels(new Rectangle(1,51,50,1));
var bottomRowMinusOne:ByteArray = bmpData.getPixels(new Rectangle(1,50,50,1));
var leftRow:ByteArray = bmpData.getPixels(new Rectangle(0,1,1,50));
var leftRowMinusOne:ByteArray = bmpData.getPixels(new Rectangle(1,1,1,50));
var rightRow:ByteArray = bmpData.getPixels(new Rectangle(51,1,1,50));
var rightRowMinusOne:ByteArray = bmpData.getPixels(new Rectangle(50,1,1,50));
bmpData.unlock();
var bmp:Bitmap = new Bitmap(bmpData);
var mc:MovieClip = new MovieClip();
bmp.x = -bmp.width/2;
bmp.y = -bmp.height/2;
mc.bmp = bmp;
mc.addChild(bmp);
fullBitmap.addChild(mc);
allBitmaps.push({
bitmap:mc,
index:allBitmaps.length,
topRow:topRow,
bottomRow:bottomRow,
leftRow:leftRow,
rightRow:rightRow,
topRowMinusOne:topRowMinusOne,
bottomRowMinusOne:bottomRowMinusOne,
leftRowMinusOne:leftRowMinusOne,
rightRowMinusOne:rightRowMinusOne
});
if(allBitmaps.length == array.length) {
mc.x = stage.stageWidth/2;
mc.y = stage.stageHeight/2;
startTime = getTimer();
//
if(recursive)
{
runAlgorithm(allBitmaps.length - 1);
elapsed = getTimer()-startTime;
fullBitmap.x = -minx;
fullBitmap.y = -miny;
showSaveImage();
}else
{
stack.push(allBitmaps.length - 1);
stage.addEventListener(Event.ENTER_FRAME,MainLoop);
}
}
}
private function showSaveImage():void
{
text.text = "Save";
addChild(btn);
btn.addEventListener(MouseEvent.CLICK, selectSaveDir);
}
private function selectSaveDir(event:MouseEvent):void
{
var file:File = new File();
file.browseForSave("Select File for Saving image");
file.addEventListener(Event.SELECT, saveDirSelected);
}
private function saveDirSelected(event:Event):void
{
var bmpd:BitmapData = new BitmapData(4000, 1250);
var m:Matrix = new Matrix();
m.translate(fullBitmap.x,fullBitmap.y);
bmpd.draw(fullBitmap,m);
var imageBytes:ByteArray = PNGEncoder.encode(bmpd);
var file:File = event.currentTarget as File;
var fileStream:FileStream = new FileStream();
fileStream.open(file,FileMode.WRITE);
fileStream.writeBytes(imageBytes);
fileStream.close();
}
private function RotateBitmap(object:Object, angle:):void
{
if(angle == 0) return;
var bmp:Bitmap = object.bitmap.bmp;
/*var matrix:Matrix = new Matrix();
matrix.translate(-bmp.width/2, -bmp.height/2);
matrix.rotate(angle/180*3.14);
matrix.translate(bmp.width/2, bmp.height/2);
matrix.concat(bmp.transform.matrix);
bmp.transform.matrix = matrix;
*/
object.bitmap.rotation = angle;
var topRow:ByteArray = object.topRow;
var topRowMinusOne:ByteArray = object.topRowMinusOne;
var bottomRow:ByteArray = object.bottomRow;
var bottomRowMinusOne:ByteArray = object.bottomRowMinusOne;
var leftRow:ByteArray = object.leftRow;
var leftRowMinusOne:ByteArray = object.leftRowMinusOne;
var rightRow:ByteArray = object.rightRow;
var rightRowMinusOne:ByteArray = object.rightRowMinusOne
if (angle == -90 || angle == 270) {
object.topRow = rightRow;
object.topRowMinusOne = rightRowMinusOne;
object.bottomRow = leftRow;
object.bottomRowMinusOne = leftRowMinusOne;
object.leftRow = topRow;
object.leftRowMinusOne = topRowMinusOne;
object.rightRow = bottomRow;
object.rightRowMinusOne = bottomRowMinusOne;
}
else if (angle == 180 || angle == -180) {
object.topRow = bottomRow;
object.topRowMinusOne = bottomRowMinusOne;
object.bottomRow = topRow;
object.bottomRowMinusOne = topRowMinusOne;
object.leftRow = rightRow;
object.leftRowMinusOne = rightRowMinusOne;
object.rightRow = leftRow;
object.rightRowMinusOne = leftRowMinusOne;
}
else if (angle == -270 || angle == 90) {
object.topRow = leftRow;
object.topRowMinusOne = leftRow;
object.bottomRow = rightRow;
object.bottomRowMinusOne = rightRowMinusOne;
object.leftRow = bottomRow;
object.leftRowMinusOne = bottomRowMinusOne;
object.rightRow = topRow;
object.rightRowMinusOne = topRowMinusOne;
}
}
public function MainLoop(event:Event):void{
trace(stack.length);
if (stack.length) {
var i:int = stack.pop();
runAlgorithm(i);
}
else
{
trace("done");
stage.removeEventListener(Event.ENTER_FRAME, MainLoop);
fullBitmap.x = -minx;
fullBitmap.y = -miny;
showSaveImage();
}
}
private function runAlgorithm(index:int):void
{
var currentBitmap:Object = allBitmaps[index];
currentBitmap.visited = true;
for(var i:int = 0; i < allBitmaps.length; ++i)
{
if(i == index) continue;
if (allBitmaps[i].visited == true) continue;
/////////////
//
if (currentBitmap.right == && allBitmaps[i].left==) {
if(byteArrayCompare(currentBitmap.rightRow, allBitmaps[i].leftRowMinusOne))
{
allBitmaps[i].bitmap.x = currentBitmap.bitmap.x + 50;
allBitmaps[i].bitmap.y = currentBitmap.bitmap.y;
currentBitmap.right = i;
allBitmaps[i].left = index;
continue;
}
else if(byteArrayCompare(currentBitmap.rightRow, allBitmaps[i].topRowMinusOne))
{
allBitmaps[i].bitmap.x = currentBitmap.bitmap.x + 50;
allBitmaps[i].bitmap.y = currentBitmap.bitmap.y;
RotateBitmap(allBitmaps[i], -90);
currentBitmap.right = i;
allBitmaps[i].left = index;
continue;
}
else if(byteArrayCompare(currentBitmap.rightRow, allBitmaps[i].rightRowMinusOne))
{
allBitmaps[i].bitmap.x = currentBitmap.bitmap.x + 50;
allBitmaps[i].bitmap.y = currentBitmap.bitmap.y;
RotateBitmap(allBitmaps[i], 180);
currentBitmap.right = i;
allBitmaps[i].left = index;
continue;
}
else if(byteArrayCompare(currentBitmap.rightRow, allBitmaps[i].bottomRowMinusOne))
{
allBitmaps[i].bitmap.x = currentBitmap.bitmap.x + 50;
allBitmaps[i].bitmap.y = currentBitmap.bitmap.y;
RotateBitmap(allBitmaps[i], 90);
currentBitmap.right = i;
allBitmaps[i].left = index;
continue;
}
}
//////////////
//
if (currentBitmap.bottom == && allBitmaps[i].top==) {
if(byteArrayCompare(currentBitmap.bottomRow, allBitmaps[i].topRowMinusOne)){
allBitmaps[i].bitmap.y = currentBitmap.bitmap.y + 50;
allBitmaps[i].bitmap.x = currentBitmap.bitmap.x;
currentBitmap.bottom = i;
allBitmaps[i].top = index;
continue;
}
else if(byteArrayCompare(currentBitmap.bottomRow, allBitmaps[i].leftRowMinusOne)){
allBitmaps[i].bitmap.y = currentBitmap.bitmap.y + 50;
allBitmaps[i].bitmap.x = currentBitmap.bitmap.x;
RotateBitmap(allBitmaps[i], 90);
currentBitmap.bottom = i;
allBitmaps[i].top = index;
continue;
}
else if(byteArrayCompare(currentBitmap.bottomRow, allBitmaps[i].rightRowMinusOne)){
allBitmaps[i].bitmap.y = currentBitmap.bitmap.y + 50;
allBitmaps[i].bitmap.x = currentBitmap.bitmap.x;
RotateBitmap(allBitmaps[i], -90);
currentBitmap.bottom = i;
allBitmaps[i].top = index;
continue;
}
else if(byteArrayCompare(currentBitmap.bottomRow, allBitmaps[i].bottomRowMinusOne)){
allBitmaps[i].bitmap.y = currentBitmap.bitmap.y + 50;
allBitmaps[i].bitmap.x = currentBitmap.bitmap.x;
RotateBitmap(allBitmaps[i], 180);
currentBitmap.bottom = i;
allBitmaps[i].top = index;
continue;
}
}
/////////////////
//
if (currentBitmap.left == && allBitmaps[i].right==) {
if(byteArrayCompare(currentBitmap.leftRow, allBitmaps[i].rightRowMinusOne)){
allBitmaps[i].bitmap.x = currentBitmap.bitmap.x - 50;
allBitmaps[i].bitmap.y = currentBitmap.bitmap.y;
currentBitmap.left = i;
allBitmaps[i].right = index;
if(allBitmaps[i].bitmap.x < minx) minx = allBitmaps[i].bitmap.x;
continue;
}
else if(byteArrayCompare(currentBitmap.leftRow, allBitmaps[i].leftRowMinusOne)){
allBitmaps[i].bitmap.x = currentBitmap.bitmap.x - 50;
allBitmaps[i].bitmap.y = currentBitmap.bitmap.y;
RotateBitmap(allBitmaps[i], 180);
currentBitmap.left = i;
allBitmaps[i].right = index;
if(allBitmaps[i].bitmap.x < minx) minx = allBitmaps[i].bitmap.x;
continue;
}
else if(byteArrayCompare(currentBitmap.leftRow, allBitmaps[i].bottomRowMinusOne)){
allBitmaps[i].bitmap.x = currentBitmap.bitmap.x - 50;
allBitmaps[i].bitmap.y = currentBitmap.bitmap.y;
RotateBitmap(allBitmaps[i], -90);
currentBitmap.left = i;
allBitmaps[i].right = index;
if(allBitmaps[i].bitmap.x < minx) minx = allBitmaps[i].bitmap.x;
continue;
}
else if(byteArrayCompare(currentBitmap.leftRow, allBitmaps[i].topRowMinusOne)){
allBitmaps[i].bitmap.x = currentBitmap.bitmap.x - 50;
allBitmaps[i].bitmap.y = currentBitmap.bitmap.y;
RotateBitmap(allBitmaps[i], 90);
currentBitmap.left = i;
allBitmaps[i].right = index;
if(allBitmaps[i].bitmap.x < minx) minx = allBitmaps[i].bitmap.x;
continue;
}
}
////////////////////
//
if (currentBitmap.top == && allBitmaps[i].bottom==) {
if(byteArrayCompare(currentBitmap.topRow, allBitmaps[i].bottomRowMinusOne)){
allBitmaps[i].bitmap.y = currentBitmap.bitmap.y - 50;
allBitmaps[i].bitmap.x = currentBitmap.bitmap.x;
currentBitmap.top = i;
allBitmaps[i].bottom = index;
if(allBitmaps[i].bitmap.y < miny) miny = allBitmaps[i].bitmap.y;
continue;
}
else if(byteArrayCompare(currentBitmap.topRow, allBitmaps[i].topRowMinusOne)){
allBitmaps[i].bitmap.y = currentBitmap.bitmap.y - 50;
allBitmaps[i].bitmap.x = currentBitmap.bitmap.x;
RotateBitmap(allBitmaps[i], 180);
currentBitmap.top = i;
allBitmaps[i].bottom = index;
continue;
if(allBitmaps[i].bitmap.y < miny) miny = allBitmaps[i].bitmap.y;
}
else if(byteArrayCompare(currentBitmap.topRow, allBitmaps[i].leftRowMinusOne)){
allBitmaps[i].bitmap.y = currentBitmap.bitmap.y - 50;
allBitmaps[i].bitmap.x = currentBitmap.bitmap.x;
RotateBitmap(allBitmaps[i], -90);
currentBitmap.top = i;
allBitmaps[i].bottom = index;
if(allBitmaps[i].bitmap.y < miny) miny = allBitmaps[i].bitmap.y;
continue;
}
else if(byteArrayCompare(currentBitmap.topRow, allBitmaps[i].rightRowMinusOne)){
allBitmaps[i].bitmap.y = currentBitmap.bitmap.y - 50;
allBitmaps[i].bitmap.x = currentBitmap.bitmap.x;
RotateBitmap(allBitmaps[i], 90);
currentBitmap.top = i;
allBitmaps[i].bottom = index;
if(allBitmaps[i].bitmap.y < miny) miny = allBitmaps[i].bitmap.y;
continue;
}
}
}
if(recursive)
{
if(currentBitmap.top != && !allBitmaps[currentBitmap.top].visited)
runAlgorithm(currentBitmap.top);
if(currentBitmap.bottom != && !allBitmaps[currentBitmap.bottom].visited)
runAlgorithm(currentBitmap.bottom);
if(currentBitmap.right != && !allBitmaps[currentBitmap.right].visited)
runAlgorithm(currentBitmap.right);
if(currentBitmap.left != && !allBitmaps[currentBitmap.left].visited)
runAlgorithm(currentBitmap.left);
}else
{
if(currentBitmap.top != && !allBitmaps[currentBitmap.top].visited)
stack.push(currentBitmap.top);
if(currentBitmap.bottom != && !allBitmaps[currentBitmap.bottom].visited)
stack.push(currentBitmap.bottom);
if(currentBitmap.right != && !allBitmaps[currentBitmap.right].visited)
stack.push(currentBitmap.right);
if(currentBitmap.left != && !allBitmaps[currentBitmap.left].visited)
stack.push(currentBitmap.left);
}
}
}
}