From 30be6a66526e884e5706aaa05789b92f37cb8efc Mon Sep 17 00:00:00 2001 From: Nick Gasson Date: Wed, 10 Jun 2009 20:34:47 +0100 Subject: [PATCH] Use travel tokens in segmentLength --- include/ITrackSegment.hpp | 2 +- src/CrossoverTrack.cpp | 4 ++-- src/CurvedTrack.cpp | 18 +++++++++--------- src/Points.cpp | 26 ++++++++++++-------------- src/StraightTrack.cpp | 2 +- src/Train.cpp | 3 ++- 6 files changed, 27 insertions(+), 28 deletions(-) diff --git a/include/ITrackSegment.hpp b/include/ITrackSegment.hpp index 84ddf9f..e17e39e 100644 --- a/include/ITrackSegment.hpp +++ b/include/ITrackSegment.hpp @@ -81,7 +81,7 @@ struct ITrackSegment { virtual void setOrigin(int x, int y) = 0; // Get the length of this track segment - virtual double segmentLength() const = 0; + virtual double segmentLength(const track::TravelToken& aToken) const = 0; // Get a travel token for this track segment starting at a particular // position and moving in a particular direciton diff --git a/src/CrossoverTrack.cpp b/src/CrossoverTrack.cpp index a6d3c44..d86053f 100644 --- a/src/CrossoverTrack.cpp +++ b/src/CrossoverTrack.cpp @@ -41,7 +41,7 @@ public: void setOrigin(int x, int y) { myX = x; myY = y; } void render() const; - double segmentLength() const; + double segmentLength(const track::TravelToken& aToken) const; bool isValidDirection(const track::Direction& aDirection) const; track::Connection nextPosition(const track::TravelToken& aToken) const; void getEndpoints(std::list >& aList) const; @@ -92,7 +92,7 @@ void CrossoverTrack::render() const glPopMatrix(); } -double CrossoverTrack::segmentLength() const +double CrossoverTrack::segmentLength(const track::TravelToken& aToken) const { return 1.0; } diff --git a/src/CurvedTrack.cpp b/src/CurvedTrack.cpp index d3c76d9..3c9ba63 100644 --- a/src/CurvedTrack.cpp +++ b/src/CurvedTrack.cpp @@ -44,7 +44,7 @@ public: void render() const; void setOrigin(int x, int y) { myX = x; myY = y; } - double segmentLength() const; + double segmentLength(const track::TravelToken& aToken) const; Connection nextPosition(const track::TravelToken& aToken) const; bool isValidDirection(const Direction& aDirection) const; @@ -58,7 +58,7 @@ public: track::Direction aDirection) const; private: - void transform(const track::Direction& aDirection, double aDelta) const; + void transform(const track::TravelToken& aToken, double aDelta) const; Vector cwEntryVector() const; Vector ccwEntryVector() const; void ensureValidDirection(const Direction& aDirection) const; @@ -89,15 +89,15 @@ CurvedTrack::getTravelToken(track::Position aPosition, track::TravelToken tok = { aDirection, - aPosition, - bind(&CurvedTrack::transform, this, aDirection, _1) + aPosition }; + tok.transformer = bind(&CurvedTrack::transform, this, tok, _1); return tok; } -void CurvedTrack::transform(const track::Direction& aDirection, double aDelta) const +void CurvedTrack::transform(const track::TravelToken& aToken, double aDelta) const { - assert(aDelta < segmentLength()); + assert(aDelta < segmentLength(aToken)); glTranslated(static_cast(myX), 0.0, @@ -105,9 +105,9 @@ void CurvedTrack::transform(const track::Direction& aDirection, double aDelta) c transformToOrigin(myBaseRadius, myStartAngle); - bool backwards = aDirection == cwEntryVector(); + bool backwards = aToken.direction == cwEntryVector(); - double ratio = aDelta / segmentLength(); + double ratio = aDelta / segmentLength(aToken); if (backwards) ratio = 1.0 - ratio; @@ -120,7 +120,7 @@ void CurvedTrack::transform(const track::Direction& aDirection, double aDelta) c glRotatef(180.0, 0, 1, 0); } -double CurvedTrack::segmentLength() const +double CurvedTrack::segmentLength(const track::TravelToken& aToken) const { // Assume curve is only through 90 degrees return M_PI * (static_cast(myBaseRadius) - 0.5) / 2.0; diff --git a/src/Points.cpp b/src/Points.cpp index 3fea26e..01607e1 100644 --- a/src/Points.cpp +++ b/src/Points.cpp @@ -33,7 +33,7 @@ public: // ITrackSegment interface void render() const; void setOrigin(int x, int y) { myX = x; myY = y; } - double segmentLength() const; + double segmentLength(const track::TravelToken& aToken) const; bool isValidDirection(const track::Direction& aDirection) const; track::Connection nextPosition(const track::TravelToken& aToken) const; void getEndpoints(std::list >& aList) const; @@ -43,8 +43,7 @@ public: track::TravelToken getTravelToken(track::Position aPosition, track::Direction aDirection) const; private: - void transform(const track::Direction& aDirection, - Point aPosition, double aDelta) const; + void transform(const track::TravelToken& aToken, double aDelta) const; void ensureValidDirection(track::Direction aDirection) const; Point displacedEndpoint() const; @@ -99,7 +98,7 @@ void Points::render() const glPopMatrix(); } -double Points::segmentLength() const +double Points::segmentLength(const track::TravelToken& aToken) const { return 3.0; } @@ -113,23 +112,22 @@ track::TravelToken Points::getTravelToken(track::Position aPosition, track::TravelToken tok = { aDirection, - aPosition, - bind(&Points::transform, this, aDirection, aPosition, _1) + aPosition }; + tok.transformer = bind(&Points::transform, this, tok, _1); return tok; } -void Points::transform(const track::Direction& aDirection, - Point aPosition, double aDelta) const +void Points::transform(const track::TravelToken& aToken, double aDelta) const { assert(aDelta < 3.0); - debug() << myAxis << " " << aDirection; + debug() << myAxis << " " << aToken.direction; - if (myX == aPosition.x && myY == aPosition.y) { + if (myX == aToken.position.x && myY == aToken.position.y) { debug() << "Section 1"; - if (aDirection == myAxis + if (aToken.direction == myAxis && (myAxis == -axis::X || myAxis == -axis::Y)) { debug() << "transforming"; aDelta -= 1.0; @@ -149,12 +147,12 @@ void Points::transform(const track::Direction& aDirection, if (myAxis == axis::Y || myAxis == -axis::Y) glRotated(-90.0, 0.0, 1.0, 0.0); } - else if (aPosition == straightEndpoint()) { + else if (aToken.position == straightEndpoint()) { debug() << "Section 2"; aDelta = 2.0 - aDelta; - if (aDirection == -myAxis + if (aToken.direction == -myAxis && (myAxis == axis::X || myAxis == axis::Y)) aDelta += 1.0; @@ -177,7 +175,7 @@ void Points::transform(const track::Direction& aDirection, glTranslated(-0.5, 0.0, 0.0); - if (aDirection == -axis::X || aDirection == -axis::Y) + if (aToken.direction == -axis::X || aToken.direction == -axis::Y) glRotated(-180.0, 0.0, 1.0, 0.0); } diff --git a/src/StraightTrack.cpp b/src/StraightTrack.cpp index f3e9b33..2afd8fa 100644 --- a/src/StraightTrack.cpp +++ b/src/StraightTrack.cpp @@ -41,7 +41,7 @@ public: void render() const; void setOrigin(int x, int y) { myX = x; myY = y; } - double segmentLength() const { return 1.0; } + double segmentLength(const track::TravelToken& aToken) const { return 1.0; } Vector offsetForDelta(double aDelta) const; Connection nextPosition(const track::TravelToken& aDirection) const; diff --git a/src/Train.cpp b/src/Train.cpp index 41a2bde..49aa4e9 100644 --- a/src/Train.cpp +++ b/src/Train.cpp @@ -133,7 +133,8 @@ void Train::move(double aDistance) do { (*it).segmentDelta += min(step, d); - const double segmentLength = (*it).segment->segmentLength(); + const double segmentLength = + (*it).segment->segmentLength((*it).travelToken); if ((*it).segmentDelta >= segmentLength) { // Moved onto a new piece of track const double over = (*it).segmentDelta - segmentLength; -- 2.39.2