QDebug operator<<(QDebug dbg, const QDoubleVector3D &vector) { QDebugStateSaver saver(dbg); dbg.nospace() << "QDoubleVector3D(" << vector.x() << ", " << vector.y() << ", " << vector.z() << ')'; return dbg; }
QPair<Polygon, Polygon> QGeoCameraTilesPrivate::clipFootprintToMap(const Polygon &footprint) const { bool clipX0 = false; bool clipX1 = false; bool clipY0 = false; bool clipY1 = false; double side = 1.0 * sideLength_; typedef Polygon::const_iterator const_iter; const_iter i = footprint.constBegin(); const_iter end = footprint.constEnd(); for (; i != end; ++i) { QDoubleVector3D p = *i; if ((p.x() < 0.0) || (qFuzzyIsNull(p.x()))) clipX0 = true; if ((side < p.x()) || (qFuzzyCompare(side, p.x()))) clipX1 = true; if (p.y() < 0.0) clipY0 = true; if (side < p.y()) clipY1 = true; } Polygon results = footprint; if (clipY0) { results = splitPolygonAtAxisValue(results, 1, 0.0).second; } if (clipY1) { results = splitPolygonAtAxisValue(results, 1, side).first; } if (clipX0) { if (clipX1) { results = splitPolygonAtAxisValue(results, 0, 0.0).second; results = splitPolygonAtAxisValue(results, 0, side).first; return QPair<Polygon, Polygon>(results, Polygon()); } else { QPair<Polygon, Polygon> pair = splitPolygonAtAxisValue(results, 0, 0.0); if (pair.first.isEmpty()) { // if we touched the line but didn't cross it... for (int i = 0; i < pair.second.size(); ++i) { if (qFuzzyIsNull(pair.second.at(i).x())) pair.first.append(pair.second.at(i)); } if (pair.first.size() == 2) { double y0 = pair.first[0].y(); double y1 = pair.first[1].y(); pair.first.clear(); pair.first.append(QDoubleVector3D(side, y0, 0.0)); pair.first.append(QDoubleVector3D(side - 0.001, y0, 0.0)); pair.first.append(QDoubleVector3D(side - 0.001, y1, 0.0)); pair.first.append(QDoubleVector3D(side, y1, 0.0)); } else if (pair.first.size() == 1) { // FIXME this is trickier // - touching at one point on the tile boundary // - probably need to build a triangular polygon across the edge // - don't want to add another y tile if we can help it // - initial version doesn't care double y = pair.first.at(0).y(); pair.first.clear(); pair.first.append(QDoubleVector3D(side - 0.001, y, 0.0)); pair.first.append(QDoubleVector3D(side, y + 0.001, 0.0)); pair.first.append(QDoubleVector3D(side, y - 0.001, 0.0)); } } else { for (int i = 0; i < pair.first.size(); ++i) { pair.first[i].setX(pair.first.at(i).x() + side); } } return pair; } } else { if (clipX1) { QPair<Polygon, Polygon> pair = splitPolygonAtAxisValue(results, 0, side); if (pair.second.isEmpty()) { // if we touched the line but didn't cross it... for (int i = 0; i < pair.first.size(); ++i) { if (qFuzzyCompare(side, pair.first.at(i).x())) pair.second.append(pair.first.at(i)); } if (pair.second.size() == 2) { double y0 = pair.second[0].y(); double y1 = pair.second[1].y(); pair.second.clear(); pair.second.append(QDoubleVector3D(0, y0, 0.0)); pair.second.append(QDoubleVector3D(0.001, y0, 0.0)); pair.second.append(QDoubleVector3D(0.001, y1, 0.0)); pair.second.append(QDoubleVector3D(0, y1, 0.0)); } else if (pair.second.size() == 1) { // FIXME this is trickier // - touching at one point on the tile boundary // - probably need to build a triangular polygon across the edge // - don't want to add another y tile if we can help it // - initial version doesn't care double y = pair.second.at(0).y(); pair.second.clear(); pair.second.append(QDoubleVector3D(0.001, y, 0.0)); pair.second.append(QDoubleVector3D(0.0, y - 0.001, 0.0)); pair.second.append(QDoubleVector3D(0.0, y + 0.001, 0.0)); } } else { for (int i = 0; i < pair.second.size(); ++i) { pair.second[i].setX(pair.second.at(i).x() - side); } } return pair; } else { return QPair<Polygon, Polygon>(results, Polygon()); } } }