|
Packit |
78deda |
/* pbmminkowsky.c - read a portable bitmap and calculate the Minkowski Integrals
|
|
Packit |
78deda |
**
|
|
Packit |
78deda |
** Copyright (C) 2000 by Luuk van Dijk/Mind over Matter
|
|
Packit |
78deda |
**
|
|
Packit |
78deda |
** Based on pbmlife.c,
|
|
Packit |
78deda |
** Copyright (C) 1988,1 1991 by Jef Poskanzer.
|
|
Packit |
78deda |
**
|
|
Packit |
78deda |
** Permission to use, copy, modify, and distribute this software and its
|
|
Packit |
78deda |
** documentation for any purpose and without fee is hereby granted, provided
|
|
Packit |
78deda |
** that the above copyright notice appear in all copies and that both that
|
|
Packit |
78deda |
** copyright notice and this permission notice appear in supporting
|
|
Packit |
78deda |
** documentation. This software is provided "as is" without express or
|
|
Packit |
78deda |
** implied warranty.
|
|
Packit |
78deda |
*/
|
|
Packit |
78deda |
|
|
Packit |
78deda |
#include "pbm.h"
|
|
Packit |
78deda |
|
|
Packit |
78deda |
#define ISWHITE(x) ((x) == PBM_WHITE)
|
|
Packit |
78deda |
|
|
Packit |
78deda |
|
|
Packit |
78deda |
int main(int argc, const char ** argv) {
|
|
Packit |
78deda |
|
|
Packit |
78deda |
FILE * ifP;
|
|
Packit |
78deda |
|
|
Packit |
78deda |
bit * prevrow;
|
|
Packit |
78deda |
bit * thisrow;
|
|
Packit |
78deda |
bit * tmprow;
|
|
Packit |
78deda |
|
|
Packit |
78deda |
int row;
|
|
Packit |
78deda |
int col;
|
|
Packit |
78deda |
|
|
Packit |
78deda |
int countTile;
|
|
Packit |
78deda |
int countEdgeX;
|
|
Packit |
78deda |
int countEdgeY;
|
|
Packit |
78deda |
int countVertex;
|
|
Packit |
78deda |
|
|
Packit |
78deda |
int rows;
|
|
Packit |
78deda |
int cols;
|
|
Packit |
78deda |
int format;
|
|
Packit |
78deda |
|
|
Packit |
78deda |
int area, perimeter, eulerchi;
|
|
Packit |
78deda |
|
|
Packit |
78deda |
|
|
Packit |
78deda |
pm_proginit(&argc, argv);
|
|
Packit |
78deda |
|
|
Packit |
78deda |
if (argc > 2)
|
|
Packit |
78deda |
pm_usage("[pbmfile]");
|
|
Packit |
78deda |
|
|
Packit |
78deda |
if (argc == 2)
|
|
Packit |
78deda |
ifP = pm_openr(argv[1]);
|
|
Packit |
78deda |
else
|
|
Packit |
78deda |
ifP = stdin;
|
|
Packit |
78deda |
|
|
Packit |
78deda |
pbm_readpbminit(ifP, &cols, &rows, &format);
|
|
Packit |
78deda |
|
|
Packit |
78deda |
prevrow = pbm_allocrow(cols);
|
|
Packit |
78deda |
thisrow = pbm_allocrow(cols);
|
|
Packit |
78deda |
|
|
Packit |
78deda |
|
|
Packit |
78deda |
/* first row */
|
|
Packit |
78deda |
|
|
Packit |
78deda |
pbm_readpbmrow(ifP, thisrow, cols, format);
|
|
Packit |
78deda |
|
|
Packit |
78deda |
countTile = 0;
|
|
Packit |
78deda |
countEdgeX = 0;
|
|
Packit |
78deda |
countEdgeY = 0;
|
|
Packit |
78deda |
countVertex = 0;
|
|
Packit |
78deda |
|
|
Packit |
78deda |
/* tiles */
|
|
Packit |
78deda |
|
|
Packit |
78deda |
for (col = 0; col < cols; ++col)
|
|
Packit |
78deda |
if (ISWHITE(thisrow[col]))
|
|
Packit |
78deda |
++countTile;
|
|
Packit |
78deda |
|
|
Packit |
78deda |
/* shortcut: for the first row, edgeY == countTile */
|
|
Packit |
78deda |
countEdgeY = countTile;
|
|
Packit |
78deda |
|
|
Packit |
78deda |
/* x-edges */
|
|
Packit |
78deda |
|
|
Packit |
78deda |
if (ISWHITE(thisrow[0]))
|
|
Packit |
78deda |
++countEdgeX;
|
|
Packit |
78deda |
|
|
Packit |
78deda |
for (col = 0; col < cols-1; ++col)
|
|
Packit |
78deda |
if (ISWHITE(thisrow[col]) || ISWHITE(thisrow[col+1]))
|
|
Packit |
78deda |
++countEdgeX;
|
|
Packit |
78deda |
|
|
Packit |
78deda |
if (ISWHITE(thisrow[cols-1]))
|
|
Packit |
78deda |
++countEdgeX;
|
|
Packit |
78deda |
|
|
Packit |
78deda |
/* shortcut: for the first row, countVertex == countEdgeX */
|
|
Packit |
78deda |
|
|
Packit |
78deda |
countVertex = countEdgeX;
|
|
Packit |
78deda |
|
|
Packit |
78deda |
|
|
Packit |
78deda |
for (row = 1; row < rows; ++row) {
|
|
Packit |
78deda |
|
|
Packit |
78deda |
tmprow = prevrow;
|
|
Packit |
78deda |
prevrow = thisrow;
|
|
Packit |
78deda |
thisrow = tmprow;
|
|
Packit |
78deda |
|
|
Packit |
78deda |
pbm_readpbmrow(ifP, thisrow, cols, format);
|
|
Packit |
78deda |
|
|
Packit |
78deda |
/* tiles */
|
|
Packit |
78deda |
|
|
Packit |
78deda |
for (col = 0; col < cols; ++col)
|
|
Packit |
78deda |
if (ISWHITE(thisrow[col]))
|
|
Packit |
78deda |
++countTile;
|
|
Packit |
78deda |
|
|
Packit |
78deda |
/* y-edges */
|
|
Packit |
78deda |
|
|
Packit |
78deda |
for (col = 0; col < cols; ++col)
|
|
Packit |
78deda |
if (ISWHITE(thisrow[col]) || ISWHITE(prevrow[col]))
|
|
Packit |
78deda |
++countEdgeY;
|
|
Packit |
78deda |
|
|
Packit |
78deda |
/* x-edges */
|
|
Packit |
78deda |
|
|
Packit |
78deda |
if (ISWHITE(thisrow[0]))
|
|
Packit |
78deda |
++countEdgeX;
|
|
Packit |
78deda |
|
|
Packit |
78deda |
for (col = 0; col < cols-1; ++col)
|
|
Packit |
78deda |
if (ISWHITE(thisrow[col]) || ISWHITE(thisrow[col+1]))
|
|
Packit |
78deda |
++countEdgeX;
|
|
Packit |
78deda |
|
|
Packit |
78deda |
if (ISWHITE(thisrow[cols-1]))
|
|
Packit |
78deda |
++countEdgeX;
|
|
Packit |
78deda |
|
|
Packit |
78deda |
/* vertices */
|
|
Packit |
78deda |
|
|
Packit |
78deda |
if (ISWHITE(thisrow[0]) || ISWHITE(prevrow[0]))
|
|
Packit |
78deda |
++countVertex;
|
|
Packit |
78deda |
|
|
Packit |
78deda |
for (col = 0; col < cols-1; ++col)
|
|
Packit |
78deda |
if (ISWHITE(thisrow[col]) || ISWHITE(thisrow[col+1])
|
|
Packit |
78deda |
|| ISWHITE(prevrow[col]) || ISWHITE(prevrow[col+1]))
|
|
Packit |
78deda |
++countVertex;
|
|
Packit |
78deda |
|
|
Packit |
78deda |
if (ISWHITE(thisrow[cols-1]) || ISWHITE(prevrow[cols-1]))
|
|
Packit |
78deda |
++countVertex;
|
|
Packit |
78deda |
|
|
Packit |
78deda |
|
|
Packit |
78deda |
} /* for row */
|
|
Packit |
78deda |
|
|
Packit |
78deda |
/* now thisrow contains the top row*/
|
|
Packit |
78deda |
/* tiles and x-edges have been counted, now y-edges and top
|
|
Packit |
78deda |
vertices remain
|
|
Packit |
78deda |
*/
|
|
Packit |
78deda |
|
|
Packit |
78deda |
|
|
Packit |
78deda |
/* y-edges */
|
|
Packit |
78deda |
|
|
Packit |
78deda |
for (col = 0; col < cols; ++col)
|
|
Packit |
78deda |
if (ISWHITE(thisrow[col]))
|
|
Packit |
78deda |
++countEdgeY;
|
|
Packit |
78deda |
|
|
Packit |
78deda |
/* vertices */
|
|
Packit |
78deda |
|
|
Packit |
78deda |
if (ISWHITE(thisrow[0]))
|
|
Packit |
78deda |
++countVertex;
|
|
Packit |
78deda |
|
|
Packit |
78deda |
for (col = 0; col < cols-1; ++col)
|
|
Packit |
78deda |
if (ISWHITE(thisrow[col]) || ISWHITE(thisrow[col+1]))
|
|
Packit |
78deda |
++countVertex;
|
|
Packit |
78deda |
|
|
Packit |
78deda |
if (ISWHITE(thisrow[cols-1]))
|
|
Packit |
78deda |
++countVertex;
|
|
Packit |
78deda |
|
|
Packit |
78deda |
/* cleanup */
|
|
Packit |
78deda |
|
|
Packit |
78deda |
pm_close(ifP);
|
|
Packit |
78deda |
|
|
Packit |
78deda |
/* print results */
|
|
Packit |
78deda |
|
|
Packit |
78deda |
printf(" tiles:\t%d\n x-edges:\t%d\n y-edges:\t%d\nvertices:\t%d\n",
|
|
Packit |
78deda |
countTile, countEdgeX, countEdgeY,countVertex);
|
|
Packit |
78deda |
|
|
Packit |
78deda |
area = countTile;
|
|
Packit |
78deda |
perimeter = 2*countEdgeX + 2*countEdgeY - 4*countTile;
|
|
Packit |
78deda |
eulerchi = countTile - countEdgeX - countEdgeY + countVertex;
|
|
Packit |
78deda |
|
|
Packit |
78deda |
printf(" area:\t%d\nperimeter:\t%d\n eulerchi:\t%d\n",
|
|
Packit |
78deda |
area, perimeter, eulerchi );
|
|
Packit |
78deda |
|
|
Packit |
78deda |
return 0;
|
|
Packit |
78deda |
}
|
|
Packit |
78deda |
|