Files
secondo/Algebras/GIS/getValues.h
2026-01-23 17:03:45 +08:00

655 lines
20 KiB
C++

/*
This file is part of SECONDO.
Copyright (C) 2011, University in Hagen, Department of Computer Science,
Database Systems for New Applications.
SECONDO is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
SECONDO is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with SECONDO; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/*
Tile includes
*/
#include "../Tile/t/tint.h"
#include "../Tile/t/treal.h"
/*
declaration of namespace GISAlgebra
*/
namespace GISAlgebra {
/*
Method GetValues reads the values for 3x3 cells
parameters: a - reference to top left cell \\
b - reference to top middle cell \\
c - reference to top right cell \\
d - reference to middle left cell \\
e - reference to middle middle cell \\
f - reference to middle right cell \\
g - reference to bottom left cell \\
h - reference to bottom middle cell \\
i - reference to bottom right cell \\
row - number of current row \\
column - number of current column \\
currentTuple - number of current tuple \\
s\_in - current tuple \\
maxX - maximum X in a tuple \\
maxY - maximum Y in a tuple \\
factorNext - if vector current and next have different start points \\
factorlast - if vector current and last have different start points \\
skipNextRow - if difference between next and current is more
than one tile \\
skipLastRow - if difference between last and current is more
than one tile \\
current - current vector \\
next - next vector \\
last - last vector \\
currentSize - size of current vector \\
nextSize - size of next vector \\
lastSize - size of last vector \\
return value: -
exceptions: -
*/
template <typename T, typename SourceTypeProperties>
void GetValues(double* a, double* b, double* c, double* d, double* e,
double* f, double* g, double* h, double* i,
int row, int column, int currentTuple, T* s_in,
int maxX, int maxY,
int factorNext, int factorLast,
bool skipNextRow, bool skipLastRow,
std::vector<Tuple*> current, std::vector<Tuple*> next,
std::vector<Tuple*> last,
int currentSize, int nextSize, int lastSize)
{
Tuple* tuple_help;
T* s_in_help;
// left lower corner
if ((column == 0) && (row == 0))
{
if (currentTuple > 0)
{
tuple_help = current[currentTuple - 1];
if ((tuple_help != 0) && (tuple_help->GetNoAttributes() == 1))
{
s_in_help = static_cast<T*>(tuple_help->GetAttribute(0));
*a = s_in_help->GetValue((int[]){maxX, 1});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*a))
{*a = *e;}
*d = s_in_help->GetValue((int[]){maxX, 0});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*d))
{*d = *e;}
}
else
{
*a = *d = *e;
}
}
else
{
*a = *d = *e;
}
*b = s_in->GetValue((int[]){column, row + 1});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*b)){*b = *e;}
*c = s_in->GetValue((int[]){column + 1, row + 1});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*c)){*c = *e;}
*f = s_in->GetValue((int[]){column + 1, row});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*f)){*f = *e;}
if ((lastSize > 0) && (skipLastRow == false))
{
if ((currentTuple + factorLast > 0) &&
(currentTuple + factorLast - 1 < lastSize))
{
tuple_help = last[currentTuple - 1 + factorLast];
if ((tuple_help != 0) && (tuple_help->GetNoAttributes() == 1))
{
s_in_help = static_cast<T*>(tuple_help->GetAttribute(0));
*g = s_in_help->GetValue((int[]){maxX, maxY});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*g))
{*g = *e;}
}
else
{
*g = *e;
}
}
else
{
*g = *e;
}
if ((currentTuple + factorLast >= 0) &&
(currentTuple + factorLast < lastSize))
{
tuple_help = last[currentTuple + factorLast];
if ((tuple_help != 0) && (tuple_help->GetNoAttributes() == 1))
{
s_in_help = static_cast<T*>(tuple_help->GetAttribute(0));
*h = s_in_help->GetValue((int[]){0, maxY});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*h))
{*h = *e;}
*i = s_in_help->GetValue((int[]){1, maxY});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*i))
{*i = *e;}
}
else
{
*h = *i = *e;
}
}
else
{
*h = *i = *e;
}
}
else
{
*g = *h = *i = *e;
}
}
// left upper corner
else if ((column == 0) && (row == maxY))
{
if ((nextSize > 0) && (skipNextRow == false))
{
if ((currentTuple + factorNext > 0) &&
(currentTuple + factorNext - 1 < nextSize))
{
tuple_help = next[currentTuple - 1 + factorNext];
if ((tuple_help != 0) && (tuple_help->GetNoAttributes() == 1))
{
s_in_help = static_cast<T*>(tuple_help->GetAttribute(0));
*a = s_in_help->GetValue((int[]){maxX, 0});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*a))
{*a = *e;}
}
else
{
*a = *e;
}
}
else
{
*a = *e;
}
if ((currentTuple + factorNext >= 0) &&
(currentTuple + factorNext < nextSize))
{
tuple_help = next[currentTuple + factorNext];
if ((tuple_help != 0) && (tuple_help->GetNoAttributes() == 1))
{
s_in_help = static_cast<T*>(tuple_help->GetAttribute(0));
*b = s_in_help->GetValue((int[]){0, 0});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*b))
{*b = *e;}
*c = s_in_help->GetValue((int[]){1, 0});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*c))
{*c = *e;}
}
else
{
*b = *c = *e;
}
}
else
{
*b = *c = *e;
}
}
else
{
*a = *b = *c = *e;
}
if (currentTuple > 0)
{
tuple_help = current[currentTuple - 1];
if ((tuple_help != 0) && (tuple_help->GetNoAttributes() == 1))
{
s_in_help = static_cast<T*>(tuple_help->GetAttribute(0));
*d = s_in_help->GetValue((int[]){maxX, maxY});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*d))
{*d = *e;}
*g = s_in_help->GetValue((int[]){maxX, maxY - 1});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*g))
{*g = *e;}
}
else
{
*d = *g = *e;
}
}
else
{
*d = *g = *e;
}
*f = s_in->GetValue((int[]){column + 1, row});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*f)){*f = *e;}
*h = s_in->GetValue((int[]){column, row - 1});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*h)){*h = *e;}
*i = s_in->GetValue((int[]){column + 1, row - 1});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*i)){*i = *e;}
}
// right lower corner
else if ((column == maxX) && (row == 0))
{
*a = s_in->GetValue((int[]){column - 1, row + 1});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*a)){*a = *e;}
*b = s_in->GetValue((int[]){column, row + 1});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*b)){*b = *e;}
*d = s_in->GetValue((int[]){column - 1, row});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*d)){*d = *e;}
if (currentTuple + 1 < currentSize)
{
tuple_help = current[currentTuple + 1];
if ((tuple_help != 0) && (tuple_help->GetNoAttributes() == 1))
{
s_in_help = static_cast<T*>(tuple_help->GetAttribute(0));
*c = s_in_help->GetValue((int[]){0, 1});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*c))
{*c = *e;}
*f = s_in_help->GetValue((int[]){0, 0});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*f))
{*f = *e;}
}
else
{
*c = *f = *e;
}
}
else
{
*c = *f = *e;
}
if ((lastSize > 0) && (skipLastRow == false))
{
if ((currentTuple + factorLast >= 0) &&
(currentTuple + factorLast < lastSize))
{
tuple_help = last[currentTuple + factorLast];
if ((tuple_help != 0) && (tuple_help->GetNoAttributes() == 1))
{
s_in_help = static_cast<T*>(tuple_help->GetAttribute(0));
*g = s_in_help->GetValue((int[]){maxX - 1, maxY});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*g))
{*g = *e;}
*h = s_in_help->GetValue((int[]){maxX, maxY});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*h))
{*h = *e;}
}
else
{
*g = *h = *e;
}
}
else
{
*g = *h = *e;
}
if ((currentTuple + factorLast >= 0) &&
(currentTuple + factorLast + 1 < lastSize))
{
tuple_help = last[currentTuple + 1 + factorLast];
if ((tuple_help != 0) && (tuple_help->GetNoAttributes() == 1))
{
s_in_help = static_cast<T*>(tuple_help->GetAttribute(0));
*i = s_in_help->GetValue((int[]){0, maxY});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*i))
{*i = *e;}
}
else
{
*i = *e;
}
}
else
{
*i = *e;
}
}
else
{
*g = *h = *i = *e;
}
}
// right upper corner
else if ((column == maxX) && (row == maxY))
{
if ((nextSize > 0) && (skipNextRow == false))
{
if ((currentTuple + factorNext >= 0) &&
(currentTuple + factorNext < nextSize))
{
tuple_help = next[currentTuple + factorNext];
if ((tuple_help != 0) && (tuple_help->GetNoAttributes() == 1))
{
s_in_help = static_cast<T*>(tuple_help->GetAttribute(0));
*a = s_in_help->GetValue((int[]){maxX - 1, 0});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*a))
{*a = *e;}
*b = s_in_help->GetValue((int[]){maxX, 0});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*b))
{*b = *e;}
}
else
{
*a = *b = *e;
}
}
else
{
*a = *b = *e;
}
if ((currentTuple + factorNext >= 0) &&
(currentTuple + factorNext + 1 < nextSize))
{
tuple_help = next[currentTuple + 1 + factorNext];
if ((tuple_help != 0) && (tuple_help->GetNoAttributes() == 1))
{
s_in_help = static_cast<T*>(tuple_help->GetAttribute(0));
*c = s_in_help->GetValue((int[]){0, 0});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*c))
{*c = *e;}
}
else
{
*c = *e;
}
}
else
{
*c = *e;
}
}
else
{
*a = *b = *c = *e;
}
*d = s_in->GetValue((int[]){column - 1, row});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*d)){*d = *e;}
*g = s_in->GetValue((int[]){column - 1, row - 1});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*g)){*g = *e;}
*h = s_in->GetValue((int[]){column, row - 1});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*h)){*h = *e;}
if (currentTuple + 1 < currentSize)
{
tuple_help = current[currentTuple + 1];
if ((tuple_help != 0) && (tuple_help->GetNoAttributes() == 1))
{
s_in_help = static_cast<T*>(tuple_help->GetAttribute(0));
*f = s_in_help->GetValue((int[]){0, maxY});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*f))
{*f = *e;}
*i = s_in_help->GetValue((int[]){0, maxY - 1});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*i))
{*i = *e;}
}
else
{
*f = *i = *e;
}
}
else
{
*f = *i = *e;
}
}
// left column
else if (column == 0)
{
*b = s_in->GetValue((int[]){column, row + 1});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*b)){*b = *e;}
*c = s_in->GetValue((int[]){column + 1, row + 1});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*c)){*c = *e;}
*f = s_in->GetValue((int[]){column + 1, row});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*f)){*f = *e;}
*h = s_in->GetValue((int[]){column, row - 1});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*h)){*h = *e;}
*i = s_in->GetValue((int[]){column + 1, row - 1});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*i)){*i = *e;}
if (currentTuple > 0)
{
tuple_help = current[currentTuple - 1];
if ((tuple_help != 0) && (tuple_help->GetNoAttributes() == 1))
{
s_in_help = static_cast<T*>(tuple_help->GetAttribute(0));
*a = s_in_help->GetValue((int[]){maxX, row + 1});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*a))
{*a = *e;}
*d = s_in_help->GetValue((int[]){maxX, row});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*d))
{*d = *e;}
*g = s_in_help->GetValue((int[]){maxX, row - 1});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*g))
{*g = *e;}
}
else
{
*a = *d = *g = *e;
}
}
else
{
*a = *d = *g = *e;
}
}
// lower row
else if (row == 0)
{
*a = s_in->GetValue((int[]){column - 1, row + 1});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*a)){*a = *e;}
*b = s_in->GetValue((int[]){column, row + 1});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*b)){*b = *e;}
*c = s_in->GetValue((int[]){column + 1, row + 1});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*c)){*c = *e;}
*d = s_in->GetValue((int[]){column - 1, row});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*d)){*d = *e;}
*f = s_in->GetValue((int[]){column + 1, row});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*f)){*f = *e;}
if ((lastSize > 0) && (skipLastRow == false))
{
if ((currentTuple + factorLast >= 0) &&
(currentTuple + factorLast < lastSize))
{
tuple_help = last[currentTuple + factorLast];
if ((tuple_help != 0) && (tuple_help->GetNoAttributes() == 1))
{
s_in_help = static_cast<T*>(tuple_help->GetAttribute(0));
*g = s_in_help->GetValue((int[]){column - 1, maxY});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*g))
{*g = *e;}
*h = s_in_help->GetValue((int[]){column, maxY});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*h))
{*h = *e;}
*i = s_in_help->GetValue((int[]){column + 1, maxY});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*i))
{*i = *e;}
}
else
{
*g = *h = *i = *e;
}
}
else
{
*g = *h = *i = *e;
}
}
else
{
*g = *h = *i = *e;
}
}
// right column
else if (column == maxX)
{
*a = s_in->GetValue((int[]){column - 1, row + 1});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*a)){*a = *e;}
*b = s_in->GetValue((int[]){column, row + 1});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*b)){*b = *e;}
*d = s_in->GetValue((int[]){column - 1, row});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*d)){*d = *e;}
*g = s_in->GetValue((int[]){column - 1, row - 1});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*g)){*g = *e;}
*h = s_in->GetValue((int[]){column, row - 1});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*h)){*h = *e;}
if (currentTuple + 1 < currentSize)
{
tuple_help = current[currentTuple + 1];
if ((tuple_help != 0) && (tuple_help->GetNoAttributes() == 1))
{
s_in_help = static_cast<T*>(tuple_help->GetAttribute(0));
*c = s_in_help->GetValue((int[]){0, row + 1});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*c))
{*c = *e;}
*f = s_in_help->GetValue((int[]){0, row});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*f))
{*f = *e;}
*i = s_in_help->GetValue((int[]){0, row - 1});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*i))
{*i = *e;}
}
else
{
*c = *f = *i = *e;
}
}
else
{
*c = *f = *i = *e;
}
}
// upper row
else if (row == maxY)
{
*d = s_in->GetValue((int[]){column - 1, row});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*d)){*d = *e;}
*f = s_in->GetValue((int[]){column + 1, row});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*f)){*f = *e;}
*g = s_in->GetValue((int[]){column - 1, row - 1});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*g)){*g = *e;}
*h = s_in->GetValue((int[]){column, row - 1});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*h)){*h = *e;}
*i = s_in->GetValue((int[]){column + 1, row - 1});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*i)){*i = *e;}
if ((nextSize > 0) && (skipNextRow == false))
{
if ((currentTuple + factorNext >= 0) &&
(currentTuple + factorNext < nextSize))
{
tuple_help = next[currentTuple + factorNext];
if ((tuple_help != 0) && (tuple_help->GetNoAttributes() == 1))
{
s_in_help = static_cast<T*>(tuple_help->GetAttribute(0));
*a = s_in_help->GetValue((int[]){column - 1, 0});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*a))
{*a = *e;}
*b = s_in_help->GetValue((int[]){column, 0});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*b))
{*b = *e;}
*c = s_in_help->GetValue((int[]){column + 1, 0});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*c))
{*c = *e;}
}
else
{
*a = *b = *c = *e;
}
}
else
{
*a = *b = *c = *e;
}
}
else
{
*a = *b = *c = *e;
}
}
// no border cells
else
{
*a = s_in->GetValue((int[]){column - 1, row + 1});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*a)){*a = *e;}
*b = s_in->GetValue((int[]){column, row + 1});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*b)){*b = *e;}
*c = s_in->GetValue((int[]){column + 1, row + 1});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*c)){*c = *e;}
*d = s_in->GetValue((int[]){column - 1, row});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*d)){*d = *e;}
*f = s_in->GetValue((int[]){column + 1, row});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*f)){*f = *e;}
*g = s_in->GetValue((int[]){column - 1, row - 1});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*g)){*g = *e;}
*h = s_in->GetValue((int[]){column, row - 1});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*h)){*h = *e;}
*i = s_in->GetValue((int[]){column + 1, row - 1});
if (SourceTypeProperties::TypeProperties::IsUndefinedValue(*i)){*i = *e;}
}
}
}