1
0
lpo-image-processing/09/do_sprawdzenia/cpp/map_horizon.cpp
2021-04-06 23:29:35 +02:00

84 lines
2.0 KiB
C++

#include "map_horizon.h"
#include "map_height.h"
MapHorizon::MapHorizon(PNM* img) :
Transformation(img)
{
}
MapHorizon::MapHorizon(PNM* img, ImageViewer* iv) :
Transformation(img, iv)
{
}
PNM* MapHorizon::transform()
{
int width = image->width(),
height = image->height();
double scale = getParameter("scale").toDouble();
int sun_alpha = getParameter("alpha").toInt();
int dx, dy;
switch (getParameter("direction").toInt())
{
case NORTH: dx = 0; dy = -1; break;
case SOUTH: dx = 0; dy = 1; break;
case EAST: dx = 1; dy = 0; break;
case WEST: dx = -1; dy = 0; break;
default:
qWarning() << "Unknown direction!";
dx = 0;
dy = -1;
}
PNM* newImage = new PNM(width, height, image->format());
MapHeight* mapHeight = new MapHeight(image);
image = mapHeight->transform();
for (int i = 0; i < width; i++)
{
for (int j = 0; j < height; j++)
{
double alpha = 0;
int current_h = qGray(image->pixel(i, j));
for (int k = i + dx, l = j + dy; k < width && l < height && k >= 0 && l >= 0; k = k + dx, l = l + dy)
{
int ray_h = qGray(image->pixel(k, l));
if (current_h < ray_h)
{
double dist = sqrt(pow(k - i, 2) + pow(l - j, 2)) * scale;
double ray_alpha = atan((ray_h - current_h) / dist);
if (ray_alpha > alpha)
{
alpha = ray_alpha;
}
}
}
double delta = alpha - sun_alpha * M_PI / 180;
if (delta > 0)
{
double val = cos(delta) * 255;
QColor color = QColor(val, val, val);
newImage->setPixel(i, j, color.rgb());
}
else
{
QColor color = QColor(255, 255, 255);
newImage->setPixel(i, j, color.rgb());
}
}
}
return newImage;
}