#ifndef MAPELEMENTHELPER_H #define MAPELEMENTHELPER_H #include #include #include #include #include #include #include #include "ClickDist.h" /** configuration */ namespace CFG { const float MOVE_SNAP_SIZE_M = 0.1f; // in meter (= map-space) const int SEL_THRESHOLD_SIZE_PX = 15; // in screen-pixels (-> should depend on the current zoom) const QColor FOCUS_COLOR = Qt::black; const QColor UNFOCUS_COLOR = Qt::gray; const QColor SEL_COLOR = Qt::blue; } /** * contains some common helper-methods */ class MapElementHelper { public: /** * get the minimal distance of dst to the line denoted by (p1, p2). * this will generate line l perpendicular to (p1, p2) * move l into dst * and calculate the cut-point between l and (p1, p2) */ static ClickDist getLineDistanceXY(Point2 p1, Point2 p2, Point2 dst) { // the line (p1, p2) const Line2 line(p1, p2); // 90 degree rotation L of the line (p1, p2) const Point2 vec = (p1 - p2).perpendicular(); // the line L const Line2 perb(dst-vec*100, dst+vec*100); // calculate the cut betwen L and (p1,p2) (if any) Point2 cut(0,0); ClickDist cutDist(99999999, ClickDistType::CUT); if (line.getSegmentIntersection(perb, cut)) { // distance between cut-point and mouse cutDist.dst_px = cut.getDistance(dst); } // distance from endpoints const ClickDist d1(p1.getDistance(dst), ClickDistType::DIRECT); const ClickDist d2(p2.getDistance(dst), ClickDistType::DIRECT); // return the nearest possibility: return std::min(d1, std::min(d2, cutDist)); } static QPen getPen(Floorplan::Material mat, Floorplan::ObstacleType type, bool focus, float thickness_px) { using namespace Floorplan; QPen pen; pen.setColor(Qt::darkGray); pen.setWidth(thickness_px); // this one is very important! // as we change the line's width, the line also becomes longer // but, we do not want this! -> FlatCap pen.setCapStyle(Qt::FlatCap); if (focus) {pen.setColor(Qt::black);} if (mat == Material::CONCRETE) {;} if (mat == Material::GLASS) {pen.setStyle(Qt::PenStyle::DotLine);} if (type == ObstacleType::HANDRAIL) {pen.setStyle(Qt::PenStyle::DashLine);} if (type == ObstacleType::UNKNOWN) {pen.setColor(Qt::red);} if (type == ObstacleType::PILLAR) {pen.setColor(Qt::red);} return pen; } }; #endif // MAPELEMENTHELPER_H