Page.cc
author viric <viriketo@gmail.com>
Sun, 24 Apr 2011 18:47:28 +0200
changeset 2 5cdb891abc1e
parent 0 6b8091ca909a
permissions -rw-r--r--
Almenys faig que compili amb un g++ -I. -lnetpbm -o rektigi *.cc
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
     1
#include "Page.h" // Inclou pam.h
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
     2
#include "Bitmap.h"
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
     3
#include <stdio.h>
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
     4
#include <string.h>
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
     5
#include <math.h>
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
     6
#include "Errors.h"
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
     7
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
     8
Page::Page(const char *filename)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
     9
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    10
	map = NULL;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    11
	hist = NULL;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    12
	text = NULL;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    13
	readMap(filename);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    14
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    15
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    16
Page::~Page()
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    17
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    18
	delete map;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    19
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    20
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    21
void Page::readMap(const char *filename)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    22
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    23
	FILE *fp;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    24
	int i,j;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    25
	char *image; // FIXME: Good type
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    26
	tuple *tuplerow;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    27
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    28
	if (!strcmp(filename, "-"))
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    29
		fp = stdin;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    30
	else
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    31
		// FIXME: exception
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    32
		
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    33
		if(!(fp = fopen(filename,"r")))
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    34
			Errors::Fatal("Cannot open filename.");
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    35
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    36
	// Si existia un mapa, el borrem.
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    37
	if(map != NULL)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    38
		delete map;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    39
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    40
	pnm_readpaminit(fp, &pamImage, sizeof(pamImage));
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    41
	// FIXME: Read ok
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    42
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    43
	width = pamImage.width;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    44
	height = pamImage.height;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    45
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    46
	map = new Bitmap(width,height);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    47
	tuplerow = pnm_allocpamrow(&pamImage);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    48
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    49
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    50
	for (i=0; i<height; i++)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    51
	{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    52
		pnm_readpamrow(&pamImage, tuplerow);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    53
		for (j=0; j<width; j++)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    54
		{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    55
			// We only read the first sample (changing 0 and 1)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    56
			map->pixels[i][j] = tuplerow[j][0]?0:1;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    57
		}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    58
	}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    59
	pnm_freepamrow(tuplerow);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    60
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    61
	fclose(fp);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    62
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    63
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    64
void Page::writeMap(const char *filename) const
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    65
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    66
	pam outpam;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    67
	FILE *fp;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    68
	tuple *tuplerow;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    69
	int i,j;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    70
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    71
	outpam = pamImage;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    72
	outpam.width = width;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    73
	outpam.height = height;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    74
	
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    75
	fprintf(stderr,"Writting %s: w:%i,h:%i\n", filename, width, height);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    76
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    77
	if (!strcmp(filename, "-"))
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    78
		fp = stdout;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    79
	else
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    80
		// FIXME: exception
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    81
		
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    82
		if(!(fp = fopen(filename,"w")))
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    83
			Errors::Fatal("Cannot open filename.");
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    84
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    85
	outpam.file = fp;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    86
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    87
	pnm_writepaminit(&outpam);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    88
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    89
	tuplerow = pnm_allocpamrow(&outpam);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    90
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    91
	for (i=0; i<height; i++)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    92
	{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    93
		for (j=0; j<width; j++)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    94
		{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    95
			// We only write the first sample (changing 0 and 1)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    96
			tuplerow[j][0] = map->pixels[i][j]?0:1;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    97
		}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    98
		pnm_writepamrow(&outpam, tuplerow);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    99
	}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   100
	pnm_freepamrow(tuplerow);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   101
	
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   102
	fclose(fp);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   103
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   104
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   105
/*
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   106
static void Page::Initialize()
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   107
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   108
	pnm_init(NULL,NULL);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   109
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   110
*/
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   111
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   112
float Page::ratioBlackWhite() const
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   113
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   114
	int i,j;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   115
	float white=0, black=0;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   116
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   117
	for(i=0; i<height; i++)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   118
		for (j=0; j<width; j++)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   119
			if (map->pixels[i][j] == 0)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   120
				white++;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   121
			else
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   122
				black++;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   123
	return black/white;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   124
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   125
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   126
void Page::calcHistogram()
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   127
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   128
	if (hist!=NULL)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   129
		delete hist;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   130
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   131
	map->calcHistogram(hist);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   132
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   133
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   134
void Page::rotateMap(float angle)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   135
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   136
	Bitmap *newmap;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   137
	rotateMap(angle, newmap);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   138
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   139
	// Interchange maps: New -> Page's
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   140
	delete map;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   141
	map = newmap;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   142
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   143
	height = map->get_height();
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   144
	width = map->get_width();
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   145
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   146
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   147
void Page::rotateMap(float angle, Bitmap* &mapNew)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   148
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   149
	// Code taken from OCRchie
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   150
  int nx,ny,newheight,newwidth,oldheight,oldwidth,i,j,halfnewheight,halfnewwidth;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   151
  int halfoldheight,halfoldwidth;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   152
  double radians;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   153
  double cosval,sinval;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   154
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   155
  radians =  -(angle) / ((180 / 3.142));
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   156
  cosval = cos(radians);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   157
  sinval = sin(radians);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   158
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   159
  oldheight = height;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   160
  oldwidth = width;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   161
  
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   162
  newwidth = (int)abs((int)(oldwidth*cosval)) + (int)abs((int)(oldheight*sinval));
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   163
  newheight = (int)abs((int)(-oldwidth*sinval)) + (int)abs((int)(oldheight*cosval));
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   164
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   165
  halfnewheight = newheight / 2;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   166
  halfnewwidth = newwidth / 2;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   167
  halfoldwidth = oldwidth /2;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   168
  halfoldheight = oldheight /2 ;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   169
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   170
  int num_chars = (newwidth / 8) + 1;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   171
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   172
  mapNew = new Bitmap(newwidth,newheight);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   173
  mapNew->setToZero();
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   174
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   175
  for(i=0;i < newheight;i++)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   176
      {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   177
        for(j=0;j < newwidth;j++)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   178
            {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   179
              nx =(int)( (j - halfnewwidth)*cosval + (i-halfnewheight)*sinval);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   180
              ny =(int)( -((j - halfnewwidth)*sinval) + (i - halfnewheight)*cosval);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   181
              nx = nx + halfoldwidth;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   182
              ny = ny + halfoldheight;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   183
              if ((nx < oldwidth) && (ny < oldheight) && (nx > 0) && (ny > 0))
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   184
                {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   185
		    mapNew->pixels[i][j] = map->pixels[ny][nx];
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   186
                }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   187
              else
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   188
                  {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   189
		    mapNew->pixels[i][j] = 0;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   190
                  }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   191
            }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   192
      }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   193
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   194
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   195
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   196
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   197
void Page::tryAngles(float min, float max, float step)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   198
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   199
	float i;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   200
	float std_dev;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   201
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   202
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   203
	for(i=min; i<=max; i+=step)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   204
	{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   205
		std_dev = std_dev_lines_angle(i);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   206
		fprintf(stderr, "Angle: %f, Dev: %f\n", i,
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   207
			std_dev);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   208
	}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   209
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   210
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   211
float Page::std_dev_lines_angle(float angle)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   212
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   213
	float retval;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   214
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   215
	Bitmap *tmpmap;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   216
	Histogram *tmphist;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   217
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   218
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   219
	if (angle == 0)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   220
	{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   221
		map->calcHistogram(tmphist);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   222
	}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   223
	else
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   224
	{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   225
		rotateMap(angle,tmpmap);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   226
		tmpmap->calcHistogram(tmphist);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   227
		delete tmpmap;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   228
	}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   229
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   230
	retval = tmphist->get_std_dev();
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   231
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   232
	delete tmphist;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   233
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   234
	return retval;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   235
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   236
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   237
float Page::getSkew(int depth, float margin)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   238
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   239
	float x1,x2,x3;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   240
	float y1,y2,y3;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   241
	float newx, newy;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   242
	int i;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   243
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   244
	x1 = -margin;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   245
	x2 = 0;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   246
	x3 = margin;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   247
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   248
	/* Bret's Method */
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   249
	/*
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   250
	for (i=0; i<depth; i++)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   251
	{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   252
		y1 = std_dev_lines_angle(x1);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   253
		y2 = std_dev_lines_angle(x2);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   254
		y3 = std_dev_lines_angle(x3);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   255
		fprintf(stderr, "New stddevs: %f, %f, %f\n", y1, y2, y3);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   256
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   257
		newx = x2 - 0.5 * ((x2-x1)*(x2-x1) * (y2-y3) -
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   258
			(x2-x3)*(x2-x3) * (y2-y1)) /
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   259
			((x2-x1) * (y2-y3) - (x2-x3) * (y2-y1));
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   260
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   261
		// Comprovacions
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   262
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   263
		// Resultat
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   264
		if (newx > x1 && newx < x2)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   265
		{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   266
			x3 = x2;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   267
			x2 = newx;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   268
		}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   269
		else if (newx > x2 && newx < x3)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   270
		{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   271
			x1 = x2;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   272
			x2 = newx;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   273
		}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   274
		else
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   275
			Errors::Fatal("No convergence!");
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   276
		fprintf(stderr, "Nous punts: %f, %f, %f\n", x1,x2,x3);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   277
	}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   278
	*/
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   279
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   280
	/* Golden Slice */
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   281
	y1 = std_dev_lines_angle(x1);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   282
	y2 = std_dev_lines_angle(x2);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   283
	y3 = std_dev_lines_angle(x3);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   284
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   285
	for (i=0; i<depth; i++)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   286
	{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   287
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   288
		// Flanc esquerra
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   289
		newx = (x2+x1)/2;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   290
		newy = std_dev_lines_angle(newx);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   291
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   292
		// Resultat
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   293
		if (newy < y2 )
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   294
		{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   295
			x1 = newx;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   296
			y1 = newy;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   297
		}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   298
		else // newy < y2
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   299
		{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   300
			x3 = x2;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   301
			y3 = y2;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   302
			x2 = newx;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   303
			y2 = newy;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   304
		}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   305
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   306
		// Flanc dret
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   307
		newx = (x3+x2)/2;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   308
		newy = std_dev_lines_angle(newx);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   309
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   310
		// Resultat
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   311
		if (newy < y2 )
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   312
		{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   313
			x3 = newx;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   314
			y3 = newy;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   315
		}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   316
		else // newy < y2
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   317
		{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   318
			x1 = x2;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   319
			y1 = y2;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   320
			x2 = newx;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   321
			y2 = newy;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   322
		}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   323
		fprintf(stderr, "Nous punts: %f, %f, %f\n", x1,x2,x3);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   324
	}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   325
	return x2;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   326
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   327
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   328
void Page::getText()
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   329
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   330
	if (text == NULL)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   331
		text = new Text();
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   332
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   333
	text->getLines(map);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   334
}