From 9abd4c4ccfb3a867dccdcfbdd4bf8adb7f43eb52 Mon Sep 17 00:00:00 2001 From: Nick Gasson Date: Sun, 7 Jun 2009 18:31:22 +0100 Subject: [PATCH] Calculate endpoints of points --- src/Map.cpp | 7 +++++ src/Points.cpp | 63 +++++++++++++++++++++++++++++++++++++++++-- src/StraightTrack.cpp | 4 +-- 3 files changed, 69 insertions(+), 5 deletions(-) diff --git a/src/Map.cpp b/src/Map.cpp index aff48c5..22b6065 100644 --- a/src/Map.cpp +++ b/src/Map.cpp @@ -715,6 +715,13 @@ void Map::renderSector(IGraphicsPtr aContext, int id, glPopMatrix(); tile.track->setMark(); + + // Draw the endpoints for debugging + list > endpoints; + tile.track->get()->getEndpoints(endpoints); + for_each(endpoints.begin(), endpoints.end(), + bind(&Map::highlightTile, this, aContext, placeholders::_1, + make_tuple(0.9f, 0.1f, 0.1f))); } // Draw the station, if any diff --git a/src/Points.cpp b/src/Points.cpp index 893ffeb..b645f06 100644 --- a/src/Points.cpp +++ b/src/Points.cpp @@ -20,7 +20,10 @@ #include "XMLBuilder.hpp" #include "ILogger.hpp" +#include + #include +#include // Forks in the track class Points : public ITrackSegment { @@ -39,6 +42,9 @@ public: const track::Direction& aDirection); xml::element toXml() const; private: + void transform(const track::Direction& aDirection, double aDelta) const; + void ensureValidDirection(track::Direction aDirection) const; + int myX, myY; track::Direction myAxis; bool amReflected; @@ -93,25 +99,78 @@ double Points::segmentLength() const return 1.0; } +void Points::transform(const track::Direction& aDirection, + double aDelta) const +{ + +} + ITrackSegment::TransformFunc Points::transformFunc(const track::Direction& aDirection) const { + using namespace placeholders; + + ensureValidDirection(aDirection); + return bind(&Points::transform, this, aDirection, _1); +} + +void Points::ensureValidDirection(track::Direction aDirection) const +{ + if (!isValidDirection(aDirection)) + throw runtime_error + ("Invalid direction on points: " + + boost::lexical_cast(aDirection) + + " (should be parallel to " + + boost::lexical_cast(myAxis) + ")"); } bool Points::isValidDirection(const track::Direction& aDirection) const { - return true; + if (myAxis == axis::X || myAxis == -axis::X) + return aDirection == axis::X || -aDirection == axis::X; + else + return aDirection == axis::Y || -aDirection == axis::Y; } track::Connection Points::nextPosition(const track::Direction& aDirection) const { - + ensureValidDirection(aDirection); + + if (aDirection == axis::X) + return make_pair(makePoint(myX + 1, myY), axis::X); + else if (aDirection == -axis::X) + return make_pair(makePoint(myX - 1, myY), -axis::X); + else if (aDirection == axis::Y) + return make_pair(makePoint(myX, myY + 1), axis::Y); + else if (aDirection == -axis::Y) + return make_pair(makePoint(myX, myY - 1), -axis::Y); + else + assert(false); } void Points::getEndpoints(std::list >& aList) const { aList.push_back(makePoint(myX, myY)); + + const int reflect = amReflected ? -1 : 1; + + if (myAxis == axis::X) { + aList.push_back(makePoint(myX + 2, myY)); + aList.push_back(makePoint(myX + 2, myY + 1*reflect)); + } + else if (myAxis == -axis::X) { + aList.push_back(makePoint(myX - 2, myY)); + aList.push_back(makePoint(myX - 2, myY - 1*reflect)); + } + else if (myAxis == axis::Y) { + aList.push_back(makePoint(myX, myY + 2)); + aList.push_back(makePoint(myX - 1*reflect, myY + 2)); + } + else if (myAxis == -axis::Y) { + aList.push_back(makePoint(myX, myY - 2)); + aList.push_back(makePoint(myX + 1*reflect, myY - 2)); + } } ITrackSegmentPtr Points::mergeExit(const Point& aPoint, diff --git a/src/StraightTrack.cpp b/src/StraightTrack.cpp index 28d2618..533c715 100644 --- a/src/StraightTrack.cpp +++ b/src/StraightTrack.cpp @@ -27,9 +27,7 @@ #include #include -using namespace std; -using namespace std::tr1; -using namespace std::tr1::placeholders; +using namespace placeholders; using namespace boost; using namespace track; -- 2.39.2