/*
* Copyright 2010-2016 OpenXcom Developers.
*
* This file is part of OpenXcom.
*
* OpenXcom 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 3 of the License, or
* (at your option) any later version.
*
* OpenXcom 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 OpenXcom. If not, see .
*/
#include "Polygon.h"
#include "../fmath.h"
namespace OpenXcom
{
/**
* Initializes the polygon with arrays to store each point's coordinates.
* @param points Number of points.
*/
Polygon::Polygon(int points) : _points(points), _texture(0)
{
_lat = new double[_points];
_lon = new double[_points];
_x = new Sint16[_points];
_y = new Sint16[_points];
for (int i = 0; i < _points; ++i)
{
_lat[i] = 0.0;
_lon[i] = 0.0;
_x[i] = 0;
_y[i] = 0;
}
}
/**
* Performs a deep copy of an existing polygon.
* @param other Polygon to copy from.
*/
Polygon::Polygon(const Polygon& other)
{
_points = other._points;
_lat = new double[_points];
_lon = new double[_points];
_x = new Sint16[_points];
_y = new Sint16[_points];
for (int i = 0; i < _points; ++i)
{
_lat[i] = other._lat[i];
_lon[i] = other._lon[i];
_x[i] = other._x[i];
_y[i] = other._y[i];
}
_texture = other._texture;
}
/**
* Deletes the arrays from memory.
*/
Polygon::~Polygon()
{
delete[] _lat;
delete[] _lon;
delete[] _x;
delete[] _y;
}
/**
* Loads the polygon from a YAML file.
* @param node YAML node.
*/
void Polygon::load(const YAML::Node &node)
{
delete[] _lat;
delete[] _lon;
delete[] _x;
delete[] _y;
std::vector coords = node.as< std::vector >();
_points = (coords.size() - 1) / 2;
_lat = new double[_points];
_lon = new double[_points];
_x = new Sint16[_points];
_y = new Sint16[_points];
_texture = coords[0];
for (size_t i = 1; i < coords.size(); i += 2)
{
size_t j = (i - 1) / 2;
_lon[j] = coords[i] * M_PI / 180;
_lat[j] = coords[i+1] * M_PI / 180;
_x[j] = 0;
_y[j] = 0;
}
}
/**
* Returns the latitude of a given point.
* @param i Point number (0-max).
* @return Point's latitude.
*/
double Polygon::getLatitude(int i) const
{
return _lat[i];
}
/**
* Changes the latitude of a given point.
* @param i Point number (0-max).
* @param lat Point's latitude.
*/
void Polygon::setLatitude(int i, double lat)
{
_lat[i] = lat;
}
/**
* Returns the longitude of a given point.
* @param i Point number (0-max).
* @return Point's longitude.
*/
double Polygon::getLongitude(int i) const
{
return _lon[i];
}
/**
* Changes the latitude of a given point.
* @param i Point number (0-max).
* @param lon Point's longitude.
*/
void Polygon::setLongitude(int i, double lon)
{
_lon[i] = lon;
}
/**
* Returns the X coordinate of a given point.
* @param i Point number (0-max).
* @return Point's X coordinate.
*/
Sint16 Polygon::getX(int i) const
{
return _x[i];
}
/**
* Changes the X coordinate of a given point.
* @param i Point number (0-max).
* @param x Point's X coordinate.
*/
void Polygon::setX(int i, Sint16 x)
{
_x[i] = x;
}
/**
* Returns the Y coordinate of a given point.
* @param i Point number (0-max).
* @return Point's Y coordinate.
*/
Sint16 Polygon::getY(int i) const
{
return _y[i];
}
/**
* Changes the Y coordinate of a given point.
* @param i Point number (0-max).
* @param y Point's Y coordinate.
*/
void Polygon::setY(int i, Sint16 y)
{
_y[i] = y;
}
/**
* Returns the texture used to draw the polygon
* (textures are stored in a set).
* @return Texture sprite number.
*/
int Polygon::getTexture() const
{
return _texture;
}
/**
* Changes the texture used to draw the polygon.
* @param tex Texture sprite number.
*/
void Polygon::setTexture(int tex)
{
_texture = tex;
}
/**
* Returns the number of points (vertexes) that make up the polygon.
* @return Number of points.
*/
int Polygon::getPoints() const
{
return _points;
}
}