ITRIANGLE ofxDelaunay::getTriangleForPos(ofPoint pos){ ITRIANGLE ti; for(int i = 0; i < ntri ; i++){ XYZ p0; p0.x = vertices[triangles[i].p1].x; p0.y = vertices[triangles[i].p1].y; p0.z = vertices[triangles[i].p1].z; XYZ p1; p1.x = vertices[triangles[i].p2].x; p1.y = vertices[triangles[i].p2].y; p1.z = vertices[triangles[i].p2].z; XYZ p2; p2.x = vertices[triangles[i].p3].x; p2.y = vertices[triangles[i].p3].y; p2.z = vertices[triangles[i].p3].z; bool inside = ptInTriangle(pos, p0, p1, p2); if(inside) { ti = triangles[i]; break; } } return ti; }
ITRIANGLE ofxDelaunay::getTriangleForPos(ofPoint pos){ ITRIANGLE ti; ti.p1=0; ti.p2=0; ti.p3=0; for(int i = 0; i < triangleMesh.getIndices().size()/3 ; i++){ int pp1 = triangleMesh.getIndices()[i*3]; int pp2 = triangleMesh.getIndices()[i*3+1]; int pp3 = triangleMesh.getIndices()[i*3+2]; XYZ p0; p0.x = vertices[pp1].x; p0.y = vertices[pp1].y; p0.z = vertices[pp1].z; XYZ p1; p1.x = vertices[pp2].x; p1.y = vertices[pp2].y; p1.z = vertices[pp2].z; XYZ p2; p2.x = vertices[pp3].x; p2.y = vertices[pp3].y; p2.z = vertices[pp3].z; bool inside = ptInTriangle(pos, p0, p1, p2); if(inside) { ti.p1 = pp1; ti.p2=pp2; ti.p3 = pp3; break; } } return ti; }
ModelCoordinate HexGrid::toLayerCoordinates(const ExactModelCoordinate& map_coord) { FL_DBG(_log, LMsg("==============\nConverting map coords ") << map_coord << " to int layer coords..."); ExactModelCoordinate elc = m_inverse_matrix * map_coord; elc.y *= VERTICAL_MULTIP_INV; ExactModelCoordinate lc = ExactModelCoordinate(floor(elc.x), floor(elc.y)); double dx = elc.x - lc.x; double dy = elc.y - lc.y; int x = static_cast<int>(lc.x); int y = static_cast<int>(lc.y); FL_DBG(_log, LMsg("elc=") << elc << ", lc=" << lc); FL_DBG(_log, LMsg("x=") << x << ", y=" << y << ", dx=" << dx << ", dy=" << dy); ModelCoordinate result; if ((y % 2) == 0) { FL_DBG(_log, "In even row"); if ((1 - dy) < HEX_EDGE_HALF) { FL_DBG(_log, "In lower rect area"); result = ModelCoordinate(x, y+1); } else if (dy < HEX_EDGE_HALF) { FL_DBG(_log, "In upper rect area"); if (dx > 0.5) { FL_DBG(_log, "...on right"); result = ModelCoordinate(x+1, y); } else { FL_DBG(_log, "...on left"); result = ModelCoordinate(x, y); } } // in middle triangle area else { FL_DBG(_log, "In middle triangle area"); if (dx < 0.5) { FL_DBG(_log, "In left triangles"); if (ptInTriangle(ExactModelCoordinate(dx, dy), ExactModelCoordinate(0, VERTICAL_MULTIP * HEX_EDGE_HALF), ExactModelCoordinate(0, VERTICAL_MULTIP * (1-HEX_EDGE_HALF)), ExactModelCoordinate(0.5, VERTICAL_MULTIP * HEX_EDGE_HALF) )) { FL_DBG(_log, "..upper part"); result = ModelCoordinate(x, y); } else { FL_DBG(_log, "..lower part"); result = ModelCoordinate(x, y+1); } } else { FL_DBG(_log, "In right triangles"); if (ptInTriangle(ExactModelCoordinate(dx, dy), ExactModelCoordinate(1, VERTICAL_MULTIP * HEX_EDGE_HALF), ExactModelCoordinate(1, VERTICAL_MULTIP * (1-HEX_EDGE_HALF)), ExactModelCoordinate(0.5, VERTICAL_MULTIP * HEX_EDGE_HALF) )) { FL_DBG(_log, "..upper part"); result = ModelCoordinate(x+1, y); } else { FL_DBG(_log, "..lower part"); result = ModelCoordinate(x, y+1); } } } } else { FL_DBG(_log, "In uneven row"); if (dy < HEX_EDGE_HALF) { FL_DBG(_log, "In upper rect area"); result = ModelCoordinate(x, y); } else if ((1 - dy) < HEX_EDGE_HALF) { FL_DBG(_log, "In lower rect area"); if (dx > 0.5) { FL_DBG(_log, "...on right"); result = ModelCoordinate(x+1, y+1); } else { FL_DBG(_log, "...on left"); result = ModelCoordinate(x, y+1); } } else { FL_DBG(_log, "In middle triangle area"); if (dx < 0.5) { FL_DBG(_log, "In left triangles"); if (ptInTriangle(ExactModelCoordinate(dx, dy), ExactModelCoordinate(0, VERTICAL_MULTIP * HEX_EDGE_HALF), ExactModelCoordinate(0, VERTICAL_MULTIP * (1-HEX_EDGE_HALF)), ExactModelCoordinate(0.5, VERTICAL_MULTIP * (1-HEX_EDGE_HALF)) )) { FL_DBG(_log, "..lower part"); result = ModelCoordinate(x, y+1); } else { FL_DBG(_log, "..upper part"); result = ModelCoordinate(x, y); } } else { FL_DBG(_log, "In right triangles"); if (ptInTriangle(ExactModelCoordinate(dx, dy), ExactModelCoordinate(1, VERTICAL_MULTIP * HEX_EDGE_HALF), ExactModelCoordinate(1, VERTICAL_MULTIP * (1-HEX_EDGE_HALF)), ExactModelCoordinate(0.5, VERTICAL_MULTIP * (1-HEX_EDGE_HALF)) )) { FL_DBG(_log, "..lower part"); result = ModelCoordinate(x+1, y+1); } else { FL_DBG(_log, "..upper part"); result = ModelCoordinate(x, y); } } } } FL_DBG(_log, LMsg(" result = ") << result); return result; }