mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-11-05 15:42:31 +01:00
feat(track): at a crossing at a wide angle each guard rail is glued to its running rail by a filler block between their webs along its whole length, so the flangeways and the gaps cut for the wheels of the other track have a floor instead of showing the ballast; the filler of the track not going through lies a millimetre lower where both overlap
This commit is contained in:
@@ -383,6 +383,7 @@ public:
|
|||||||
bool flareto { true };
|
bool flareto { true };
|
||||||
glm::dvec2 frommiter { 0.0 };
|
glm::dvec2 frommiter { 0.0 };
|
||||||
glm::dvec2 tomiter { 0.0 };
|
glm::dvec2 tomiter { 0.0 };
|
||||||
|
bool through { true };
|
||||||
};
|
};
|
||||||
struct rail_band {
|
struct rail_band {
|
||||||
double at { 0.0 };
|
double at { 0.0 };
|
||||||
|
|||||||
@@ -1049,6 +1049,22 @@ void wide( TTrack::rail_plan &Plan, double const At, double const Into, double c
|
|||||||
Plan.cuts.push_back( cut );
|
Plan.cuts.push_back( cut );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TTrack::rail_fill guard_fill( TTrack::guard_rail const &Guard, TTrack::rail_size const &Size ) {
|
||||||
|
|
||||||
|
auto const offset { Size.web - ( flangeway + Size.head ) };
|
||||||
|
auto const flare { std::min( 0.3, 0.25 * ( Guard.to - Guard.from ) ) };
|
||||||
|
TTrack::rail_fill fill;
|
||||||
|
fill.web = true;
|
||||||
|
fill.from = Guard.from;
|
||||||
|
fill.to = Guard.to;
|
||||||
|
fill.capfrom = true;
|
||||||
|
fill.capto = true;
|
||||||
|
fill.lift = ( Guard.through ? 0.0 : -0.001 );
|
||||||
|
fill.inner = { { Guard.from, offset - ( Guard.flarefrom ? 0.02 : 0.0 ) }, { Guard.from + flare, offset }, { Guard.to - flare, offset }, { Guard.to, offset - ( Guard.flareto ? 0.02 : 0.0 ) } };
|
||||||
|
fill.outer = { { Guard.from, Size.web }, { Guard.to, Size.web } };
|
||||||
|
return fill;
|
||||||
|
}
|
||||||
|
|
||||||
bool goes_through( TTrack const &Track, TTrack const &Other ) {
|
bool goes_through( TTrack const &Track, TTrack const &Other ) {
|
||||||
|
|
||||||
if( Track.name() != Other.name() ) {
|
if( Track.name() != Other.name() ) {
|
||||||
@@ -1344,6 +1360,7 @@ TTrack::rail_layout TTrack::plan_rails( bool const Crossings ) {
|
|||||||
auto const reach { ( flangeway + railhead + 0.3 ) / std::abs( crossing.into ) };
|
auto const reach { ( flangeway + railhead + 0.3 ) / std::abs( crossing.into ) };
|
||||||
auto &spans { guards[ crossing.path ][ crossing.side > 0 ] };
|
auto &spans { guards[ crossing.path ][ crossing.side > 0 ] };
|
||||||
TTrack::guard_rail guard { crossing.at - reach, crossing.at + reach };
|
TTrack::guard_rail guard { crossing.at - reach, crossing.at + reach };
|
||||||
|
guard.through = through;
|
||||||
wide( guard.plan, crossing.at, crossing.into, crossing.facing, -other.head, through ? flangeway : flangeway + other.head, guardoffset, guardoffset + railhead );
|
wide( guard.plan, crossing.at, crossing.into, crossing.facing, -other.head, through ? flangeway : flangeway + other.head, guardoffset, guardoffset + railhead );
|
||||||
auto merged { false };
|
auto merged { false };
|
||||||
for( auto &span : spans ) {
|
for( auto &span : spans ) {
|
||||||
@@ -1351,6 +1368,7 @@ TTrack::rail_layout TTrack::plan_rails( bool const Crossings ) {
|
|||||||
span.from = std::min( span.from, guard.from );
|
span.from = std::min( span.from, guard.from );
|
||||||
span.to = std::max( span.to, guard.to );
|
span.to = std::max( span.to, guard.to );
|
||||||
span.plan.cuts.insert( span.plan.cuts.end(), guard.plan.cuts.begin(), guard.plan.cuts.end() );
|
span.plan.cuts.insert( span.plan.cuts.end(), guard.plan.cuts.begin(), guard.plan.cuts.end() );
|
||||||
|
span.through = ( span.through && guard.through );
|
||||||
merged = true;
|
merged = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -1394,6 +1412,13 @@ TTrack::rail_layout TTrack::plan_rails( bool const Crossings ) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
for( int path = 0; path < 2; ++path ) {
|
||||||
|
for( int side = 0; side < 2; ++side ) {
|
||||||
|
for( auto const &guard : guards[ path ][ side ] ) {
|
||||||
|
layout.fills[ path ][ side ].push_back( guard_fill( guard, size ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
std::sort( corners.begin(), corners.end(), []( frame_corner const &A, frame_corner const &B ) { return A.at < B.at; } );
|
std::sort( corners.begin(), corners.end(), []( frame_corner const &A, frame_corner const &B ) { return A.at < B.at; } );
|
||||||
auto const glued = [&]( frame_corner const &Corner ) {
|
auto const glued = [&]( frame_corner const &Corner ) {
|
||||||
return Corner.at + ( flangeway + std::max( guardoffset * Corner.facing, ( guardoffset + railhead ) * Corner.facing ) ) / Corner.into; };
|
return Corner.at + ( flangeway + std::max( guardoffset * Corner.facing, ( guardoffset + railhead ) * Corner.facing ) ) / Corner.into; };
|
||||||
|
|||||||
Reference in New Issue
Block a user