154l_float32 frand, wallpf, testp;
168 if (w < MinMazeWidth)
170 if (h < MinMazeHeight)
172 if (xi <= 0 || xi >= w)
174 if (yi <= 0 || yi >= h)
176 if (wallps < 0.05 || wallps > 0.95)
177 wallps = DefaultWallProbability;
178 if (ranis < 0.05 || ranis > 1.0)
179 ranis = DefaultAnisotropyRatio;
180 wallpf = wallps * ranis;
183 lept_stderr(
"(w, h) = (%d, %d), (xi, yi) = (%d, %d)\n", w, h, xi, yi);
184 lept_stderr(
"Using: prob(wall) = %7.4f, anisotropy factor = %7.4f\n",
189 pixd = pixCreate(w, h, 1);
190 pixm = pixCreate(w, h, 1);
192 lq = lqueueCreate(0);
195 el = mazeelCreate(xi, yi, START_LOC);
196 pixSetPixel(pixm, xi, yi, 1);
200 while (lqueueGetCount(lq) > 0) {
201 elp = (
MAZEEL *)lqueueRemove(lq);
206 pixGetPixel(pixm, x - 1, y, &val);
208 pixSetPixel(pixm, x - 1, y, 1);
209 frand = (l_float32)rand() / (l_float32)RAND_MAX;
213 if (frand <= testp) {
214 pixSetPixel(pixd, x - 1, y, 1);
216 el = mazeelCreate(x - 1, y, DIR_WEST);
222 pixGetPixel(pixm, x, y - 1, &val);
224 pixSetPixel(pixm, x, y - 1, 1);
225 frand = (l_float32)rand() / (l_float32)RAND_MAX;
227 if (dir == DIR_NORTH)
229 if (frand <= testp) {
230 pixSetPixel(pixd, x, y - 1, 1);
232 el = mazeelCreate(x, y - 1, DIR_NORTH);
238 pixGetPixel(pixm, x + 1, y, &val);
240 pixSetPixel(pixm, x + 1, y, 1);
241 frand = (l_float32)rand() / (l_float32)RAND_MAX;
245 if (frand <= testp) {
246 pixSetPixel(pixd, x + 1, y, 1);
248 el = mazeelCreate(x + 1, y, DIR_EAST);
254 pixGetPixel(pixm, x, y + 1, &val);
256 pixSetPixel(pixm, x, y + 1, 1);
257 frand = (l_float32)rand() / (l_float32)RAND_MAX;
259 if (dir == DIR_SOUTH)
261 if (frand <= testp) {
262 pixSetPixel(pixd, x, y + 1, 1);
264 el = mazeelCreate(x, y + 1, DIR_SOUTH);
272 lqueueDestroy(&lq, TRUE);
349l_int32 i, j, x, y, w, h, d, found;
350l_uint32 val, rpixel, gpixel, bpixel;
351void **lines1, **linem1, **linep8, **lined32;
359 if (ppixd) *ppixd = NULL;
361 return (
PTA *)ERROR_PTR(
"pixs not defined", __func__, NULL);
362 pixGetDimensions(pixs, &w, &h, &d);
364 return (
PTA *)ERROR_PTR(
"pixs not 1 bpp", __func__, NULL);
365 if (xi <= 0 || xi >= w)
366 return (
PTA *)ERROR_PTR(
"xi not valid", __func__, NULL);
367 if (yi <= 0 || yi >= h)
368 return (
PTA *)ERROR_PTR(
"yi not valid", __func__, NULL);
369 pixGetPixel(pixs, xi, yi, &val);
371 return (
PTA *)ERROR_PTR(
"(xi,yi) not bg pixel", __func__, NULL);
379 lept_stderr(
"(xi, yi) = (%d, %d), (xf, yf) = (%d, %d)\n",
383 pixm = pixCreate(w, h, 1);
384 pixp = pixCreate(w, h, 8);
385 lines1 = pixGetLinePtrs(pixs, NULL);
386 linem1 = pixGetLinePtrs(pixm, NULL);
387 linep8 = pixGetLinePtrs(pixp, NULL);
389 lq = lqueueCreate(0);
392 el = mazeelCreate(xi, yi, 0);
393 pixSetPixel(pixm, xi, yi, 1);
399 while (lqueueGetCount(lq) > 0) {
400 elp = (
MAZEEL *)lqueueRemove(lq);
403 if (x == xf && y == yf) {
416 el = mazeelCreate(x - 1, y, 0);
428 el = mazeelCreate(x, y - 1, 0);
440 el = mazeelCreate(x + 1, y, 0);
452 el = mazeelCreate(x, y + 1, 0);
460 lqueueDestroy(&lq, TRUE);
465 pixd = pixUnpackBinary(pixs, 32, 1);
468 composeRGBPixel(255, 0, 0, &rpixel);
469 composeRGBPixel(0, 255, 0, &gpixel);
470 composeRGBPixel(0, 0, 255, &bpixel);
473 L_INFO(
" Path found\n", __func__);
479 if (x == xi && y == yi)
482 pixSetPixel(pixd, x, y, gpixel);
483 pixGetPixel(pixp, x, y, &val);
484 if (val == DIR_NORTH)
486 else if (val == DIR_SOUTH)
488 else if (val == DIR_EAST)
490 else if (val == DIR_WEST)
494 L_INFO(
" No path found\n", __func__);
496 lined32 = pixGetLinePtrs(pixd, NULL);
497 for (i = 0; i < h; i++) {
498 for (j = 0; j < w; j++) {
507 pixSetPixel(pixd, xi, yi, rpixel);
508 pixSetPixel(pixd, xf, yf, bpixel);
532l_int32 x, y, w, h, r, i, j;
537 pixGetPixel(pix, x, y, &val);
538 if (val == 0)
return 0;
543 pixGetDimensions(pix, &w, &h, NULL);
544 for (r = 1; r < maxrad; r++) {
545 for (i = -r; i <= r; i++) {
546 if (y + i < 0 || y + i >= h)
548 for (j = -r; j <= r; j++) {
549 if (x + j < 0 || x + j >= w)
551 if (L_ABS(i) != r && L_ABS(j) != r)
553 pixGetPixel(pix, x + j, y + i, &val);
732l_int32 x, y, w, h, d;
733l_uint32 val, valr, vals, rpixel, gpixel, bpixel;
734void **lines8, **liner32, **linep8;
735l_int32 cost, dist, distparent, sival, sivals;
744 if (ppixd) *ppixd = NULL;
746 return (
PTA *)ERROR_PTR(
"pixs not defined", __func__, NULL);
747 pixGetDimensions(pixs, &w, &h, &d);
748 if (w < 50 || h < 50)
749 return (
PTA *)ERROR_PTR(
"too small: w and h not >= 50", __func__, NULL);
751 return (
PTA *)ERROR_PTR(
"pixs not 8 bpp", __func__, NULL);
752 if (xi <= 0 || xi >= w)
753 return (
PTA *)ERROR_PTR(
"xi not valid", __func__, NULL);
754 if (yi <= 0 || yi >= h)
755 return (
PTA *)ERROR_PTR(
"yi not valid", __func__, NULL);
760 pixr = pixCreate(w, h, 32);
762 pixp = pixCreate(w, h, 8);
763 lines8 = pixGetLinePtrs(pixs, NULL);
764 linep8 = pixGetLinePtrs(pixp, NULL);
765 liner32 = pixGetLinePtrs(pixr, NULL);
769 pixGetPixel(pixs, xi, yi, &val);
770 el = mazeelCreate(xi, yi, 0);
772 pixGetPixel(pixs, xi, yi, &val);
774 pixSetPixel(pixr, xi, yi, 0);
781 while (lheapGetCount(lh) > 0) {
782 elp = (
MAZEEL *)lheapRemove(lh);
784 L_ERROR(
"heap broken!!\n", __func__);
789 if (x == xf && y == yf) {
793 distparent = (l_int32)elp->distance;
800 sivals = (l_int32)vals;
801 cost = 1 + L_ABS(sivals - sival);
802 dist = distparent + cost;
806 el = mazeelCreate(x - 1, y, 0);
815 sivals = (l_int32)vals;
816 cost = 1 + L_ABS(sivals - sival);
817 dist = distparent + cost;
821 el = mazeelCreate(x, y - 1, 0);
830 sivals = (l_int32)vals;
831 cost = 1 + L_ABS(sivals - sival);
832 dist = distparent + cost;
836 el = mazeelCreate(x + 1, y, 0);
845 sivals = (l_int32)vals;
846 cost = 1 + L_ABS(sivals - sival);
847 dist = distparent + cost;
851 el = mazeelCreate(x, y + 1, 0);
860 lheapDestroy(&lh, TRUE);
863 pixd = pixConvert8To32(pixs);
866 composeRGBPixel(255, 0, 0, &rpixel);
867 composeRGBPixel(0, 255, 0, &gpixel);
868 composeRGBPixel(0, 0, 255, &bpixel);
875 if (x == xi && y == yi)
878 pixSetPixel(pixd, x, y, gpixel);
879 pixGetPixel(pixp, x, y, &val);
880 if (val == DIR_NORTH)
882 else if (val == DIR_SOUTH)
884 else if (val == DIR_EAST)
886 else if (val == DIR_WEST)
888 pixGetPixel(pixr, x, y, &val);
891 lept_stderr(
"(x,y) = (%d, %d); dist = %d\n", x, y, val);
896 pixSetPixel(pixd, xi, yi, rpixel);
897 pixSetPixel(pixd, xf, yf, bpixel);
901 lheapDestroy(&lh, TRUE);