17
0
mirror of https://github.com/MaSzyna-EU07/maszyna.git synced 2026-10-17 00:29:19 +02:00
Files
maszyna/editor/editorProfile.hpp

129 lines
4.1 KiB
C++

/*
This Source Code Form is subject to the
terms of the Mozilla Public License, v.
2.0. If a copy of the MPL was not
distributed with this file, You can
obtain one at
http://mozilla.org/MPL/2.0/.
*/
#pragma once
#include <string>
#include <utility>
#include <vector>
// vertical alignment (grade line) of the rail top along the chainage of a route
namespace profile
{
// point of intersection of two grades, with a parabolic vertical curve of radius R (0: none)
struct pvi
{
double chainage{0.0};
double elevation{0.0};
double radius{0.0};
bool automatic{true}; // radius follows the limits
bool joint{false}; // placed by complete(), takes the grade over from the adjoining track
};
struct limits
{
double grade_max{6.0}; // per mille
double grade_switch_max{2.5}; // per mille, over switches
double radius_factor{0.4}; // R >= k * V^2
double radius_min{2000.0};
double curve_threshold{2.0}; // per mille, change of grade which needs a vertical curve
double element_min{0.0}; // m, constant grade between vertical curves
double fixed_tolerance{0.005}; // m, allowed departure from fixed points
};
struct line
{
std::vector<pvi> points; // ordered by chainage; the first and the last are the ends of the route
double speed{100.0};
limits norms;
// at the joined ends: keep the elevation and take over the grade of the adjoining track
bool join_start{true};
bool join_end{true};
};
double elevation(line const &Line, double const Chainage);
// dy/ds
double grade(line const &Line, double const Chainage);
// grade of the element between points Index and Index + 1
double grade_after(line const &Line, std::size_t const Index);
double required_radius(line const &Line);
// radii of the automatic points: the required one where the change of grade needs a curve, none elsewhere
void assign_radii(line &Line);
struct curve
{
std::size_t point{0};
double start{0.0};
double end{0.0};
double tangent{0.0};
double sagitta{0.0};
double change{0.0}; // grade after - grade before
};
std::vector<curve> curves(line const &Line);
// radius which gives specified elevation of the curve at the point of intersection
double radius_for_sagitta(line const &Line, std::size_t const Point, double const Sagitta);
// facts about the route which the checks take into account
struct context
{
double length{0.0};
struct zone
{
double from{0.0};
double to{0.0};
std::string name;
};
std::vector<zone> switches;
// elevations which the grade line has to keep (chainage, elevation)
std::vector<std::pair<double, double>> fixed;
// adjoining track at the ends; grades rise along the route
double start_elevation{0.0}, end_elevation{0.0};
double start_grade{0.0}, end_grade{0.0};
bool start_joined{false}, end_joined{false};
};
// locks the joined ends, places the joint points and sets the automatic radii
void complete(line &Line, context const &Context);
struct issue
{
bool error{false};
int point{-1};
double chainage{0.0};
std::string text;
};
std::vector<issue> check(line const &Line, context const &Context);
struct recognition
{
double grade_tolerance{0.0004};
double minimum_length{15.0};
double sharp_gap{2.0};
};
// grade line of existing track, from its elevations and grades sampled along the chainage
line recognize(std::vector<double> const &Chainages, std::vector<double> const &Elevations, std::vector<double> const &Grades, recognition const &Options);
struct ground_fit
{
double tolerance{1.0}; // m, departure from the ground which doesn't yet need a change of grade
double smoothing{20.0}; // m, length over which the ground is averaged
};
// grade line which follows the ground within the limits of Settings, with the least earthworks.
// Ground is NaN where there's none; the joined ends of the route keep the elevation of the adjoining track
line fit_ground(std::vector<double> const &Chainages, std::vector<double> const &Ground, context const &Context, line const &Settings, ground_fit const &Options);
// chainages where the paths have to end so that each of them carries a single grade or a single curve
std::vector<double> breaks(line const &Line);
std::string format_chainage(double const Chainage);
}