00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include <cassert>
00024
00025
00026
00027
00028
00029
00030
00031 #include "util/log/logger.h"
00032
00033 #include "cellgrid.h"
00034
00035 namespace FIFE {
00036 static Logger _log(LM_CELLGRID);
00037
00038 CellGrid::CellGrid(bool allow_diagonals):
00039 FifeClass(),
00040 m_matrix(),
00041 m_inverse_matrix(),
00042 m_xshift(0),
00043 m_yshift(0),
00044 m_xscale(1),
00045 m_yscale(1),
00046 m_rotation(0),
00047 m_allow_diagonals(allow_diagonals) {
00048 updateMatrices();
00049 }
00050
00051 CellGrid::~CellGrid() {
00052 }
00053
00054 void CellGrid::getAccessibleCoordinates(const ModelCoordinate& curpos, std::vector<ModelCoordinate>& coordinates) {
00055 coordinates.clear();
00056 for (int x = curpos.x - 1; x <= curpos.x + 1; x++) {
00057 for (int y = curpos.y - 1; y <= curpos.y + 1; y++) {
00058 ModelCoordinate pt;
00059 pt.x = x;
00060 pt.y = y;
00061 if (isAccessible(curpos, pt)) {
00062 coordinates.push_back(pt);
00063 }
00064 }
00065 }
00066 }
00067
00068 void CellGrid::updateMatrices() {
00069 m_matrix.loadRotate(m_rotation, 0.0, 0.0, 1.0);
00070 m_matrix.applyScale(m_xscale,m_yscale, 1);
00071 m_matrix.applyTranslate(m_xshift, m_yshift, 0);
00072 m_inverse_matrix = m_matrix.inverse();
00073 }
00074
00075 ExactModelCoordinate CellGrid::toMapCoordinates(const ModelCoordinate& layer_coords) {
00076 return toMapCoordinates(intPt2doublePt(layer_coords));
00077 }
00078
00079 int CellGrid::orientation(const ExactModelCoordinate& pt, const ExactModelCoordinate& pt1, const ExactModelCoordinate& pt2) {
00080 double o = (pt2.x - pt1.x) * (pt.y - pt1.y) - (pt.x - pt1.x) * (pt2.y - pt1.y);
00081 if (o > 0.0) {
00082 return 1;
00083 } else if (o < 0.0) {
00084 return -1;
00085 }
00086 return 0;
00087 }
00088
00089 bool CellGrid::ptInTriangle(const ExactModelCoordinate& pt, const ExactModelCoordinate& pt1, const ExactModelCoordinate& pt2, const ExactModelCoordinate& pt3) {
00090 double o1 = orientation(pt1, pt2, pt);
00091 double o2 = orientation(pt2, pt3, pt);
00092 double o3 = orientation(pt3, pt1, pt);
00093 bool result = (o1 == o2) && (o2 == o3);
00094 FL_DBG(_log, LMsg("ptInTriangle, pt=") << pt << " pt1=" << pt1 << " pt2=" << pt2 << " pt3=" << pt3 << " in=" << result);
00095 return result;
00096 }
00097 }