void OsmAnd::MapRasterizer_P::simplifyVertexToDirection( const Context& context, const PointF& vertex, const PointF& vertexTo, PointF& res) { const auto xShiftForSpacing = context.pixelArea.width() / 4; const auto yShiftForSpacing = context.pixelArea.height() / 4; if (vertex.x > context.pixelArea.right() + xShiftForSpacing ) { res.x = context.pixelArea.right() + xShiftForSpacing; res.y = lineEquation(vertex.x, vertex.y, vertexTo.x, vertexTo.y, res.x); } else if (vertex.x < context.pixelArea.left() - xShiftForSpacing) { res.x = context.pixelArea.left() - xShiftForSpacing; res.y = lineEquation(vertex.x, vertex.y, vertexTo.x, vertexTo.y, res.x); } else if (vertex.y > context.pixelArea.bottom() + yShiftForSpacing) { res.y = context.pixelArea.bottom() + yShiftForSpacing; res.x = lineEquation(vertex.y, vertex.x, vertexTo.y, vertexTo.x, res.y); } else if (vertex.y < context.pixelArea.top() - yShiftForSpacing) { res.y = context.pixelArea.top() - yShiftForSpacing; res.x = lineEquation(vertex.y, vertex.x, vertexTo.y, vertexTo.x, res.y); } else { res.x = vertex.x; res.y = vertex.y; } }
bool lineIntersectVertSeg( qreal a1, qreal b1, qreal c1, QPoint seg[2], QPoint &intersect) { qreal a2, b2, c2; if ( ! lineEquation(seg,a2,b2,c2)) { return false; } if ( ! lineIntersect(a1,b1,c1,a2,b2,c2,intersect)) { return false; } return intersect.y() >= seg[0].y() && intersect.y() <= seg[1].y(); }
bool rectLineIntersect( QPoint tip, QPoint loc, QRect rect, int base, QPoint &intersect, PlacementEnc &placement) { int width = rect.width(); int height = rect.height(); int tipX = tip.x(); int tipY = tip.y(); int tx,ty; QPoint seg[2]; QPoint intersect_top,intersect_bottom,intersect_left,intersect_right; bool iv_top, iv_bottom,iv_left,iv_right; /* calculate formula for line between tip and {C1,C2,Loc) */ seg[0] = tip; seg[1] = loc; qreal a, b, c; if ( ! lineEquation(seg,a,b,c)) { return false; } /* top Horizontal line */ seg[0].setX(0); seg[1].setX(rect.width()); seg[0].setY(rect.top()); seg[1].setY(rect.top()); iv_top = lineIntersectHorizSeg(a,b,c,seg,intersect_top); tx = tipX - intersect_top.x(); ty = tipY - intersect_top.y(); int top_dist = tx*tx+ty*ty; /* bottom Horizontal line */ seg[0].setY(rect.height()); seg[1].setY(rect.height()); iv_bottom = lineIntersectHorizSeg(a,b,c,seg,intersect_bottom); tx = tipX - intersect_bottom.x(); ty = tipY - intersect_bottom.y(); int bot_dist = tx*tx+ty*ty; /* left Vertical line */ seg[0].setX(0); seg[1].setX(0); seg[0].setY(rect.top()); seg[1].setY(rect.height()); iv_left = lineIntersectVertSeg(a,b,c,seg,intersect_left); tx = tipX - intersect_left.x(); ty = tipY - intersect_left.y(); int left_dist = tx*tx+ty*ty; /* right Vertical line */ seg[0].setX(rect.width()); seg[1].setX(rect.width()); iv_right = lineIntersectVertSeg(a,b,c,seg,intersect_right); tx = tipX - intersect_right.x(); ty = tipY - intersect_right.y(); int right_dist = tx*tx+ty*ty; if (iv_top && iv_bottom) { /* Is mouse tip closer to top or bottom? */ if (top_dist < bot_dist) { /* tip closer to top */ if (intersect_top.x() < base) { placement = TopLeft; intersect.setX(0); } else if (width - intersect_top.x() < base) { placement = TopRight; intersect.setX(width); } else { placement = Top; int x = intersect_top.x(); x = x < base ? base : x > width - base ? width - base : x; intersect.setX(x); } intersect.setY(0); } else { if (intersect_bottom.x() < base) { placement = BottomLeft; intersect.setX(0); } else if (width - intersect_bottom.x() < base) { placement = BottomRight; intersect.setX(width); } else { placement = Bottom; int x = intersect_top.x(); x = x < base ? base : x > width - base ? width - base : x; intersect.setY(intersect_bottom.y()); intersect.setX(x); } intersect.setY(height); } } else if (iv_left && iv_right) { /* Is the tip closer to right or left? */ if (left_dist < right_dist) { /* closer to left */ if (intersect_left.y() < base) { placement = TopLeft; intersect.setY(0); } else if (height - intersect_left.y() < base) { placement = BottomLeft; intersect.setY(height); } else { placement = Left; int y = intersect_left.y(); y = y < base ? base : y > height - base ? height - base : y; intersect.setY(intersect_left.y()); } intersect.setX(0); } else { if (intersect_right.y() < base && tipY < 0) { placement = TopRight; intersect.setY(0); } else if (height - intersect_right.y() < base && tipY > height) { placement = BottomRight; intersect.setY(height); } else { placement = Right; int y = intersect_right.y(); y = y < base ? base : y > height - base ? height - base : y; intersect.setY(y); } intersect.setX(width); } } else if (iv_top && iv_left) { if (top_dist <= left_dist) { /* tip above the rectangle - line going down/left */ if (width - intersect_top.x() < base) { placement = TopRight; intersect.setX(width); } else { placement = Top; intersect.setX(intersect_top.x()); if (intersect.x() < base) { intersect.setX(base); } } intersect.setY(0); } else { /* tip to left of rectangle - line going up/right*/ if (height - intersect_left.y() < base) { placement = BottomLeft; intersect.setY(height); } else { placement = Left; intersect.setY(intersect_left.y()); if (intersect.y() < base) { intersect.setY(base); } } intersect.setX(0); } } else if (iv_top && iv_right) { if (top_dist <= right_dist) { /* tip above the rectangle - line going down/right */ if (intersect_top.x() < base) { placement = TopLeft; intersect.setX(0); } else { placement = Top; intersect.setX(intersect_top.x()); if (width - intersect.x() < base) { intersect.setX(width - base); } } intersect.setY(0); } else { /* tip to right of rectangle - line going up/left*/ if (height - intersect_left.y() < base) { placement = BottomRight; intersect.setY(height); } else { placement = Right; intersect.setY(intersect_right.y()); if (intersect.y() < base) { intersect.setY(base); } } intersect.setX(width); } } else if (iv_bottom && iv_right) { if (bot_dist <= right_dist) { /* tip below the rectangle - line going up/right */ if (intersect_bottom.x() < base) { placement = BottomLeft; intersect.setX(0); } else { placement = Bottom; intersect.setX(intersect_bottom.x()); if (width - intersect.x() < base) { intersect.setX(width - base); } } intersect.setY(height); } else { /* tip to right of rectangle - line going down/left */ if (intersect_right.y() < base) { placement = TopRight; intersect.setY(0); } else { placement = Right; intersect.setY(intersect_right.y()); if (height - intersect.y() < base) { intersect.setY(height - base); } } intersect.setX(width); } } else if (iv_bottom && iv_left) { if (bot_dist <= left_dist) { /* tip below the rectangle - line going up/left */ if (width - intersect_bottom.x() < base) { placement = BottomRight; intersect.setX(width); } else { placement = Bottom; intersect.setX(intersect_bottom.x()); if (intersect.x() < base) { intersect.setX(base); } } intersect.setY(height); } else { /* tip left of the rectangle */ if (intersect_left.y() < base) { placement = TopLeft; intersect.setY(0); } else { placement = Left; intersect.setY(intersect_left.y()); if (height - intersect.y() < base) { intersect.setY(height - base); } } intersect.setX(0); } } else { /* Bah! The user isn't anywhere near the rectangle */ return false; } return true; }