MCPcopy Create free account
hub / github.com/OpenOrienteering/mapper / updateRectangle

Method updateRectangle

src/tools/draw_rectangle_tool.cpp:592–691  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

590}
591
592void DrawRectangleTool::updateRectangle()
593{
594 double angle = angle_helper->getConstrainedCursorPosMap(constrained_pos_map, constrained_pos_map);
595
596 if (angles.size() == 1)
597 {
598 // Update vectors and angles
599 // preview_path is going to be modified. Non-const getCoordinate is fine.
600 forward_vector = constrained_pos_map - MapCoordF(preview_path->getCoordinate(0));
601 forward_vector.normalize();
602
603 angles.back() = -forward_vector.angle();
604
605 // Update rectangle
606 MapCoord coord = MapCoord(constrained_pos_map);
607 coord.setDashPoint(draw_dash_points);
608 preview_path->setCoordinate(1, coord);
609 }
610 else
611 {
612 // Update vectors and angles
613 forward_vector = MapCoordF::fromPolar(1.0, -angle);
614
615 angles.back() = angle;
616
617 // Update rectangle
618 auto cur_point_index = angles.size();
619 deleteClosePoint();
620
621 // preview_path was be modified. Non-const getCoordinate is fine.
622 auto forward_dist = MapCoordF::dotProduct(forward_vector, constrained_pos_map - MapCoordF(preview_path->getCoordinate(cur_point_index - 1)));
623 MapCoord coord = preview_path->getCoordinate(cur_point_index - 1) + MapCoord(forward_dist * forward_vector);
624
625 snapped_to_line = false;
626 auto best_snap_distance_sq = std::numeric_limits<qreal>::max();
627 if (ctrl_pressed && angles.size() > 2)
628 {
629 // Try to snap to existing lines
630 MapCoord original_coord = coord;
631 for (int i = 0; i < int(angles.size()) - 1; ++i)
632 {
633 MapCoordF direction(100, 0);
634 direction.rotate(-angles[i]);
635
636 int num_steps;
637 double angle_step, angle_offset = 0;
638 if (i == 0 || qAbs(qAbs(fmod_pos(angles[i], M_PI) - fmod_pos(angles[i-1], M_PI)) - (M_PI / 2)) < 0.1)
639 {
640 num_steps = 2;
641 angle_step = M_PI/2;
642 }
643 else
644 {
645 num_steps = 4;
646 angle_step = M_PI/4;
647 }
648
649 for (int k = 0; k < num_steps; ++k)

Callers

nothing calls this directly

Calls 15

fmod_posFunction · 0.85
getCoordinateMethod · 0.80
backMethod · 0.80
angleMethod · 0.80
setDashPointMethod · 0.80
setCoordinateMethod · 0.80
distanceSquaredToMethod · 0.80
MapCoordFClass · 0.70
QPointFClass · 0.70
MapCoordClass · 0.50
sizeMethod · 0.45

Tested by

no test coverage detected