60 #include "allheaders.h" 62 static const l_int32 MIN_MAZE_WIDTH = 50;
63 static const l_int32 MIN_MAZE_HEIGHT = 50;
65 static const l_float32 DEFAULT_WALL_PROBABILITY = 0.65;
66 static const l_float32 DEFAULT_ANISOTROPY_RATIO = 0.25;
86 static MAZEEL *mazeelCreate(l_int32 x, l_int32 y, l_int32 dir);
88 l_int32 *py, l_int32 maxrad);
151 l_float32 frand, wallpf, testp;
165 if (w < MIN_MAZE_WIDTH)
167 if (h < MIN_MAZE_HEIGHT)
169 if (xi <= 0 || xi >= w)
171 if (yi <= 0 || yi >= h)
173 if (wallps < 0.05 || wallps > 0.95)
174 wallps = DEFAULT_WALL_PROBABILITY;
175 if (ranis < 0.05 || ranis > 1.0)
176 ranis = DEFAULT_ANISOTROPY_RATIO;
177 wallpf = wallps * ranis;
180 fprintf(stderr,
"(w, h) = (%d, %d), (xi, yi) = (%d, %d)\n", w, h, xi, yi);
181 fprintf(stderr,
"Using: prob(wall) = %7.4f, anisotropy factor = %7.4f\n",
192 el = mazeelCreate(xi, yi, START_LOC);
206 frand = (l_float32)rand() / (l_float32)RAND_MAX;
210 if (frand <= testp) {
213 el = mazeelCreate(x - 1, y, DIR_WEST);
222 frand = (l_float32)rand() / (l_float32)RAND_MAX;
224 if (dir == DIR_NORTH)
226 if (frand <= testp) {
229 el = mazeelCreate(x, y - 1, DIR_NORTH);
238 frand = (l_float32)rand() / (l_float32)RAND_MAX;
242 if (frand <= testp) {
245 el = mazeelCreate(x + 1, y, DIR_EAST);
254 frand = (l_float32)rand() / (l_float32)RAND_MAX;
256 if (dir == DIR_SOUTH)
258 if (frand <= testp) {
261 el = mazeelCreate(x, y + 1, DIR_SOUTH);
276 mazeelCreate(l_int32 x,
346 l_int32 i, j, x, y, w, h, d, found;
347 l_uint32 val, rpixel, gpixel, bpixel;
348 void **lines1, **linem1, **linep8, **lined32;
356 PROCNAME(
"pixSearchBinaryMaze");
358 if (ppixd) *ppixd = NULL;
360 return (
PTA *)ERROR_PTR(
"pixs not defined", procName, NULL);
363 return (
PTA *)ERROR_PTR(
"pixs not 1 bpp", procName, NULL);
364 if (xi <= 0 || xi >= w)
365 return (
PTA *)ERROR_PTR(
"xi not valid", procName, NULL);
366 if (yi <= 0 || yi >= h)
367 return (
PTA *)ERROR_PTR(
"yi not valid", procName, NULL);
370 return (
PTA *)ERROR_PTR(
"(xi,yi) not bg pixel", procName, NULL);
378 fprintf(stderr,
"(xi, yi) = (%d, %d), (xf, yf) = (%d, %d)\n",
391 el = mazeelCreate(xi, yi, 0);
402 if (x == xf && y == yf) {
415 el = mazeelCreate(x - 1, y, 0);
427 el = mazeelCreate(x, y - 1, 0);
439 el = mazeelCreate(x + 1, y, 0);
451 el = mazeelCreate(x, y + 1, 0);
472 L_INFO(
" Path found\n", procName);
478 if (x == xi && y == yi)
483 if (val == DIR_NORTH)
485 else if (val == DIR_SOUTH)
487 else if (val == DIR_EAST)
489 else if (val == DIR_WEST)
493 L_INFO(
" No path found\n", procName);
496 for (i = 0; i < h; i++) {
497 for (j = 0; j < w; j++) {
531 l_int32 x, y, w, h, r, i, j;
537 if (val == 0)
return 0;
543 for (r = 1; r < maxrad; r++) {
544 for (i = -r; i <= r; i++) {
545 if (y + i < 0 || y + i >= h)
547 for (j = -r; j <= r; j++) {
548 if (x + j < 0 || x + j >= w)
550 if (L_ABS(i) != r && L_ABS(j) != r)
730 l_int32 x, y, w, h, d;
731 l_uint32 val, valr, vals, rpixel, gpixel, bpixel;
732 void **lines8, **liner32, **linep8;
733 l_int32 cost, dist, distparent, sival, sivals;
742 PROCNAME(
"pixSearchGrayMaze");
744 if (ppixd) *ppixd = NULL;
746 return (
PTA *)ERROR_PTR(
"pixs not defined", procName, NULL);
749 return (
PTA *)ERROR_PTR(
"pixs not 8 bpp", procName, NULL);
750 if (xi <= 0 || xi >= w)
751 return (
PTA *)ERROR_PTR(
"xi not valid", procName, NULL);
752 if (yi <= 0 || yi >= h)
753 return (
PTA *)ERROR_PTR(
"yi not valid", procName, NULL);
768 el = mazeelCreate(xi, yi, 0);
782 L_ERROR(
"heap broken!!\n", procName);
787 if (x == xf && y == yf) {
791 distparent = (l_int32)elp->distance;
798 sivals = (l_int32)vals;
799 cost = 1 + L_ABS(sivals - sival);
800 dist = distparent + cost;
804 el = mazeelCreate(x - 1, y, 0);
813 sivals = (l_int32)vals;
814 cost = 1 + L_ABS(sivals - sival);
815 dist = distparent + cost;
819 el = mazeelCreate(x, y - 1, 0);
828 sivals = (l_int32)vals;
829 cost = 1 + L_ABS(sivals - sival);
830 dist = distparent + cost;
834 el = mazeelCreate(x + 1, y, 0);
843 sivals = (l_int32)vals;
844 cost = 1 + L_ABS(sivals - sival);
845 dist = distparent + cost;
849 el = mazeelCreate(x, y + 1, 0);
873 if (x == xi && y == yi)
878 if (val == DIR_NORTH)
880 else if (val == DIR_SOUTH)
882 else if (val == DIR_EAST)
884 else if (val == DIR_WEST)
889 fprintf(stderr,
"(x,y) = (%d, %d); dist = %d\n", x, y, val);
PIX * pixUnpackBinary(PIX *pixs, l_int32 depth, l_int32 invert)
pixUnpackBinary()
PTA * pixSearchGrayMaze(PIX *pixs, l_int32 xi, l_int32 yi, l_int32 xf, l_int32 yf, PIX **ppixd)
pixSearchGrayMaze()
l_ok lheapAdd(L_HEAP *lh, void *item)
lheapAdd()
l_ok ptaAddPt(PTA *pta, l_float32 x, l_float32 y)
ptaAddPt()
L_QUEUE * lqueueCreate(l_int32 nalloc)
lqueueCreate()
PTA * ptaCreate(l_int32 n)
ptaCreate()
PIX * pixConvert8To32(PIX *pixs)
pixConvert8To32()
void ** pixGetLinePtrs(PIX *pix, l_int32 *psize)
pixGetLinePtrs()
#define GET_DATA_FOUR_BYTES(pdata, n)
PIX * pixCreate(l_int32 width, l_int32 height, l_int32 depth)
pixCreate()
l_ok pixSetAll(PIX *pix)
pixSetAll()
static l_int32 localSearchForBackground(PIX *pix, l_int32 *px, l_int32 *py, l_int32 maxrad)
localSearchForBackground()
void lheapDestroy(L_HEAP **plh, l_int32 freeflag)
lheapDestroy()
#define GET_DATA_BIT(pdata, n)
l_int32 lheapGetCount(L_HEAP *lh)
lheapGetCount()
void * lqueueRemove(L_QUEUE *lq)
lqueueRemove()
l_ok pixSetPixel(PIX *pix, l_int32 x, l_int32 y, l_uint32 val)
pixSetPixel()
l_ok lqueueAdd(L_QUEUE *lq, void *item)
lqueueAdd()
#define SET_DATA_BYTE(pdata, n, val)
L_HEAP * lheapCreate(l_int32 nalloc, l_int32 direction)
lheapCreate()
#define GET_DATA_BYTE(pdata, n)
void * lheapRemove(L_HEAP *lh)
lheapRemove()
void pixDestroy(PIX **ppix)
pixDestroy()
l_int32 lqueueGetCount(L_QUEUE *lq)
lqueueGetCount()
PIX * generateBinaryMaze(l_int32 w, l_int32 h, l_int32 xi, l_int32 yi, l_float32 wallps, l_float32 ranis)
generateBinaryMaze()
l_ok pixGetPixel(PIX *pix, l_int32 x, l_int32 y, l_uint32 *pval)
pixGetPixel()
l_ok pixGetDimensions(const PIX *pix, l_int32 *pw, l_int32 *ph, l_int32 *pd)
pixGetDimensions()
#define SET_DATA_FOUR_BYTES(pdata, n, val)
void lqueueDestroy(L_QUEUE **plq, l_int32 freeflag)
lqueueDestroy()
PTA * pixSearchBinaryMaze(PIX *pixs, l_int32 xi, l_int32 yi, l_int32 xf, l_int32 yf, PIX **ppixd)
pixSearchBinaryMaze()
l_ok composeRGBPixel(l_int32 rval, l_int32 gval, l_int32 bval, l_uint32 *ppixel)
composeRGBPixel()
#define SET_DATA_BIT(pdata, n)