left_y -= dy;
// Translate back to beam as ref point.
- left_y -= -me->relative_coordinate (common[Y_AXIS], Y_AXIS);
+ left_y -= me->relative_coordinate (common[Y_AXIS], Y_AXIS);
Interval allowed;
allowed.set_full ();
{
// We're good to go. Do nothing.
}
+ else if (collision_free[DOWN].is_empty() != collision_free[UP].is_empty())
+ {
+ // Only one of them offers is feasible solution. Pick that one.
+ Interval v =
+ (!collision_free[DOWN].is_empty()) ?
+ collision_free[DOWN] :
+ collision_free[UP];
+
+ beam_left_y = point_in_interval (v, 2.0);
+ }
else if (!collision_free[DOWN].is_empty ()
- || !collision_free[UP].is_empty ())
+ && !collision_free[UP].is_empty ())
{
- // We have space above or below collisions (or, no collisions at
- // all).
+ // Above and below are candidates, take the one closest to the
+ // starting solution.
Interval best =
- (collision_free[DOWN].length () > collision_free[UP].length ()) ?
+ (collision_free[DOWN].distance (beam_left_y)
+ < collision_free[UP].distance (beam_left_y)) ?
collision_free[DOWN] : collision_free[UP];
beam_left_y = point_in_interval (best, 2.0);
"break-overshoot "
"clip-edges "
"concaveness "
+ "collision-interfaces "
+ "collision-voice-only "
"covered-grobs "
"damping "
"details "