31 #include "util/log/logger.h"
36 static Logger _log(LM_CELLGRID);
38 CellGrid::CellGrid(
bool allow_diagonals):
47 m_allow_diagonals(allow_diagonals) {
51 CellGrid::~CellGrid() {
54 void CellGrid::getAccessibleCoordinates(
const ModelCoordinate& curpos, std::vector<ModelCoordinate>& coordinates) {
56 for (
int x = curpos.x - 1; x <= curpos.x + 1; x++) {
57 for (
int y = curpos.y - 1; y <= curpos.y + 1; y++) {
61 if (isAccessible(curpos, pt)) {
62 coordinates.push_back(pt);
68 void CellGrid::updateMatrices() {
69 m_matrix.loadRotate(m_rotation, 0.0, 0.0, 1.0);
70 m_matrix.applyScale(m_xscale,m_yscale, 1);
71 m_matrix.applyTranslate(m_xshift, m_yshift, 0);
72 m_inverse_matrix = m_matrix.inverse();
75 ExactModelCoordinate CellGrid::toMapCoordinates(
const ModelCoordinate& layer_coords) {
79 int CellGrid::orientation(
const ExactModelCoordinate& pt,
const ExactModelCoordinate& pt1,
const ExactModelCoordinate& pt2) {
80 double o = (pt2.x - pt1.x) * (pt.y - pt1.y) - (pt.x - pt1.x) * (pt2.y - pt1.y);
89 bool CellGrid::ptInTriangle(
const ExactModelCoordinate& pt,
const ExactModelCoordinate& pt1,
const ExactModelCoordinate& pt2,
const ExactModelCoordinate& pt3) {
90 double o1 = orientation(pt1, pt2, pt);
91 double o2 = orientation(pt2, pt3, pt);
92 double o3 = orientation(pt3, pt1, pt);
93 bool result = (o1 == o2) && (o2 == o3);
94 FL_DBG(_log, LMsg(
"ptInTriangle, pt=") << pt <<
" pt1=" << pt1 <<
" pt2=" << pt2 <<
" pt3=" << pt3 <<
" in=" << result);