diff --git a/application/editormodetrack.cpp b/application/editormodetrack.cpp index d0fb0593..9ea3a14e 100644 --- a/application/editormodetrack.cpp +++ b/application/editormodetrack.cpp @@ -4068,7 +4068,7 @@ std::vector editor_mode::extend_pieces() const if (std::abs(turn) > 1e-4) { int const side{turn > 0.0 ? 1 : -1}; - auto const radius{std::abs(diverging.radius) > 1.0f ? static_cast(std::abs(diverging.radius)) : curve.plan_length() / std::abs(turn)}; + auto const radius{curve.plan_length() / std::abs(turn)}; auto const &direction{tool.direction}; auto const centre{plan_of(tool.point) + glm::dvec2{-direction.y, direction.x} * (side * radius)}; auto const angle{geometry::signed_angle(plan_of(tool.point) - centre, plan_of(tool.mouse) - centre) * side}; @@ -5851,6 +5851,14 @@ std::vector editor_mode::curved_switch_paths(editor_track::switch_ auto const rollend{sample_at(Frame, Station + Direction * end.z).roll * Direction}; path.rolls = {static_cast(rollstart), static_cast(rollend)}; path.radius = local.radius; + { + bezier const curve{path}; + auto const begin{plan_of(curve.first(0.0))}; + auto const finish{plan_of(curve.first(1.0))}; + auto const turn{glm::length(begin) > 1e-9 && glm::length(finish) > 1e-9 ? geometry::signed_angle(begin, finish) : 0.0}; + if (local.radius != 0.f && std::abs(turn) > 1e-6) + path.radius = static_cast(std::copysign(curve.plan_length() / std::abs(turn), static_cast(local.radius))); + } result.push_back(path); } if (false == result.empty())