/* ---- This file is part of SECONDO. Copyright (C) 2004, University in Hagen, Department of Computer Science, Database Systems for New Applications. SECONDO is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. SECONDO is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with SECONDO; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ---- //paragraph [1] Title: [{\Large \bf \begin {center}] [\end {center}}] //[TOC] [\tableofcontents] //[_] [\_] [1] Implementation file for the region tests [TOC] 1 Overview This file contains all classes and methods required for the region tests. This file is not required for SECONDO. It is only used inside the test project. 1 Includes */ #include #include #include #include "../Algorithm/Hobby.h" #ifdef RPS_TEST #include "../Helper/SpatialAlgebraStubs.h" #else #include "SpatialAlgebra.h" #endif #include "../Helper/TestDataGenerator.h" #include "../Helper/LineSegmentComparer.h" using namespace std; using namespace RobustPlaneSweep; /* 1 Enum class ~SetOpType~ */ enum class SetOpType { Union = 1, Intersection = 2, Minus = 3 }; /* 1 Class ~RegionVectorData~ */ class RegionVectorData : public IntersectionAlgorithmData { /* 1.1 Member variables */ private: vector* _input; vector* _output; vector::iterator _inputIterator; int _outputSegments; int _roundToDecimals; InternalPointTransformation* _transformation; SetOpType _setOpType; bool _reverseFirstSecond; bool _emitRightDomSegment; bool _testIntersectionOnly; bool _intersects; public: /* 1.1 Constructors */ RegionVectorData(vector* input, SetOpType setOpType, int roundToDecimals, InternalPointTransformation* transformation) { _input = input; _setOpType = setOpType; _output = new vector(); _outputSegments = 0; _roundToDecimals = roundToDecimals; _transformation = transformation; _reverseFirstSecond = false; _emitRightDomSegment = false; _testIntersectionOnly = false; _intersects = false; } RegionVectorData(vector* input, SetOpType setOpType, int roundToDecimals, InternalPointTransformation* transformation, bool reverseFirstSecond, bool emitRightDomSegment, bool testIntersectionOnly) { _input = input; _setOpType = setOpType; _output = new vector(); _outputSegments = 0; _roundToDecimals = roundToDecimals; _transformation = transformation; _reverseFirstSecond = reverseFirstSecond; _emitRightDomSegment = emitRightDomSegment; _testIntersectionOnly = testIntersectionOnly; _intersects = false; } /* 1.1 Destructor */ ~RegionVectorData() { if (_output != NULL) { delete _output; _output = NULL; } } /* 1.1 ~FirstGeometryIsRegion~ */ bool FirstGeometryIsRegion() const { return true; } /* 1.1 ~SecondGeometryIsRegion~ */ bool SecondGeometryIsRegion() const { return true; } /* 1.1 ~InitializeFetch~ */ void InitializeFetch() { sort(_input->begin(), _input->end(), HalfSegment::Less); _inputIterator = _input->begin(); } /* 1.1 ~FetchInput~ */ bool FetchInput(HalfSegment &segment, Point& point, bool &belongsToSecondGeometry) { if (_inputIterator == _input->end()) { return false; } else { segment = *_inputIterator++; point.SetDefined(false); belongsToSecondGeometry = (segment.attr.faceno == 1); if (_reverseFirstSecond) { belongsToSecondGeometry = !belongsToSecondGeometry; } return true; } } /* 1.1 ~OutputData~ */ bool OutputData() const { return !_testIntersectionOnly; } /* 1.1 ~OnGeometryIntersectionFound~ */ bool OnGeometryIntersectionFound() { _intersects = true; return _testIntersectionOnly; } /* 1.1 ~Intersects~ */ bool Intersects() { return _intersects; } /* 1.1 ~OutputHalfSegment~ */ void OutputHalfSegment(const HalfSegment& segment, const InternalAttribute& a) { bool include; bool insideAbove = false; switch (_setOpType) { case SetOpType::Union: include = a.IsInUnionRegion(insideAbove); break; case SetOpType::Intersection: include = a.IsInIntersectionRegion(insideAbove); break; case SetOpType::Minus: include = a.IsInMinusRegion(insideAbove); break; default: throw new logic_error("setOpType"); } if (!include) { return; } HalfSegment s1 = segment; s1.SetLeftDomPoint(true); s1.attr.insideAbove = insideAbove; s1.attr.edgeno = _outputSegments; _output->push_back(s1); if (_emitRightDomSegment) { HalfSegment s2 = s1; s2.SetLeftDomPoint(false); _output->push_back(s2); } _outputSegments++; } /* 1.1 ~GetBoundingBox~ */ const Rectangle<2> GetBoundingBox() { double minX = 1e300; double maxX = -1e300; double minY = 1e300; double maxY = -1e300; bool foundSegments = false; for (vector::iterator i = _input->begin(); i != _input->end(); ++i) { foundSegments = true; const HalfSegment& segment = *i; if (segment.GetDomPoint().GetX() < minX) { minX = segment.GetDomPoint().GetX(); } if (segment.GetDomPoint().GetY() < minY) { minY = segment.GetDomPoint().GetY(); } if (segment.GetDomPoint().GetX() > maxX) { maxX = segment.GetDomPoint().GetX(); } if (segment.GetDomPoint().GetY() > maxY) { maxY = segment.GetDomPoint().GetY(); } } if (foundSegments) { return Rectangle<2>(true, minX, maxX, minY, maxY); } else { return Rectangle<2>(false, 0, 0, 0, 0); } } /* 1.1 ~GetRoundToDecimals~ */ void GetRoundToDecimals(int& decimals, int& stepSize) const { decimals = _roundToDecimals; stepSize = 1; } /* 1.1 ~OutputFinished~ */ void OutputFinished() { sort(_output->begin(), _output->end(), HalfSegment::Less); } /* 1.1 ~GetResult~ */ vector* GetResult() { vector* result = _output; _output = NULL; return result; } }; /* 1 Class ~RegionHelper~ */ class RegionHelper { private: /* 1.1 Private Point comparer */ struct PointComparer { size_t operator()(const Point &x) const { return ((size_t)(x.GetX())) ^ ((size_t)(x.GetY())); } bool operator()(const Point &x, const Point &y) const { return x.GetX() == y.GetX() && x.GetY() == y.GetY(); } }; /* 1.1 Member variables */ typedef unordered_map*, PointComparer, PointComparer> graphtype; graphtype _graph; /* 1.1 ~BuildGraph~ */ void BuildGraph(vector* segments) { for (vector::const_iterator segment = segments->begin(); segment != segments->end(); segment++) { if (segment->IsLeftDomPoint()) { for (int ldp = 0; ldp < 2; ldp++) { Point p = (ldp == 0 ? segment->GetLeftPoint() : segment->GetRightPoint()); vector* list; graphtype::const_iterator findResult = _graph.find(p); if (findResult != _graph.end()) { list = findResult->second; } else { list = new vector(); _graph[p] = list; } list->push_back(*segment); } } } } public: /* 1.1 Constructor */ RegionHelper() { } /* 1.1 ~CanExtractRegions~ */ bool CanExtractRegions(vector* segments) { BuildGraph(segments); while (!_graph.empty()) { HalfSegment currentSegment = *(_graph.begin()->second->begin()); vector ring; Point startPoint = currentSegment.GetLeftPoint(); Point currentPoint = startPoint; for (;;) { ring.push_back(currentSegment); for (int ldp = 0; ldp < 2; ldp++) { Point p = (ldp == 0 ? currentSegment.GetLeftPoint() : currentSegment.GetRightPoint()); graphtype::const_iterator findResult = _graph.find(p); vector* list = findResult->second; bool foundEdge = false; for (vector::iterator temp = list->begin(); temp != list->end(); temp++) { if (temp->attr.edgeno == currentSegment.attr.edgeno) { list->erase(temp); if (list->empty()) { delete list; _graph.erase(p); } foundEdge = true; break; } } if (!foundEdge) { return false; } } if (currentPoint == currentSegment.GetLeftPoint()) { currentPoint = currentSegment.GetRightPoint(); } else { currentPoint = currentSegment.GetLeftPoint(); } if (startPoint == currentPoint) { break; } graphtype::const_iterator nextSegment = _graph.find(currentPoint); if (nextSegment == _graph.end()) { return false; } currentSegment = *(nextSegment->second->begin()); } } return true; } }; /* 1 Helper methods 1.1 ~Flip~ */ Point Flip(const Point& point, bool x, bool y) { return Point(true, (x ? -point.GetX() : point.GetX()), (y ? -point.GetY() : point.GetY())); } /* 1.1 ~Rotate~ */ Point Rotate(const Point& point, int angle) { switch (angle) { case 0: return point; case 1: return Point(true, -point.GetY(), point.GetX()); case 2: return Point(true, -point.GetX(), -point.GetY()); case 3: return Point(true, point.GetY(), -point.GetX()); default: throw new invalid_argument("invalid angle"); } } /* 1.1 ~Flip~ */ HalfSegment Flip(const HalfSegment& segment, bool x, bool y, bool flipIndex) { bool insideAbove = segment.attr.insideAbove; if (!x && !y) { } else { if (y && segment.GetLeftPoint().GetX() != segment.GetRightPoint().GetX()) { insideAbove = !insideAbove; } if (x && segment.GetLeftPoint().GetX() == segment.GetRightPoint().GetX()) { insideAbove = !insideAbove; } } HalfSegment result = HalfSegment(true, Flip(segment.GetLeftPoint(), x, y), Flip(segment.GetRightPoint(), x, y)); result.attr.insideAbove = insideAbove; result.attr.edgeno = segment.attr.edgeno; result.attr.faceno = (flipIndex ? 1 - segment.attr.faceno : segment.attr.faceno); return result; } /* 1.1 ~Rotate~ */ HalfSegment Rotate(const HalfSegment& segment, int angle) { bool insideAbove = segment.attr.insideAbove; Point s = segment.GetLeftPoint(); Point e = segment.GetRightPoint(); switch (angle) { case 0: break; case 1: if (s.GetY() < e.GetY() || s.GetX() == e.GetX()) { insideAbove = !insideAbove; } break; case 2: insideAbove = !insideAbove; break; case 3: if (s.GetY() >= e.GetY() && s.GetX() != e.GetX()) { insideAbove = !insideAbove; } break; default: throw new invalid_argument("invalid angle"); } HalfSegment result = HalfSegment(true, Rotate(s, angle), Rotate(e, angle)); result.attr.insideAbove = insideAbove; result.attr.edgeno = segment.attr.edgeno; result.attr.faceno = segment.attr.faceno; return result; } /* 1.1 ~FlipRotate~ */ vector FlipRotate(const vector& source, bool x, bool y, bool flipIndex, int angle) { vector result; for (vector::const_iterator segment = source.begin(); segment != source.end(); segment++) { result.push_back(Rotate(Flip(*segment, x, y, flipIndex), angle)); } return result; } vector> FlipRotate(const vector>& source, bool x, bool y, bool flipIndex, int angle) { vector < vector < HalfSegment >> result; for (vector>::const_iterator sourceList = source.begin(); sourceList != source.end(); sourceList++) { result.push_back(FlipRotate(*sourceList, x, y, flipIndex, angle)); } return result; } /* 1.1 ~TestInternal~ */ void TestInternal(vector source, SetOpType type, int decimals, InternalPointTransformation* transformation, const vector>& expectedResults) { RegionVectorData v(&source, type, decimals, transformation); Hobby ho(&v); if (transformation != NULL) { ho.SetTransformation(transformation); } ho.DetermineIntersections(); vector* actualResult = v.GetResult(); bool isEqual = false; for (vector>::const_iterator expectedResult = expectedResults.begin(); expectedResult != expectedResults.end(); expectedResult++) { LineSegmentComparer comparer(actualResult->begin(), actualResult->end(), expectedResult->begin(), expectedResult->end()); if (comparer.IsEqual()) { isEqual = true; break; } } if (!isEqual) { throw logic_error("region test failed!"); } delete actualResult; } void TestInternal(vector source, int decimals, InternalPointTransformation* transformation, const vector>& unionResults, const vector>& intersectionResults, const vector>& differenceResults, const vector>& differenceRevResults) { for (int angle = 0; angle < 4; angle++) { for (int g = 0; g < 2; g++) { for (int x = 0; x < 2; x++) { for (int y = 0; y < 2; y++) { TestInternal(FlipRotate(source, x == 1, y == 1, g == 1, angle), SetOpType::Union, decimals, transformation, FlipRotate(unionResults, x == 1, y == 1, g == 1, angle)); TestInternal(FlipRotate(source, x == 1, y == 1, g == 1, angle), SetOpType::Intersection, decimals, transformation, FlipRotate(intersectionResults, x == 1, y == 1, g == 1, angle)); if (g == 0) { TestInternal(FlipRotate(source, x == 1, y == 1, g == 1, angle), SetOpType::Minus, decimals, transformation, FlipRotate(differenceResults, x == 1, y == 1, false, angle)); } else { TestInternal(FlipRotate(source, x == 1, y == 1, g == 1, angle), SetOpType::Minus, decimals, transformation, FlipRotate(differenceRevResults, x == 1, y == 1, false, angle)); } } } } } } void TestInternal(vector source, int decimals, InternalPointTransformation* transformation, const vector& unionResult, const vector& intersectionResult, const vector& differenceResult, const vector& differenceRevResult) { vector < vector < HalfSegment >> unionResults; vector < vector < HalfSegment >> intersectionResults; vector < vector < HalfSegment >> differenceResults; vector < vector < HalfSegment >> differenceRevResults; unionResults.push_back(unionResult); intersectionResults.push_back(intersectionResult); differenceResults.push_back(differenceResult); differenceRevResults.push_back(differenceRevResult); TestInternal(source, decimals, transformation, unionResults, intersectionResults, differenceResults, differenceRevResults); } /* 1.1 ~CreateHalfSegment~ */ HalfSegment CreateHalfSegment(int geometryIndex, int edgoNo, double x0, double y0, double x1, double y1, bool insideAbove) { HalfSegment result = HalfSegment(true, Point(true, x0, y0), Point(true, x1, y1)); result.attr.faceno = geometryIndex; result.attr.edgeno = edgoNo; result.attr.insideAbove = insideAbove; return result; } /* 1.1 ~TriangleSetOpTest~ */ bool TriangleSetOpTest(unsigned int seed, unsigned int triangleCount, int decimals) { vector*>* sourceGeometries; sourceGeometries = TestDataGenerator:: GenerateTriangles(seed, 10, 10, 20, 20, triangleCount, 0); while (sourceGeometries->size() > 1) { vector*>* newSourceGeometries = new vector*>(); for (unsigned int i = 0; i < sourceGeometries->size() - 1; i += 2) { vector source; for (int geometryIndex = 0; geometryIndex < 2; geometryIndex++) { for (vector::const_iterator hs = (*sourceGeometries)[i + geometryIndex]->begin(); hs != (*sourceGeometries)[i + geometryIndex]->end(); hs++) { HalfSegment h = *hs; h.attr.faceno = geometryIndex; source.push_back(h); } delete (*sourceGeometries)[i + geometryIndex]; } if (source.size() == 0) { continue; } { RegionVectorData v(&source, SetOpType::Union, decimals, NULL, false, true, false); Hobby ho(&v); ho.DetermineIntersections(); vector* unionResult = v.GetResult(); RegionHelper r; if (!r.CanExtractRegions(unionResult)) { return false; } newSourceGeometries->push_back(unionResult); } bool intersects = false; { RegionVectorData v(&source, SetOpType::Intersection, decimals, NULL, false, true, true); BentleyOttmann ho(&v); ho.DetermineIntersections(); intersects = v.Intersects(); } { RegionVectorData v(&source, SetOpType::Intersection, decimals, NULL, false, true, false); Hobby ho(&v); ho.DetermineIntersections(); vector* intersectionResult = v.GetResult(); if (intersectionResult->size() > 0 && !intersects) { return false; } RegionHelper r; if (!r.CanExtractRegions(intersectionResult)) { return false; } delete intersectionResult; } { RegionVectorData v(&source, SetOpType::Minus, decimals, NULL, false, true, false); Hobby ho(&v); ho.DetermineIntersections(); vector* minusResult = v.GetResult(); RegionHelper r; if (!r.CanExtractRegions(minusResult)) { return false; } delete minusResult; } { RegionVectorData v(&source, SetOpType::Minus, decimals, NULL, true, true, false); Hobby ho(&v); ho.DetermineIntersections(); vector* minusRevResult = v.GetResult(); RegionHelper r; if (!r.CanExtractRegions(minusRevResult)) { return false; } delete minusRevResult; } } if (sourceGeometries->size() % 2 == 1) { newSourceGeometries-> push_back((*sourceGeometries)[sourceGeometries->size() - 1]); } delete sourceGeometries; sourceGeometries = newSourceGeometries; } delete (*sourceGeometries)[0]; delete sourceGeometries; return true; } /* 1 Region $\times$ Region test cases 1.1 Test case 1 */ void RegionRegionTest1() { vector source; vector unionResult; vector intersectionResult; vector differenceResult; vector differenceRevResult; vector* s = &source; s->push_back(CreateHalfSegment(0, 0, 10, 10, 15, 7, true)); s->push_back(CreateHalfSegment(0, 1, 15, 7, 14, 11, false)); s->push_back(CreateHalfSegment(0, 2, 14, 11, 10, 10, false)); s->push_back(CreateHalfSegment(1, 10, 13, 8, 16, 9, true)); s->push_back(CreateHalfSegment(1, 11, 16, 9, 12, 10, false)); s->push_back(CreateHalfSegment(1, 12, 12, 10, 13, 8, true)); s = &unionResult; s->push_back(CreateHalfSegment(0, 1, 10, 10, 12.9, 8.3, true)); s->push_back(CreateHalfSegment(0, 2, 10, 10, 14, 11, false)); s->push_back(CreateHalfSegment(0, 3, 12.9, 8.3, 13, 8, true)); s->push_back(CreateHalfSegment(0, 4, 13, 8, 13.2, 8.1, true)); s->push_back(CreateHalfSegment(0, 5, 13.2, 8.1, 15, 7, true)); s->push_back(CreateHalfSegment(0, 6, 14, 11, 14.4, 9.4, false)); s->push_back(CreateHalfSegment(0, 7, 14.4, 9.4, 16, 9, false)); s->push_back(CreateHalfSegment(0, 8, 14.6, 8.5, 15, 7, false)); s->push_back(CreateHalfSegment(0, 9, 14.6, 8.5, 16, 9, true)); s = &intersectionResult; s->push_back(CreateHalfSegment(0, 1, 12, 10, 12.9, 8.3, true)); s->push_back(CreateHalfSegment(0, 2, 12, 10, 14.4, 9.4, false)); s->push_back(CreateHalfSegment(0, 3, 12.9, 8.3, 13.2, 8.1, true)); s->push_back(CreateHalfSegment(0, 4, 13.2, 8.1, 14.6, 8.5, true)); s->push_back(CreateHalfSegment(0, 5, 14.4, 9.4, 14.6, 8.5, false)); s = &differenceResult; s->push_back(CreateHalfSegment(0, 1, 10, 10, 12.9, 8.3, true)); s->push_back(CreateHalfSegment(0, 2, 10, 10, 14, 11, false)); s->push_back(CreateHalfSegment(0, 3, 12, 10, 12.9, 8.3, false)); s->push_back(CreateHalfSegment(0, 4, 12, 10, 14.4, 9.4, true)); s->push_back(CreateHalfSegment(0, 5, 13.2, 8.1, 14.6, 8.5, false)); s->push_back(CreateHalfSegment(0, 6, 13.2, 8.1, 15, 7, true)); s->push_back(CreateHalfSegment(0, 7, 14, 11, 14.4, 9.4, false)); s->push_back(CreateHalfSegment(0, 8, 14.6, 8.5, 15, 7, false)); s = &differenceRevResult; s->push_back(CreateHalfSegment(0, 1, 12.9, 8.3, 13, 8, true)); s->push_back(CreateHalfSegment(0, 2, 12.9, 8.3, 13.2, 8.1, false)); s->push_back(CreateHalfSegment(0, 3, 13, 8, 13.2, 8.1, true)); s->push_back(CreateHalfSegment(0, 4, 14.4, 9.4, 14.6, 8.5, true)); s->push_back(CreateHalfSegment(0, 5, 14.4, 9.4, 16, 9, false)); s->push_back(CreateHalfSegment(0, 6, 14.6, 8.5, 16, 9, true)); TestInternal(source, 1, NULL, unionResult, intersectionResult, differenceResult, differenceRevResult); } /* 1.1 Test case 2 */ void RegionRegionTest2() { vector source; vector unionResult; vector intersectionResult; vector differenceResult; vector differenceRevResult; vector* s = &source; s->push_back(CreateHalfSegment(0, 0, 10, 10, 14, 7, true)); s->push_back(CreateHalfSegment(0, 1, 14, 7, 14, 11, true)); s->push_back(CreateHalfSegment(0, 2, 14, 11, 10, 10, false)); s->push_back(CreateHalfSegment(1, 10, 13, 8, 16, 9, true)); s->push_back(CreateHalfSegment(1, 11, 16, 9, 12, 10, false)); s->push_back(CreateHalfSegment(1, 12, 12, 10, 13, 8, true)); s = &unionResult; s->push_back(CreateHalfSegment(0, 1, 10, 10, 14, 7, true)); s->push_back(CreateHalfSegment(0, 2, 10, 10, 14, 11, false)); s->push_back(CreateHalfSegment(0, 3, 14, 7, 14, 8.3, true)); s->push_back(CreateHalfSegment(0, 4, 14, 8.3, 16, 9, true)); s->push_back(CreateHalfSegment(0, 5, 14, 9.5, 14, 11, true)); s->push_back(CreateHalfSegment(0, 6, 14, 9.5, 16, 9, false)); s = &intersectionResult; s->push_back(CreateHalfSegment(0, 1, 12, 10, 13, 8, true)); s->push_back(CreateHalfSegment(0, 2, 12, 10, 14, 9.5, false)); s->push_back(CreateHalfSegment(0, 3, 13, 8, 14, 8.3, true)); s->push_back(CreateHalfSegment(0, 4, 14, 8.3, 14, 9.5, true)); s = &differenceResult; s->push_back(CreateHalfSegment(0, 1, 10, 10, 14, 7, true)); s->push_back(CreateHalfSegment(0, 2, 10, 10, 14, 11, false)); s->push_back(CreateHalfSegment(0, 3, 12, 10, 13, 8, false)); s->push_back(CreateHalfSegment(0, 4, 12, 10, 14, 9.5, true)); s->push_back(CreateHalfSegment(0, 5, 13, 8, 14, 8.3, false)); s->push_back(CreateHalfSegment(0, 6, 14, 7, 14, 8.3, true)); s->push_back(CreateHalfSegment(0, 7, 14, 9.5, 14, 11, true)); s = &differenceRevResult; s->push_back(CreateHalfSegment(0, 1, 14, 8.3, 14, 9.5, false)); s->push_back(CreateHalfSegment(0, 2, 14, 8.3, 16, 9, true)); s->push_back(CreateHalfSegment(0, 3, 14, 9.5, 16, 9, false)); TestInternal(source, 1, NULL, unionResult, intersectionResult, differenceResult, differenceRevResult); } /* 1.1 Test case 3 */ void RegionRegionTest3() { vector source; vector unionResult; vector intersectionResult; vector differenceResult; vector differenceRevResult; vector* s = &source; s->push_back(CreateHalfSegment(0, 0, 10, 10, 15, 6, true)); s->push_back(CreateHalfSegment(0, 1, 15, 6, 13, 12, false)); s->push_back(CreateHalfSegment(0, 2, 13, 12, 10, 10, false)); s->push_back(CreateHalfSegment(1, 10, 13, 8, 16, 9, true)); s->push_back(CreateHalfSegment(1, 11, 16, 9, 14, 9, false)); s->push_back(CreateHalfSegment(1, 12, 14, 9, 13, 8, false)); s = &unionResult; s->push_back(CreateHalfSegment(0, 1, 10, 10, 13, 12, false)); s->push_back(CreateHalfSegment(0, 2, 10, 10, 15, 6, true)); s->push_back(CreateHalfSegment(0, 3, 13, 12, 14, 9, false)); s->push_back(CreateHalfSegment(0, 4, 14, 9, 16, 9, false)); s->push_back(CreateHalfSegment(0, 5, 14.2, 8.4, 15, 6, false)); s->push_back(CreateHalfSegment(0, 6, 14.2, 8.4, 16, 9, true)); s = &intersectionResult; s->push_back(CreateHalfSegment(0, 1, 13, 8, 14, 9, false)); s->push_back(CreateHalfSegment(0, 2, 13, 8, 14.2, 8.4, true)); s->push_back(CreateHalfSegment(0, 3, 14, 9, 14.2, 8.4, false)); s = &differenceResult; s->push_back(CreateHalfSegment(0, 1, 10, 10, 13, 12, false)); s->push_back(CreateHalfSegment(0, 2, 10, 10, 15, 6, true)); s->push_back(CreateHalfSegment(0, 3, 13, 8, 14, 9, true)); s->push_back(CreateHalfSegment(0, 4, 13, 8, 14.2, 8.4, false)); s->push_back(CreateHalfSegment(0, 5, 13, 12, 14, 9, false)); s->push_back(CreateHalfSegment(0, 6, 14.2, 8.4, 15, 6, false)); s = &differenceRevResult; s->push_back(CreateHalfSegment(0, 1, 14, 9, 14.2, 8.4, true)); s->push_back(CreateHalfSegment(0, 2, 14, 9, 16, 9, false)); s->push_back(CreateHalfSegment(0, 3, 14.2, 8.4, 16, 9, true)); TestInternal(source, 1, NULL, unionResult, intersectionResult, differenceResult, differenceRevResult); } /* 1.1 Test case 4 */ void RegionRegionTest4() { vector source; vector unionResult; vector intersectionResult; vector differenceResult; vector differenceRevResult; vector* s = &source; s->push_back(CreateHalfSegment(0, 0, 10, 10, 15, 6, true)); s->push_back(CreateHalfSegment(0, 1, 15, 6, 13, 12, false)); s->push_back(CreateHalfSegment(0, 2, 13, 12, 10, 10, false)); s->push_back(CreateHalfSegment(1, 10, 14.5, 7.5, 16, 9, true)); s->push_back(CreateHalfSegment(1, 11, 16, 9, 14, 9, false)); s->push_back(CreateHalfSegment(1, 12, 14, 9, 14.5, 7.5, true)); s = &unionResult; s->push_back(CreateHalfSegment(0, 1, 10, 10, 13, 12, false)); s->push_back(CreateHalfSegment(0, 2, 10, 10, 15, 6, true)); s->push_back(CreateHalfSegment(0, 3, 13, 12, 14, 9, false)); s->push_back(CreateHalfSegment(0, 4, 14, 9, 16, 9, false)); s->push_back(CreateHalfSegment(0, 5, 14.5, 7.5, 15, 6, false)); s->push_back(CreateHalfSegment(0, 6, 14.5, 7.5, 16, 9, true)); s = &differenceResult; s->push_back(CreateHalfSegment(0, 1, 10, 10, 13, 12, false)); s->push_back(CreateHalfSegment(0, 2, 10, 10, 15, 6, true)); s->push_back(CreateHalfSegment(0, 3, 13, 12, 14, 9, false)); s->push_back(CreateHalfSegment(0, 4, 14, 9, 14.5, 7.5, false)); s->push_back(CreateHalfSegment(0, 5, 14.5, 7.5, 15, 6, false)); s = &differenceRevResult; s->push_back(CreateHalfSegment(0, 1, 14, 9, 14.5, 7.5, true)); s->push_back(CreateHalfSegment(0, 2, 14, 9, 16, 9, false)); s->push_back(CreateHalfSegment(0, 3, 14.5, 7.5, 16, 9, true)); TestInternal(source, 1, NULL, unionResult, intersectionResult, differenceResult, differenceRevResult); } /* 1.1 Test case 5 */ void RegionRegionTest5() { vector source; vector unionResult; vector intersectionResult; vector differenceResult; vector differenceRevResult; vector* s = &source; s->push_back(CreateHalfSegment(0, 0, 10, 10, 15, 6, true)); s->push_back(CreateHalfSegment(0, 1, 15, 6, 13, 12, false)); s->push_back(CreateHalfSegment(0, 2, 13, 12, 10, 10, false)); s->push_back(CreateHalfSegment(1, 10, 14.5, 7.5, 13, 9, true)); s->push_back(CreateHalfSegment(1, 11, 13, 9, 14, 9, false)); s->push_back(CreateHalfSegment(1, 12, 14, 9, 14.5, 7.5, false)); s = &unionResult; s->push_back(CreateHalfSegment(0, 1, 10, 10, 13, 12, false)); s->push_back(CreateHalfSegment(0, 2, 10, 10, 15, 6, true)); s->push_back(CreateHalfSegment(0, 3, 13, 12, 14, 9, false)); s->push_back(CreateHalfSegment(0, 4, 14, 9, 14.5, 7.5, false)); s->push_back(CreateHalfSegment(0, 5, 14.5, 7.5, 15, 6, false)); s = &intersectionResult; s->push_back(CreateHalfSegment(0, 1, 13, 9, 14, 9, false)); s->push_back(CreateHalfSegment(0, 2, 13, 9, 14.5, 7.5, true)); s->push_back(CreateHalfSegment(0, 3, 14, 9, 14.5, 7.5, false)); s = &differenceResult; s->push_back(CreateHalfSegment(0, 1, 10, 10, 13, 12, false)); s->push_back(CreateHalfSegment(0, 2, 10, 10, 15, 6, true)); s->push_back(CreateHalfSegment(0, 3, 13, 9, 14, 9, true)); s->push_back(CreateHalfSegment(0, 4, 13, 9, 14.5, 7.5, false)); s->push_back(CreateHalfSegment(0, 5, 13, 12, 14, 9, false)); s->push_back(CreateHalfSegment(0, 6, 14.5, 7.5, 15, 6, false)); TestInternal(source, 1, NULL, unionResult, intersectionResult, differenceResult, differenceRevResult); } /* 1.1 Test case 6 */ void RegionRegionTest6() { vector source; vector unionResult; vector intersectionResult; vector differenceResult; vector differenceRevResult; vector* s = &source; s->push_back(CreateHalfSegment(0, 0, 10, 10, 15, 6, true)); s->push_back(CreateHalfSegment(0, 1, 15, 6, 13, 12, false)); s->push_back(CreateHalfSegment(0, 2, 13, 12, 10, 10, false)); s->push_back(CreateHalfSegment(1, 10, 16, 3, 15, 9, false)); s->push_back(CreateHalfSegment(1, 11, 15, 9, 14, 9, false)); s->push_back(CreateHalfSegment(1, 12, 14, 9, 16, 3, true)); s = &unionResult; s->push_back(CreateHalfSegment(0, 1, 10, 10, 13, 12, false)); s->push_back(CreateHalfSegment(0, 2, 10, 10, 15, 6, true)); s->push_back(CreateHalfSegment(0, 3, 13, 12, 14, 9, false)); s->push_back(CreateHalfSegment(0, 4, 14, 9, 15, 9, false)); s->push_back(CreateHalfSegment(0, 5, 15, 6, 16, 3, true)); s->push_back(CreateHalfSegment(0, 6, 15, 9, 16, 3, false)); s = &differenceResult; s->push_back(CreateHalfSegment(0, 1, 10, 10, 13, 12, false)); s->push_back(CreateHalfSegment(0, 2, 10, 10, 15, 6, true)); s->push_back(CreateHalfSegment(0, 3, 13, 12, 14, 9, false)); s->push_back(CreateHalfSegment(0, 4, 14, 9, 15, 6, false)); s = &differenceRevResult; s->push_back(CreateHalfSegment(0, 1, 14, 9, 15, 6, true)); s->push_back(CreateHalfSegment(0, 2, 14, 9, 15, 9, false)); s->push_back(CreateHalfSegment(0, 3, 15, 6, 16, 3, true)); s->push_back(CreateHalfSegment(0, 4, 15, 9, 16, 3, false)); TestInternal(source, 1, NULL, unionResult, intersectionResult, differenceResult, differenceRevResult); } /* 1.1 Test case 7 */ void RegionRegionTest7() { vector source; vector unionResult; vector intersectionResult; vector differenceResult; vector differenceRevResult; vector* s = &source; s->push_back(CreateHalfSegment(0, 0, 10, 10, 15, 6, true)); s->push_back(CreateHalfSegment(0, 1, 15, 6, 13, 11, false)); s->push_back(CreateHalfSegment(0, 2, 13, 11, 10, 10, false)); s->push_back(CreateHalfSegment(1, 10, 16, 3, 15, 9, false)); s->push_back(CreateHalfSegment(1, 11, 15, 9, 14, 9, false)); s->push_back(CreateHalfSegment(1, 12, 14, 9, 16, 3, true)); s = &unionResult; s->push_back(CreateHalfSegment(0, 1, 10, 10, 13, 11, false)); s->push_back(CreateHalfSegment(0, 2, 10, 10, 15, 6, true)); s->push_back(CreateHalfSegment(0, 3, 13, 11, 15, 6, false)); s->push_back(CreateHalfSegment(0, 4, 14, 9, 15, 6, true)); s->push_back(CreateHalfSegment(0, 5, 14, 9, 15, 9, false)); s->push_back(CreateHalfSegment(0, 6, 15, 6, 16, 3, true)); s->push_back(CreateHalfSegment(0, 7, 15, 9, 16, 3, false)); s = &differenceResult; s->push_back(CreateHalfSegment(0, 1, 10, 10, 13, 11, false)); s->push_back(CreateHalfSegment(0, 2, 10, 10, 15, 6, true)); s->push_back(CreateHalfSegment(0, 3, 13, 11, 15, 6, false)); s = &differenceRevResult; s->push_back(CreateHalfSegment(0, 1, 14, 9, 15, 6, true)); s->push_back(CreateHalfSegment(0, 2, 14, 9, 15, 9, false)); s->push_back(CreateHalfSegment(0, 3, 15, 6, 16, 3, true)); s->push_back(CreateHalfSegment(0, 4, 15, 9, 16, 3, false)); TestInternal(source, 1, NULL, unionResult, intersectionResult, differenceResult, differenceRevResult); } /* 1.1 Test case 8 */ void RegionRegionTest8() { vector source; vector unionResult; vector intersectionResult; vector differenceResult; vector differenceRevResult; vector* s = &source; s->push_back(CreateHalfSegment(0, 0, 10, 10, 15, 6, true)); s->push_back(CreateHalfSegment(0, 2, 13, 12, 10, 10, false)); s->push_back(CreateHalfSegment(0, 3, 15, 6, 14, 9, false)); s->push_back(CreateHalfSegment(0, 4, 14, 9, 13, 12, false)); s->push_back(CreateHalfSegment(1, 10, 13, 8, 16, 9, true)); s->push_back(CreateHalfSegment(1, 11, 16, 9, 14, 9, false)); s->push_back(CreateHalfSegment(1, 12, 14, 9, 13, 8, false)); s = &unionResult; s->push_back(CreateHalfSegment(0, 1, 10, 10, 13, 12, false)); s->push_back(CreateHalfSegment(0, 2, 10, 10, 15, 6, true)); s->push_back(CreateHalfSegment(0, 3, 13, 12, 14, 9, false)); s->push_back(CreateHalfSegment(0, 4, 14, 9, 16, 9, false)); s->push_back(CreateHalfSegment(0, 5, 14.2, 8.4, 15, 6, false)); s->push_back(CreateHalfSegment(0, 6, 14.2, 8.4, 16, 9, true)); s = &intersectionResult; s->push_back(CreateHalfSegment(0, 1, 13, 8, 14, 9, false)); s->push_back(CreateHalfSegment(0, 2, 13, 8, 14.2, 8.4, true)); s->push_back(CreateHalfSegment(0, 3, 14, 9, 14.2, 8.4, false)); s = &differenceResult; s->push_back(CreateHalfSegment(0, 1, 10, 10, 13, 12, false)); s->push_back(CreateHalfSegment(0, 2, 10, 10, 15, 6, true)); s->push_back(CreateHalfSegment(0, 3, 13, 8, 14, 9, true)); s->push_back(CreateHalfSegment(0, 4, 13, 8, 14.2, 8.4, false)); s->push_back(CreateHalfSegment(0, 5, 13, 12, 14, 9, false)); s->push_back(CreateHalfSegment(0, 6, 14.2, 8.4, 15, 6, false)); s = &differenceRevResult; s->push_back(CreateHalfSegment(0, 1, 14, 9, 14.2, 8.4, true)); s->push_back(CreateHalfSegment(0, 2, 14, 9, 16, 9, false)); s->push_back(CreateHalfSegment(0, 3, 14.2, 8.4, 16, 9, true)); TestInternal(source, 1, NULL, unionResult, intersectionResult, differenceResult, differenceRevResult); } /* 1.1 Test case 9 */ void RegionRegionTest9() { vector source; vector unionResult; vector intersectionResult; vector differenceResult; vector differenceRevResult; vector* s = &source; s->push_back(CreateHalfSegment(0, 1, 5, 10, 7.5, 14.3, false)); s->push_back(CreateHalfSegment(0, 2, 7.5, 14.3, 12.5, 14.3, false)); s->push_back(CreateHalfSegment(0, 3, 12.5, 14.3, 15, 10, false)); s->push_back(CreateHalfSegment(0, 5, 5, 10, 15, 10, true)); s->push_back(CreateHalfSegment(1, 11, 8, 10, 10.5, 14.3, false)); s->push_back(CreateHalfSegment(1, 12, 10.5, 14.3, 15.5, 14.3, false)); s->push_back(CreateHalfSegment(1, 13, 15.5, 14.3, 18, 10, false)); s->push_back(CreateHalfSegment(1, 15, 8, 10, 18, 10, true)); s = &unionResult; s->push_back(CreateHalfSegment(0, 1, 5, 10, 7.5, 14.3, false)); s->push_back(CreateHalfSegment(0, 2, 5, 10, 8, 10, true)); s->push_back(CreateHalfSegment(0, 3, 7.5, 14.3, 10.5, 14.3, false)); s->push_back(CreateHalfSegment(0, 4, 8, 10, 15, 10, true)); s->push_back(CreateHalfSegment(0, 5, 10.5, 14.3, 12.5, 14.3, false)); s->push_back(CreateHalfSegment(0, 6, 12.5, 14.3, 15.5, 14.3, false)); s->push_back(CreateHalfSegment(0, 7, 15, 10, 18, 10, true)); s->push_back(CreateHalfSegment(0, 8, 15.5, 14.3, 18, 10, false)); s = &intersectionResult; s->push_back(CreateHalfSegment(0, 1, 8, 10, 10.5, 14.3, false)); s->push_back(CreateHalfSegment(0, 2, 8, 10, 15, 10, true)); s->push_back(CreateHalfSegment(0, 3, 10.5, 14.3, 12.5, 14.3, false)); s->push_back(CreateHalfSegment(0, 4, 12.5, 14.3, 15, 10, false)); s = &differenceResult; s->push_back(CreateHalfSegment(0, 1, 5, 10, 7.5, 14.3, false)); s->push_back(CreateHalfSegment(0, 2, 5, 10, 8, 10, true)); s->push_back(CreateHalfSegment(0, 3, 7.5, 14.3, 10.5, 14.3, false)); s->push_back(CreateHalfSegment(0, 4, 8, 10, 10.5, 14.3, true)); s = &differenceRevResult; s->push_back(CreateHalfSegment(0, 1, 12.5, 14.3, 15, 10, true)); s->push_back(CreateHalfSegment(0, 2, 12.5, 14.3, 15.5, 14.3, false)); s->push_back(CreateHalfSegment(0, 3, 15, 10, 18, 10, true)); s->push_back(CreateHalfSegment(0, 4, 15.5, 14.3, 18, 10, false)); TestInternal(source, 1, NULL, unionResult, intersectionResult, differenceResult, differenceRevResult); } /* 1.1 Test case 10 */ void RegionRegionTest10() { vector source; vector < vector < HalfSegment >> unionResult; vector < vector < HalfSegment >> intersectionResult; vector < vector < HalfSegment >> differenceResult; vector < vector < HalfSegment >> differenceRevResult; vector* s = &source; s->push_back(CreateHalfSegment(0, 0, 10, 10, 15, 6, true)); s->push_back(CreateHalfSegment(0, 1, 15, 6, 13, 12, false)); s->push_back(CreateHalfSegment(0, 2, 13, 12, 10, 10, false)); s->push_back(CreateHalfSegment(1, 10, 13, 8, 16, 9, true)); s->push_back(CreateHalfSegment(1, 11, 16, 9, 14, 9, false)); s->push_back(CreateHalfSegment(1, 12, 14, 9, 13, 8, false)); s = new vector(); s->push_back(CreateHalfSegment(0, 1, 10, 10, 13, 8, true)); s->push_back(CreateHalfSegment(0, 2, 10, 10, 13, 12, false)); s->push_back(CreateHalfSegment(0, 3, 13, 8, 15, 6, true)); s->push_back(CreateHalfSegment(0, 4, 13, 12, 14, 9, false)); s->push_back(CreateHalfSegment(0, 5, 14, 8, 15, 6, false)); s->push_back(CreateHalfSegment(0, 6, 14, 8, 16, 9, true)); s->push_back(CreateHalfSegment(0, 7, 14, 9, 16, 9, false)); unionResult.push_back(*s); delete s; s = new vector(); s->push_back(CreateHalfSegment(0, 1, 15, 6, 14, 8, false)); s->push_back(CreateHalfSegment(0, 2, 15, 6, 13, 8, true)); s->push_back(CreateHalfSegment(0, 3, 14, 8, 14, 9, true)); s->push_back(CreateHalfSegment(0, 4, 14, 9, 13, 12, false)); s->push_back(CreateHalfSegment(0, 5, 13, 8, 10, 10, true)); s->push_back(CreateHalfSegment(0, 6, 13, 12, 10, 10, false)); unionResult.push_back(*s); delete s; s = new vector(); s->push_back(CreateHalfSegment(0, 1, 13, 8, 14, 8, true)); s->push_back(CreateHalfSegment(0, 2, 13, 8, 14, 9, false)); s->push_back(CreateHalfSegment(0, 3, 14, 9, 14, 8, true)); intersectionResult.push_back(*s); delete s; s = new vector(); intersectionResult.push_back(*s); delete s; s = new vector(); s->push_back(CreateHalfSegment(0, 1, 10, 10, 13, 8, true)); s->push_back(CreateHalfSegment(0, 2, 10, 10, 13, 12, false)); s->push_back(CreateHalfSegment(0, 3, 13, 8, 14, 8, false)); s->push_back(CreateHalfSegment(0, 4, 13, 8, 14, 9, true)); s->push_back(CreateHalfSegment(0, 5, 13, 8, 15, 6, true)); s->push_back(CreateHalfSegment(0, 6, 13, 12, 14, 9, false)); s->push_back(CreateHalfSegment(0, 7, 14, 8, 15, 6, false)); differenceResult.push_back(*s); delete s; s = new vector(); s->push_back(CreateHalfSegment(0, 1, 10, 10, 13, 12, false)); s->push_back(CreateHalfSegment(0, 2, 10, 10, 13, 8, true)); s->push_back(CreateHalfSegment(0, 3, 13, 12, 14, 9, false)); s->push_back(CreateHalfSegment(0, 4, 13, 8, 15, 6, true)); s->push_back(CreateHalfSegment(0, 5, 14, 9, 14, 8, true)); s->push_back(CreateHalfSegment(0, 6, 14, 8, 15, 6, false)); differenceResult.push_back(*s); delete s; s = new vector(); s->push_back(CreateHalfSegment(0, 1, 14, 9, 14, 8, false)); s->push_back(CreateHalfSegment(0, 2, 14, 8, 16, 9, true)); s->push_back(CreateHalfSegment(0, 3, 14, 9, 16, 9, false)); differenceRevResult.push_back(*s); delete s; s = new vector(); differenceRevResult.push_back(*s); delete s; TestInternal(source, 0, NULL, unionResult, intersectionResult, differenceResult, differenceRevResult); } /* 1.1 Test case 11 */ void RegionRegionTest11() { vector source; vector unionResult; vector intersectionResult; vector differenceResult; vector differenceRevResult; vector* s = &source; s->push_back(CreateHalfSegment(0, 0, 10, 10, 15.2, 10, true)); s->push_back(CreateHalfSegment(0, 1, 15.2, 10, 15, 15, false)); s->push_back(CreateHalfSegment(0, 2, 15, 15, 10, 15, false)); s->push_back(CreateHalfSegment(0, 3, 10, 15, 10, 10, false)); s->push_back(CreateHalfSegment(1, 10, 13, 13, 18, 13, true)); s->push_back(CreateHalfSegment(1, 11, 18, 13, 18, 18, true)); s->push_back(CreateHalfSegment(1, 12, 18, 18, 13, 18, false)); s->push_back(CreateHalfSegment(1, 13, 13, 18, 13, 13, false)); s = &unionResult; s->push_back(CreateHalfSegment(0, 1, 10, 10, 10, 15, false)); s->push_back(CreateHalfSegment(0, 2, 10, 10, 15, 10, true)); s->push_back(CreateHalfSegment(0, 3, 10, 15, 13, 15, false)); s->push_back(CreateHalfSegment(0, 4, 13, 15, 13, 18, false)); s->push_back(CreateHalfSegment(0, 5, 13, 18, 18, 18, false)); s->push_back(CreateHalfSegment(0, 6, 15, 10, 15, 13, true)); s->push_back(CreateHalfSegment(0, 7, 15, 13, 18, 13, true)); s->push_back(CreateHalfSegment(0, 8, 18, 13, 18, 18, true)); s = &intersectionResult; s->push_back(CreateHalfSegment(0, 1, 13, 13, 13, 15, false)); s->push_back(CreateHalfSegment(0, 2, 13, 13, 15, 13, true)); s->push_back(CreateHalfSegment(0, 3, 13, 15, 15, 15, false)); s->push_back(CreateHalfSegment(0, 4, 15, 13, 15, 15, true)); s = &differenceResult; s->push_back(CreateHalfSegment(0, 1, 10, 10, 10, 15, false)); s->push_back(CreateHalfSegment(0, 2, 10, 10, 15, 10, true)); s->push_back(CreateHalfSegment(0, 3, 10, 15, 13, 15, false)); s->push_back(CreateHalfSegment(0, 4, 13, 13, 13, 15, true)); s->push_back(CreateHalfSegment(0, 5, 13, 13, 15, 13, false)); s->push_back(CreateHalfSegment(0, 6, 15, 10, 15, 13, true)); s = &differenceRevResult; s->push_back(CreateHalfSegment(0, 1, 13, 15, 13, 18, false)); s->push_back(CreateHalfSegment(0, 2, 13, 15, 15, 15, true)); s->push_back(CreateHalfSegment(0, 3, 13, 18, 18, 18, false)); s->push_back(CreateHalfSegment(0, 4, 15, 13, 15, 15, false)); s->push_back(CreateHalfSegment(0, 5, 15, 13, 18, 13, true)); s->push_back(CreateHalfSegment(0, 6, 18, 13, 18, 18, true)); InternalPointTransformation transformation(-10000, -10000, 2, 0, 1); TestInternal(source, 1, &transformation, unionResult, intersectionResult, differenceResult, differenceRevResult); } /* 1.1 Test case 12 */ void RegionRegionTest12() { vector source; vector unionResult; vector intersectionResult; vector differenceResult; vector differenceRevResult; vector* s = &source; s->push_back(CreateHalfSegment(0, 0, 10, 10, 14.8, 10, true)); s->push_back(CreateHalfSegment(0, 1, 14.8, 10, 15, 15, true)); s->push_back(CreateHalfSegment(0, 2, 15, 15, 10, 15, false)); s->push_back(CreateHalfSegment(0, 3, 10, 15, 10, 10, false)); s->push_back(CreateHalfSegment(1, 10, 13, 13, 18, 13, true)); s->push_back(CreateHalfSegment(1, 11, 18, 13, 18, 18, true)); s->push_back(CreateHalfSegment(1, 12, 18, 18, 13, 18, false)); s->push_back(CreateHalfSegment(1, 13, 13, 18, 13, 13, false)); s = &unionResult; s->push_back(CreateHalfSegment(0, 1, 10, 10, 10, 15, false)); s->push_back(CreateHalfSegment(0, 2, 10, 10, 15, 10, true)); s->push_back(CreateHalfSegment(0, 3, 10, 15, 13, 15, false)); s->push_back(CreateHalfSegment(0, 4, 13, 15, 13, 18, false)); s->push_back(CreateHalfSegment(0, 5, 13, 18, 18, 18, false)); s->push_back(CreateHalfSegment(0, 6, 15, 10, 15, 13, true)); s->push_back(CreateHalfSegment(0, 7, 15, 13, 18, 13, true)); s->push_back(CreateHalfSegment(0, 8, 18, 13, 18, 18, true)); s = &intersectionResult; s->push_back(CreateHalfSegment(0, 1, 13, 13, 13, 15, false)); s->push_back(CreateHalfSegment(0, 2, 13, 13, 15, 13, true)); s->push_back(CreateHalfSegment(0, 3, 13, 15, 15, 15, false)); s->push_back(CreateHalfSegment(0, 4, 15, 13, 15, 15, true)); s = &differenceResult; s->push_back(CreateHalfSegment(0, 1, 10, 10, 10, 15, false)); s->push_back(CreateHalfSegment(0, 2, 10, 10, 15, 10, true)); s->push_back(CreateHalfSegment(0, 3, 10, 15, 13, 15, false)); s->push_back(CreateHalfSegment(0, 4, 13, 13, 13, 15, true)); s->push_back(CreateHalfSegment(0, 5, 13, 13, 15, 13, false)); s->push_back(CreateHalfSegment(0, 6, 15, 10, 15, 13, true)); s = &differenceRevResult; s->push_back(CreateHalfSegment(0, 1, 13, 15, 13, 18, false)); s->push_back(CreateHalfSegment(0, 2, 13, 15, 15, 15, true)); s->push_back(CreateHalfSegment(0, 3, 13, 18, 18, 18, false)); s->push_back(CreateHalfSegment(0, 4, 15, 13, 15, 15, false)); s->push_back(CreateHalfSegment(0, 5, 15, 13, 18, 13, true)); s->push_back(CreateHalfSegment(0, 6, 18, 13, 18, 18, true)); InternalPointTransformation transformation(-10000, -10000, 2, 0, 1); TestInternal(source, 1, &transformation, unionResult, intersectionResult, differenceResult, differenceRevResult); } /* 1.1 Test case 13 */ void RegionRegionTest13() { vector source; vector unionResult; vector intersectionResult; vector differenceResult; vector differenceRevResult; vector* s = &source; s->push_back(CreateHalfSegment(0, 0, 8, 20, 9.7, 10, true)); s->push_back(CreateHalfSegment(0, 1, 8, 20, 9, 20, false)); s->push_back(CreateHalfSegment(0, 2, 9, 20, 9.7, 10, false)); s->push_back(CreateHalfSegment(1, 10, 10, 11, 10, 12, true)); s->push_back(CreateHalfSegment(1, 11, 9, 12, 10, 12, false)); s->push_back(CreateHalfSegment(1, 12, 9, 11, 9, 12, false)); s->push_back(CreateHalfSegment(1, 13, 9, 11, 10, 11, true)); s = &unionResult; s->push_back(CreateHalfSegment(0, 1, 8, 20, 9, 12, true)); s->push_back(CreateHalfSegment(0, 2, 8, 20, 9, 20, false)); s->push_back(CreateHalfSegment(0, 3, 9, 12, 9, 11, false)); s->push_back(CreateHalfSegment(0, 4, 9, 11, 10, 11, true)); s->push_back(CreateHalfSegment(0, 5, 9, 20, 10, 12, false)); s->push_back(CreateHalfSegment(0, 6, 10, 11, 10, 12, true)); s = &intersectionResult; s->push_back(CreateHalfSegment(0, 1, 9, 12, 9, 11, false)); s->push_back(CreateHalfSegment(0, 2, 9, 11, 10, 11, true)); s->push_back(CreateHalfSegment(0, 3, 9, 12, 10, 12, false)); s->push_back(CreateHalfSegment(0, 4, 10, 11, 10, 12, true)); s = &differenceResult; s->push_back(CreateHalfSegment(0, 1, 8, 20, 9, 12, true)); s->push_back(CreateHalfSegment(0, 2, 8, 20, 9, 20, false)); s->push_back(CreateHalfSegment(0, 3, 9, 12, 10, 12, true)); s->push_back(CreateHalfSegment(0, 4, 9, 20, 10, 12, false)); TestInternal(source, 0, NULL, unionResult, intersectionResult, differenceResult, differenceRevResult); } /* 1.1 Test case 14 */ void RegionRegionTest14() { vector source; vector < vector < HalfSegment >> unionResult; vector < vector < HalfSegment >> intersectionResult; vector < vector < HalfSegment >> differenceResult; vector < vector < HalfSegment >> differenceRevResult; vector* s = &source; s->push_back(CreateHalfSegment(0, 0, 10, 10, 15, 7, true)); s->push_back(CreateHalfSegment(0, 1, 14, 11, 15, 7, false)); s->push_back(CreateHalfSegment(0, 2, 10, 10, 14, 11, false)); s->push_back(CreateHalfSegment(1, 10, 13, 8, 16, 9, true)); s->push_back(CreateHalfSegment(1, 11, 12, 10, 16, 9, false)); s->push_back(CreateHalfSegment(1, 12, 12, 10, 13, 8, true)); s = new vector(); s->push_back(CreateHalfSegment(0, 1, 10, 10, 12, 10, false)); s->push_back(CreateHalfSegment(0, 2, 10, 10, 13, 8, true)); s->push_back(CreateHalfSegment(0, 3, 12, 10, 14, 11, false)); s->push_back(CreateHalfSegment(0, 4, 13, 8, 15, 7, true)); s->push_back(CreateHalfSegment(0, 5, 14, 11, 14, 9, true)); s->push_back(CreateHalfSegment(0, 6, 14, 9, 15, 9, false)); s->push_back(CreateHalfSegment(0, 7, 15, 9, 15, 7, true)); unionResult.push_back(*s); delete s; s = new vector(); s->push_back(CreateHalfSegment(0, 1, 12, 10, 13, 8, true)); s->push_back(CreateHalfSegment(0, 2, 12, 10, 14, 9, false)); s->push_back(CreateHalfSegment(0, 3, 13, 8, 15, 9, true)); s->push_back(CreateHalfSegment(0, 4, 14, 9, 15, 9, false)); intersectionResult.push_back(*s); delete s; s = new vector(); s->push_back(CreateHalfSegment(0, 1, 13, 8, 14, 9, true)); s->push_back(CreateHalfSegment(0, 2, 12, 10, 14, 9, false)); s->push_back(CreateHalfSegment(0, 3, 12, 10, 13, 8, true)); intersectionResult.push_back(*s); delete s; s = new vector(); s->push_back(CreateHalfSegment(0, 1, 10, 10, 12, 10, false)); s->push_back(CreateHalfSegment(0, 2, 10, 10, 13, 8, true)); s->push_back(CreateHalfSegment(0, 3, 12, 10, 13, 8, false)); s->push_back(CreateHalfSegment(0, 4, 12, 10, 14, 9, true)); s->push_back(CreateHalfSegment(0, 5, 12, 10, 14, 11, false)); s->push_back(CreateHalfSegment(0, 6, 13, 8, 15, 7, true)); s->push_back(CreateHalfSegment(0, 7, 13, 8, 15, 9, false)); s->push_back(CreateHalfSegment(0, 8, 14, 11, 14, 9, true)); s->push_back(CreateHalfSegment(0, 9, 15, 9, 15, 7, true)); differenceResult.push_back(*s); delete s; s = new vector(); s->push_back(CreateHalfSegment(0, 1, 15, 7, 15, 9, true)); s->push_back(CreateHalfSegment(0, 2, 13, 8, 15, 7, true)); s->push_back(CreateHalfSegment(0, 3, 14, 9, 15, 9, false)); s->push_back(CreateHalfSegment(0, 4, 14, 9, 14, 11, true)); s->push_back(CreateHalfSegment(0, 5, 13, 8, 14, 9, false)); s->push_back(CreateHalfSegment(0, 6, 12, 10, 14, 9, true)); s->push_back(CreateHalfSegment(0, 7, 12, 10, 14, 11, false)); s->push_back(CreateHalfSegment(0, 8, 12, 10, 13, 8, false)); s->push_back(CreateHalfSegment(0, 9, 10, 10, 13, 8, true)); s->push_back(CreateHalfSegment(0, 10, 10, 10, 12, 10, false)); differenceResult.push_back(*s); delete s; s = new vector(); differenceRevResult.push_back(*s); delete s; TestInternal(source, 0, NULL, unionResult, intersectionResult, differenceResult, differenceRevResult); } /* 1.1 Test case 15 */ void RegionRegionTest15() { vector source; vector < vector < HalfSegment >> unionResult; vector < vector < HalfSegment >> intersectionResult; vector < vector < HalfSegment >> differenceResult; vector < vector < HalfSegment >> differenceRevResult; vector* s = &source; s->push_back(CreateHalfSegment(0, 0, 10, 10, 15, 7, true)); s->push_back(CreateHalfSegment(0, 1, 14, 11, 15, 7, false)); s->push_back(CreateHalfSegment(0, 2, 10, 10, 14, 11, false)); s->push_back(CreateHalfSegment(1, 10, 13, 9, 16, 9, true)); s->push_back(CreateHalfSegment(1, 11, 12, 10, 16, 9, false)); s->push_back(CreateHalfSegment(1, 12, 12, 10, 13, 9, true)); s = new vector(); s->push_back(CreateHalfSegment(0, 1, 10, 10, 12, 10, false)); s->push_back(CreateHalfSegment(0, 2, 10, 10, 13, 9, true)); s->push_back(CreateHalfSegment(0, 3, 12, 10, 14, 11, false)); s->push_back(CreateHalfSegment(0, 4, 13, 9, 15, 7, true)); s->push_back(CreateHalfSegment(0, 5, 14, 11, 14, 9, true)); s->push_back(CreateHalfSegment(0, 6, 14, 9, 15, 9, false)); s->push_back(CreateHalfSegment(0, 7, 15, 9, 15, 7, true)); unionResult.push_back(*s); delete s; s = new vector(); s->push_back(CreateHalfSegment(0, 1, 10, 10, 12, 10, false)); s->push_back(CreateHalfSegment(0, 2, 10, 10, 15, 7, true)); s->push_back(CreateHalfSegment(0, 3, 12, 10, 14, 11, false)); s->push_back(CreateHalfSegment(0, 4, 14, 9, 14, 11, true)); s->push_back(CreateHalfSegment(0, 5, 14, 9, 15, 9, false)); s->push_back(CreateHalfSegment(0, 6, 15, 7, 15, 9, true)); unionResult.push_back(*s); delete s; s = new vector(); s->push_back(CreateHalfSegment(0, 1, 14, 9, 15, 7, false)); s->push_back(CreateHalfSegment(0, 2, 10, 10, 15, 7, true)); s->push_back(CreateHalfSegment(0, 3, 14, 9, 14, 11, true)); s->push_back(CreateHalfSegment(0, 4, 12, 10, 14, 11, false)); s->push_back(CreateHalfSegment(0, 5, 10, 10, 12, 10, false)); unionResult.push_back(*s); delete s; s = new vector(); s->push_back(CreateHalfSegment(0, 1, 12, 10, 13, 9, true)); s->push_back(CreateHalfSegment(0, 2, 12, 10, 14, 9, false)); s->push_back(CreateHalfSegment(0, 3, 13, 9, 14, 9, true)); intersectionResult.push_back(*s); delete s; s = new vector(); intersectionResult.push_back(*s); delete s; s = new vector(); s->push_back(CreateHalfSegment(0, 1, 10, 10, 12, 10, false)); s->push_back(CreateHalfSegment(0, 2, 10, 10, 13, 9, true)); s->push_back(CreateHalfSegment(0, 3, 12, 10, 13, 9, false)); s->push_back(CreateHalfSegment(0, 4, 12, 10, 14, 9, true)); s->push_back(CreateHalfSegment(0, 5, 12, 10, 14, 11, false)); s->push_back(CreateHalfSegment(0, 6, 13, 9, 14, 9, false)); s->push_back(CreateHalfSegment(0, 7, 13, 9, 15, 7, true)); s->push_back(CreateHalfSegment(0, 8, 14, 11, 14, 9, true)); s->push_back(CreateHalfSegment(0, 9, 14, 9, 15, 9, false)); s->push_back(CreateHalfSegment(0, 10, 15, 9, 15, 7, true)); differenceResult.push_back(*s); delete s; s = new vector(); s->push_back(CreateHalfSegment(0, 1, 10, 10, 12, 10, false)); s->push_back(CreateHalfSegment(0, 2, 10, 10, 15, 7, true)); s->push_back(CreateHalfSegment(0, 3, 12, 10, 13, 9, false)); s->push_back(CreateHalfSegment(0, 4, 12, 10, 14, 11, false)); s->push_back(CreateHalfSegment(0, 5, 12, 10, 14, 9, true)); s->push_back(CreateHalfSegment(0, 6, 13, 9, 14, 9, false)); s->push_back(CreateHalfSegment(0, 7, 14, 9, 14, 11, true)); s->push_back(CreateHalfSegment(0, 8, 14, 9, 15, 9, false)); s->push_back(CreateHalfSegment(0, 9, 15, 7, 15, 9, true)); differenceResult.push_back(*s); delete s; s = new vector(); s->push_back(CreateHalfSegment(0, 1, 14, 9, 15, 7, false)); s->push_back(CreateHalfSegment(0, 2, 10, 10, 15, 7, true)); s->push_back(CreateHalfSegment(0, 3, 14, 9, 14, 11, true)); s->push_back(CreateHalfSegment(0, 4, 13, 9, 14, 9, false)); s->push_back(CreateHalfSegment(0, 5, 12, 10, 14, 9, true)); s->push_back(CreateHalfSegment(0, 6, 12, 10, 14, 11, false)); s->push_back(CreateHalfSegment(0, 7, 12, 10, 13, 9, false)); s->push_back(CreateHalfSegment(0, 8, 10, 10, 12, 10, false)); differenceResult.push_back(*s); delete s; s = new vector(); differenceRevResult.push_back(*s); delete s; TestInternal(source, 0, NULL, unionResult, intersectionResult, differenceResult, differenceRevResult); } /* 1.1 Test case 16 */ void RegionRegionTest16() { vector source; vector < vector < HalfSegment >> unionResult; vector < vector < HalfSegment >> intersectionResult; vector < vector < HalfSegment >> differenceResult; vector < vector < HalfSegment >> differenceRevResult; vector* s = &source; s->push_back(CreateHalfSegment(0, 0, 10, 10, 14, 7, true)); s->push_back(CreateHalfSegment(0, 1, 14, 7, 15, 11, true)); s->push_back(CreateHalfSegment(0, 2, 10, 10, 15, 11, false)); s->push_back(CreateHalfSegment(1, 10, 13, 9, 16, 9, true)); s->push_back(CreateHalfSegment(1, 11, 12, 10, 16, 9, false)); s->push_back(CreateHalfSegment(1, 12, 12, 10, 13, 9, true)); s = new vector(); s->push_back(CreateHalfSegment(0, 1, 10, 10, 12, 10, false)); s->push_back(CreateHalfSegment(0, 2, 10, 10, 14, 7, true)); s->push_back(CreateHalfSegment(0, 3, 12, 10, 15, 11, false)); s->push_back(CreateHalfSegment(0, 4, 14, 7, 15, 9, true)); s->push_back(CreateHalfSegment(0, 5, 15, 9, 15, 11, true)); unionResult.push_back(*s); delete s; s = new vector(); s->push_back(CreateHalfSegment(0, 1, 15, 9, 15, 11, true)); s->push_back(CreateHalfSegment(0, 2, 14, 9, 15, 9, true)); s->push_back(CreateHalfSegment(0, 3, 12, 10, 15, 11, false)); s->push_back(CreateHalfSegment(0, 4, 14, 7, 14, 9, true)); s->push_back(CreateHalfSegment(0, 5, 10, 10, 14, 7, true)); s->push_back(CreateHalfSegment(0, 6, 10, 10, 12, 10, false)); unionResult.push_back(*s); delete s; s = new vector(); unionResult.push_back(*s); delete s; s = new vector(); s->push_back(CreateHalfSegment(0, 1, 12, 10, 13, 9, true)); s->push_back(CreateHalfSegment(0, 2, 12, 10, 15, 9, false)); s->push_back(CreateHalfSegment(0, 3, 13, 9, 15, 9, true)); intersectionResult.push_back(*s); delete s; s = new vector(); s->push_back(CreateHalfSegment(0, 1, 13, 9, 14, 9, true)); s->push_back(CreateHalfSegment(0, 2, 12, 10, 14, 9, false)); s->push_back(CreateHalfSegment(0, 3, 12, 10, 13, 9, true)); intersectionResult.push_back(*s); delete s; s = new vector(); s->push_back(CreateHalfSegment(0, 1, 10, 10, 12, 10, false)); s->push_back(CreateHalfSegment(0, 2, 10, 10, 14, 7, true)); s->push_back(CreateHalfSegment(0, 3, 12, 10, 13, 9, false)); s->push_back(CreateHalfSegment(0, 4, 12, 10, 15, 9, true)); s->push_back(CreateHalfSegment(0, 5, 12, 10, 15, 11, false)); s->push_back(CreateHalfSegment(0, 6, 13, 9, 15, 9, false)); s->push_back(CreateHalfSegment(0, 7, 14, 7, 15, 9, true)); s->push_back(CreateHalfSegment(0, 8, 15, 9, 15, 11, true)); differenceResult.push_back(*s); delete s; s = new vector(); s->push_back(CreateHalfSegment(0, 1, 15, 9, 15, 11, true)); s->push_back(CreateHalfSegment(0, 2, 14, 9, 15, 9, true)); s->push_back(CreateHalfSegment(0, 3, 12, 10, 15, 11, false)); s->push_back(CreateHalfSegment(0, 4, 14, 7, 14, 9, true)); s->push_back(CreateHalfSegment(0, 5, 10, 10, 14, 7, true)); s->push_back(CreateHalfSegment(0, 6, 13, 9, 14, 9, false)); s->push_back(CreateHalfSegment(0, 7, 12, 10, 14, 9, true)); s->push_back(CreateHalfSegment(0, 8, 12, 10, 13, 9, false)); s->push_back(CreateHalfSegment(0, 9, 10, 10, 12, 10, false)); differenceResult.push_back(*s); delete s; s = new vector(); differenceRevResult.push_back(*s); delete s; TestInternal(source, 0, NULL, unionResult, intersectionResult, differenceResult, differenceRevResult); } /* 1.1 Test case 17 */ void RegionRegionTest17() { vector source; vector unionResult; vector intersectionResult; vector differenceResult; vector differenceRevResult; vector* s = &source; s->push_back(CreateHalfSegment(0, 0, 1, 1, 3, 2, true)); s->push_back(CreateHalfSegment(0, 1, 3, 2, 8, 6, true)); s->push_back(CreateHalfSegment(0, 2, 1, 1, 8, 6, false)); s->push_back(CreateHalfSegment(1, 10, 1, 1, 9, 1, true)); s->push_back(CreateHalfSegment(1, 11, 7, 4, 9, 1, false)); s->push_back(CreateHalfSegment(1, 12, 1, 1, 7, 4, false)); s = &unionResult; s->push_back(CreateHalfSegment(0, 1, 1, 1, 3, 2, false)); s->push_back(CreateHalfSegment(0, 2, 1, 1, 9, 1, true)); s->push_back(CreateHalfSegment(0, 3, 3, 2, 7, 4, false)); s->push_back(CreateHalfSegment(0, 4, 7, 4, 9, 1, false)); s = &differenceRevResult; s->push_back(CreateHalfSegment(0, 1, 1, 1, 3, 2, false)); s->push_back(CreateHalfSegment(0, 2, 1, 1, 9, 1, true)); s->push_back(CreateHalfSegment(0, 3, 3, 2, 7, 4, false)); s->push_back(CreateHalfSegment(0, 4, 7, 4, 9, 1, false)); TestInternal(source, 0, NULL, unionResult, intersectionResult, differenceResult, differenceRevResult); } /* 1.1 Test case 18 */ void RegionRegionTest18() { vector source; vector unionResult; vector intersectionResult; vector differenceResult; vector differenceRevResult; vector* s = &source; s->push_back(CreateHalfSegment(0, 0, 3, 4, 6, 1, true)); s->push_back(CreateHalfSegment(0, 1, 4, 5, 6, 1, false)); s->push_back(CreateHalfSegment(0, 2, 3, 4, 4, 5, false)); s->push_back(CreateHalfSegment(1, 10, 3, 4, 6, 7, false)); s->push_back(CreateHalfSegment(1, 11, 3, 4, 10, 6, true)); s->push_back(CreateHalfSegment(1, 12, 6, 7, 10, 6, false)); s = &unionResult; s->push_back(CreateHalfSegment(0, 1, 3, 4, 4, 5, false)); s->push_back(CreateHalfSegment(0, 2, 3, 4, 6, 1, true)); s->push_back(CreateHalfSegment(0, 3, 4, 5, 6, 7, false)); s->push_back(CreateHalfSegment(0, 4, 4.3, 4.4, 6, 1, false)); s->push_back(CreateHalfSegment(0, 5, 4.3, 4.4, 10, 6, true)); s->push_back(CreateHalfSegment(0, 6, 6, 7, 10, 6, false)); s = &intersectionResult; s->push_back(CreateHalfSegment(0, 1, 3, 4, 4, 5, false)); s->push_back(CreateHalfSegment(0, 2, 3, 4, 4.3, 4.4, true)); s->push_back(CreateHalfSegment(0, 3, 4, 5, 4.3, 4.4, false)); s = &differenceResult; s->push_back(CreateHalfSegment(0, 1, 3, 4, 4.3, 4.4, false)); s->push_back(CreateHalfSegment(0, 2, 3, 4, 6, 1, true)); s->push_back(CreateHalfSegment(0, 3, 4.3, 4.4, 6, 1, false)); s = &differenceRevResult; s->push_back(CreateHalfSegment(0, 1, 4, 5, 4.3, 4.4, true)); s->push_back(CreateHalfSegment(0, 2, 4, 5, 6, 7, false)); s->push_back(CreateHalfSegment(0, 3, 4.3, 4.4, 10, 6, true)); s->push_back(CreateHalfSegment(0, 4, 6, 7, 10, 6, false)); TestInternal(source, 1, NULL, unionResult, intersectionResult, differenceResult, differenceRevResult); } /* 1.1 Test case 19 */ void RegionRegionTest19() { vector source; vector unionResult; vector intersectionResult; vector differenceResult; vector differenceRevResult; vector* s = &source; s->push_back(CreateHalfSegment(0, 0, 2, 1, 8, 10, true)); s->push_back(CreateHalfSegment(0, 1, 2, 1, 5, 6, false)); s->push_back(CreateHalfSegment(0, 2, 5, 6, 8, 10, false)); s->push_back(CreateHalfSegment(1, 10, 0, 4, 6, 7, false)); s->push_back(CreateHalfSegment(1, 11, 0, 4, 4, 4, true)); s->push_back(CreateHalfSegment(1, 12, 4, 4, 6, 7, true)); s = &unionResult; s->push_back(CreateHalfSegment(0, 1, 0, 4, 4, 4, true)); s->push_back(CreateHalfSegment(0, 2, 0, 4, 5, 6, false)); s->push_back(CreateHalfSegment(0, 3, 4, 4, 5, 6, true)); s = &differenceRevResult; s->push_back(CreateHalfSegment(0, 1, 0, 4, 4, 4, true)); s->push_back(CreateHalfSegment(0, 2, 0, 4, 5, 6, false)); s->push_back(CreateHalfSegment(0, 3, 4, 4, 5, 6, true)); TestInternal(source, 0, NULL, unionResult, intersectionResult, differenceResult, differenceRevResult); } /* 1.1 Test case 20 */ void RegionRegionTest20() { vector source; vector unionResult; vector intersectionResult; vector differenceResult; vector differenceRevResult; vector* s = &source; s->push_back(CreateHalfSegment(0, 0, 3, 4, 6, 1, true)); s->push_back(CreateHalfSegment(0, 1, 4, 5, 6, 1, false)); s->push_back(CreateHalfSegment(0, 2, 3, 4, 4, 5, false)); s->push_back(CreateHalfSegment(0, 4, 1, 4, 4, 1, true)); s->push_back(CreateHalfSegment(0, 5, 2, 5, 4, 1, false)); s->push_back(CreateHalfSegment(0, 6, 1, 4, 2, 5, false)); s->push_back(CreateHalfSegment(1, 10, 2, 3, 6, 7, false)); s->push_back(CreateHalfSegment(1, 11, 2, 3, 10, 6, true)); s->push_back(CreateHalfSegment(1, 12, 6, 7, 10, 6, false)); s = &unionResult; s->push_back(CreateHalfSegment(0, 1, 1, 4, 2, 3, true)); s->push_back(CreateHalfSegment(0, 2, 1, 4, 2, 5, false)); s->push_back(CreateHalfSegment(0, 3, 2, 3, 4, 1, true)); s->push_back(CreateHalfSegment(0, 4, 2, 5, 2.7, 3.7, false)); s->push_back(CreateHalfSegment(0, 5, 2.7, 3.7, 3, 4, false)); s->push_back(CreateHalfSegment(0, 6, 2.8, 3.3, 3.5, 3.5, true)); s->push_back(CreateHalfSegment(0, 7, 2.8, 3.3, 4, 1, false)); s->push_back(CreateHalfSegment(0, 8, 3, 4, 4, 5, false)); s->push_back(CreateHalfSegment(0, 9, 3.5, 3.5, 6, 1, true)); s->push_back(CreateHalfSegment(0, 10, 4, 5, 6, 7, false)); s->push_back(CreateHalfSegment(0, 11, 4.5, 3.9, 6, 1, false)); s->push_back(CreateHalfSegment(0, 12, 4.5, 3.9, 10, 6, true)); s->push_back(CreateHalfSegment(0, 13, 6, 7, 10, 6, false)); s = &intersectionResult; s->push_back(CreateHalfSegment(0, 1, 2, 3, 2.7, 3.7, false)); s->push_back(CreateHalfSegment(0, 2, 2, 3, 2.8, 3.3, true)); s->push_back(CreateHalfSegment(0, 3, 2.7, 3.7, 2.8, 3.3, false)); s->push_back(CreateHalfSegment(0, 4, 3, 4, 3.5, 3.5, true)); s->push_back(CreateHalfSegment(0, 5, 3, 4, 4, 5, false)); s->push_back(CreateHalfSegment(0, 6, 3.5, 3.5, 4.5, 3.9, true)); s->push_back(CreateHalfSegment(0, 7, 4, 5, 4.5, 3.9, false)); s = &differenceResult; s->push_back(CreateHalfSegment(0, 1, 1, 4, 2, 3, true)); s->push_back(CreateHalfSegment(0, 2, 1, 4, 2, 5, false)); s->push_back(CreateHalfSegment(0, 3, 2, 3, 2.7, 3.7, true)); s->push_back(CreateHalfSegment(0, 4, 2, 3, 2.8, 3.3, false)); s->push_back(CreateHalfSegment(0, 5, 2, 3, 4, 1, true)); s->push_back(CreateHalfSegment(0, 6, 2, 5, 2.7, 3.7, false)); s->push_back(CreateHalfSegment(0, 7, 2.8, 3.3, 4, 1, false)); s->push_back(CreateHalfSegment(0, 8, 3.5, 3.5, 4.5, 3.9, false)); s->push_back(CreateHalfSegment(0, 9, 3.5, 3.5, 6, 1, true)); s->push_back(CreateHalfSegment(0, 10, 4.5, 3.9, 6, 1, false)); s = &differenceRevResult; s->push_back(CreateHalfSegment(0, 1, 2.7, 3.7, 2.8, 3.3, true)); s->push_back(CreateHalfSegment(0, 2, 2.7, 3.7, 3, 4, false)); s->push_back(CreateHalfSegment(0, 3, 2.8, 3.3, 3.5, 3.5, true)); s->push_back(CreateHalfSegment(0, 4, 3, 4, 3.5, 3.5, false)); s->push_back(CreateHalfSegment(0, 5, 4, 5, 4.5, 3.9, true)); s->push_back(CreateHalfSegment(0, 6, 4, 5, 6, 7, false)); s->push_back(CreateHalfSegment(0, 7, 4.5, 3.9, 10, 6, true)); s->push_back(CreateHalfSegment(0, 8, 6, 7, 10, 6, false)); TestInternal(source, 1, NULL, unionResult, intersectionResult, differenceResult, differenceRevResult); } /* 1.1 Test case 21 */ void RegionRegionTest21() { vector source; vector unionResult; vector intersectionResult; vector differenceResult; vector differenceRevResult; vector* s = &source; s->push_back(CreateHalfSegment(0, 0, 1, 9, 4, 4, true)); s->push_back(CreateHalfSegment(0, 1, 1, 9, 8, 9, false)); s->push_back(CreateHalfSegment(0, 2, 4, 4, 5, 5, true)); s->push_back(CreateHalfSegment(0, 3, 5, 5, 7, 0, true)); s->push_back(CreateHalfSegment(0, 4, 6, 6, 7, 0, false)); s->push_back(CreateHalfSegment(0, 5, 6, 6, 8, 9, true)); s->push_back(CreateHalfSegment(1, 6, 1, 0, 1, 1, false)); s->push_back(CreateHalfSegment(1, 7, 1, 1, 9, 9, false)); s->push_back(CreateHalfSegment(1, 8, 1, 0, 9, 9, true)); s = &unionResult; s->push_back(CreateHalfSegment(0, 1, 1, 0, 1, 1, false)); s->push_back(CreateHalfSegment(0, 2, 1, 0, 5.1, 4.7, true)); s->push_back(CreateHalfSegment(0, 3, 1, 1, 4, 4, false)); s->push_back(CreateHalfSegment(0, 4, 1, 9, 4, 4, true)); s->push_back(CreateHalfSegment(0, 5, 1, 9, 8, 9, false)); s->push_back(CreateHalfSegment(0, 6, 5.1, 4.7, 7, 0, true)); s->push_back(CreateHalfSegment(0, 7, 6, 6, 8, 9, true)); s->push_back(CreateHalfSegment(0, 8, 6, 6, 9, 9, false)); s->push_back(CreateHalfSegment(0, 9, 6.1, 5.7, 7, 0, false)); s->push_back(CreateHalfSegment(0, 10, 6.1, 5.7, 9, 9, true)); s = &intersectionResult; s->push_back(CreateHalfSegment(0, 1, 5, 5, 5.1, 4.7, true)); s->push_back(CreateHalfSegment(0, 2, 5, 5, 6, 6, false)); s->push_back(CreateHalfSegment(0, 3, 5.1, 4.7, 6.1, 5.7, true)); s->push_back(CreateHalfSegment(0, 4, 6, 6, 6.1, 5.7, false)); s = &differenceResult; s->push_back(CreateHalfSegment(0, 1, 1, 9, 4, 4, true)); s->push_back(CreateHalfSegment(0, 2, 1, 9, 8, 9, false)); s->push_back(CreateHalfSegment(0, 3, 4, 4, 5, 5, true)); s->push_back(CreateHalfSegment(0, 4, 5, 5, 6, 6, true)); s->push_back(CreateHalfSegment(0, 5, 5.1, 4.7, 6.1, 5.7, false)); s->push_back(CreateHalfSegment(0, 6, 5.1, 4.7, 7, 0, true)); s->push_back(CreateHalfSegment(0, 7, 6, 6, 8, 9, true)); s->push_back(CreateHalfSegment(0, 8, 6.1, 5.7, 7, 0, false)); s = &differenceRevResult; s->push_back(CreateHalfSegment(0, 1, 1, 0, 1, 1, false)); s->push_back(CreateHalfSegment(0, 2, 1, 0, 5.1, 4.7, true)); s->push_back(CreateHalfSegment(0, 3, 1, 1, 4, 4, false)); s->push_back(CreateHalfSegment(0, 4, 4, 4, 5, 5, false)); s->push_back(CreateHalfSegment(0, 5, 5, 5, 5.1, 4.7, false)); s->push_back(CreateHalfSegment(0, 6, 6, 6, 6.1, 5.7, true)); s->push_back(CreateHalfSegment(0, 7, 6, 6, 9, 9, false)); s->push_back(CreateHalfSegment(0, 8, 6.1, 5.7, 9, 9, true)); TestInternal(source, 1, NULL, unionResult, intersectionResult, differenceResult, differenceRevResult); } /* 1.1 Test case 22 */ void RegionRegionTest22() { vector source; vector unionResult; vector intersectionResult; vector differenceResult; vector differenceRevResult; vector* s = &source; s->push_back(CreateHalfSegment(0, 0, 1, 3, 9, 5, true)); s->push_back(CreateHalfSegment(0, 1, 1, 3, 3, 6, false)); s->push_back(CreateHalfSegment(0, 3, 3, 6, 9, 7, false)); s->push_back(CreateHalfSegment(0, 4, 7, 6, 9, 5, false)); s->push_back(CreateHalfSegment(0, 5, 7, 6, 9, 7, true)); s->push_back(CreateHalfSegment(1, 6, 1, 3, 5, 9, false)); s->push_back(CreateHalfSegment(1, 7, 5, 9, 9, 6, false)); s->push_back(CreateHalfSegment(1, 8, 1, 3, 9, 6, true)); s = &unionResult; s->push_back(CreateHalfSegment(0, 1, 1, 3, 3, 6, false)); s->push_back(CreateHalfSegment(0, 2, 1, 3, 9, 5, true)); s->push_back(CreateHalfSegment(0, 3, 3, 6, 5, 9, false)); s->push_back(CreateHalfSegment(0, 4, 5, 9, 8, 7, false)); s->push_back(CreateHalfSegment(0, 5, 8, 7, 8, 6, true)); s->push_back(CreateHalfSegment(0, 6, 8, 6, 9, 5, false)); s = &intersectionResult; s->push_back(CreateHalfSegment(0, 1, 1, 3, 3, 6, false)); s->push_back(CreateHalfSegment(0, 2, 1, 3, 8, 6, true)); s->push_back(CreateHalfSegment(0, 3, 3, 6, 8, 7, false)); s->push_back(CreateHalfSegment(0, 4, 8, 7, 8, 6, true)); s = &differenceResult; s->push_back(CreateHalfSegment(0, 1, 1, 3, 8, 6, false)); s->push_back(CreateHalfSegment(0, 2, 1, 3, 9, 5, true)); s->push_back(CreateHalfSegment(0, 3, 8, 6, 9, 5, false)); s = &differenceRevResult; s->push_back(CreateHalfSegment(0, 1, 3, 6, 5, 9, false)); s->push_back(CreateHalfSegment(0, 2, 3, 6, 8, 7, true)); s->push_back(CreateHalfSegment(0, 3, 5, 9, 8, 7, false)); TestInternal(source, 0, NULL, unionResult, intersectionResult, differenceResult, differenceRevResult); } /* 1.1 Test case 23 */ void RegionRegionTest23() { vector source; vector unionResult; vector intersectionResult; vector differenceResult; vector differenceRevResult; vector* s = &source; s->push_back(CreateHalfSegment(0, 0, 10, 5, 5, 10, true)); s->push_back(CreateHalfSegment(0, 1, 5, 10, 10, 15, false)); s->push_back(CreateHalfSegment(0, 2, 10, 15, 15, 10, false)); s->push_back(CreateHalfSegment(0, 3, 15, 10, 10, 5, true)); s->push_back(CreateHalfSegment(1, 10, 13, 5, 8, 10, true)); s->push_back(CreateHalfSegment(1, 11, 8, 10, 13, 15, false)); s->push_back(CreateHalfSegment(1, 12, 13, 15, 18, 10, false)); s->push_back(CreateHalfSegment(1, 13, 18, 10, 13, 5, true)); s = &unionResult; s->push_back(CreateHalfSegment(0, 1, 5, 10, 10, 5, true)); s->push_back(CreateHalfSegment(0, 2, 5, 10, 10, 15, false)); s->push_back(CreateHalfSegment(0, 3, 10, 5, 11.5, 6.5, true)); s->push_back(CreateHalfSegment(0, 4, 10, 15, 11.5, 13.5, false)); s->push_back(CreateHalfSegment(0, 5, 11.5, 6.5, 13, 5, true)); s->push_back(CreateHalfSegment(0, 6, 11.5, 13.5, 13, 15, false)); s->push_back(CreateHalfSegment(0, 7, 13, 5, 18, 10, true)); s->push_back(CreateHalfSegment(0, 8, 13, 15, 18, 10, false)); s = &intersectionResult; s->push_back(CreateHalfSegment(0, 1, 8, 10, 11.5, 6.5, true)); s->push_back(CreateHalfSegment(0, 2, 8, 10, 11.5, 13.5, false)); s->push_back(CreateHalfSegment(0, 3, 11.5, 6.5, 15, 10, true)); s->push_back(CreateHalfSegment(0, 4, 11.5, 13.5, 15, 10, false)); s = &differenceResult; s->push_back(CreateHalfSegment(0, 1, 5, 10, 10, 5, true)); s->push_back(CreateHalfSegment(0, 2, 5, 10, 10, 15, false)); s->push_back(CreateHalfSegment(0, 3, 8, 10, 11.5, 6.5, false)); s->push_back(CreateHalfSegment(0, 4, 8, 10, 11.5, 13.5, true)); s->push_back(CreateHalfSegment(0, 5, 10, 5, 11.5, 6.5, true)); s->push_back(CreateHalfSegment(0, 6, 10, 15, 11.5, 13.5, false)); s = &differenceRevResult; s->push_back(CreateHalfSegment(0, 1, 11.5, 6.5, 13, 5, true)); s->push_back(CreateHalfSegment(0, 2, 11.5, 6.5, 15, 10, false)); s->push_back(CreateHalfSegment(0, 3, 11.5, 13.5, 13, 15, false)); s->push_back(CreateHalfSegment(0, 4, 11.5, 13.5, 15, 10, true)); s->push_back(CreateHalfSegment(0, 5, 13, 5, 18, 10, true)); s->push_back(CreateHalfSegment(0, 6, 13, 15, 18, 10, false)); TestInternal(source, 1, NULL, unionResult, intersectionResult, differenceResult, differenceRevResult); } /* 1.1 Test case 24 */ void RegionRegionTest24() { vector source; vector unionResult; vector intersectionResult; vector differenceResult; vector differenceRevResult; vector* s = &source; s->push_back(CreateHalfSegment(0, 0, 5, 10, 7.5, 5.6, true)); s->push_back(CreateHalfSegment(0, 1, 5, 10, 7.5, 14.3, false)); s->push_back(CreateHalfSegment(0, 2, 7.5, 14.3, 12.5, 14.3, false)); s->push_back(CreateHalfSegment(0, 3, 12.5, 14.3, 15, 10, false)); s->push_back(CreateHalfSegment(0, 4, 12.5, 5.6, 15, 10, true)); s->push_back(CreateHalfSegment(0, 5, 7.5, 5.6, 12.5, 5.6, true)); s->push_back(CreateHalfSegment(1, 10, 8, 10, 10.5, 5.6, true)); s->push_back(CreateHalfSegment(1, 11, 8, 10, 10.5, 14.3, false)); s->push_back(CreateHalfSegment(1, 12, 10.5, 14.3, 15.5, 14.3, false)); s->push_back(CreateHalfSegment(1, 13, 15.5, 14.3, 18, 10, false)); s->push_back(CreateHalfSegment(1, 14, 15.5, 5.6, 18, 10, true)); s->push_back(CreateHalfSegment(1, 15, 10.5, 5.6, 15.5, 5.6, true)); s = &unionResult; s->push_back(CreateHalfSegment(0, 1, 5, 10, 7.5, 5.6, true)); s->push_back(CreateHalfSegment(0, 2, 5, 10, 7.5, 14.3, false)); s->push_back(CreateHalfSegment(0, 3, 7.5, 5.6, 10.5, 5.6, true)); s->push_back(CreateHalfSegment(0, 4, 7.5, 14.3, 10.5, 14.3, false)); s->push_back(CreateHalfSegment(0, 5, 10.5, 5.6, 12.5, 5.6, true)); s->push_back(CreateHalfSegment(0, 6, 10.5, 14.3, 12.5, 14.3, false)); s->push_back(CreateHalfSegment(0, 7, 12.5, 5.6, 15.5, 5.6, true)); s->push_back(CreateHalfSegment(0, 8, 12.5, 14.3, 15.5, 14.3, false)); s->push_back(CreateHalfSegment(0, 9, 15.5, 5.6, 18, 10, true)); s->push_back(CreateHalfSegment(0, 10, 15.5, 14.3, 18, 10, false)); s = &intersectionResult; s->push_back(CreateHalfSegment(0, 1, 8, 10, 10.5, 5.6, true)); s->push_back(CreateHalfSegment(0, 2, 8, 10, 10.5, 14.3, false)); s->push_back(CreateHalfSegment(0, 3, 10.5, 5.6, 12.5, 5.6, true)); s->push_back(CreateHalfSegment(0, 4, 10.5, 14.3, 12.5, 14.3, false)); s->push_back(CreateHalfSegment(0, 5, 12.5, 5.6, 15, 10, true)); s->push_back(CreateHalfSegment(0, 6, 12.5, 14.3, 15, 10, false)); s = &differenceResult; s->push_back(CreateHalfSegment(0, 1, 5, 10, 7.5, 5.6, true)); s->push_back(CreateHalfSegment(0, 2, 5, 10, 7.5, 14.3, false)); s->push_back(CreateHalfSegment(0, 3, 7.5, 5.6, 10.5, 5.6, true)); s->push_back(CreateHalfSegment(0, 4, 7.5, 14.3, 10.5, 14.3, false)); s->push_back(CreateHalfSegment(0, 5, 8, 10, 10.5, 5.6, false)); s->push_back(CreateHalfSegment(0, 6, 8, 10, 10.5, 14.3, true)); s = &differenceRevResult; s->push_back(CreateHalfSegment(0, 1, 12.5, 5.6, 15, 10, false)); s->push_back(CreateHalfSegment(0, 2, 12.5, 5.6, 15.5, 5.6, true)); s->push_back(CreateHalfSegment(0, 3, 12.5, 14.3, 15, 10, true)); s->push_back(CreateHalfSegment(0, 4, 12.5, 14.3, 15.5, 14.3, false)); s->push_back(CreateHalfSegment(0, 5, 15.5, 5.6, 18, 10, true)); s->push_back(CreateHalfSegment(0, 6, 15.5, 14.3, 18, 10, false)); TestInternal(source, 1, NULL, unionResult, intersectionResult, differenceResult, differenceRevResult); } /* 1.1 Main test method */ void RegionRegionTest() { RegionRegionTest1(); RegionRegionTest2(); RegionRegionTest3(); RegionRegionTest4(); RegionRegionTest5(); RegionRegionTest6(); RegionRegionTest7(); RegionRegionTest8(); RegionRegionTest9(); RegionRegionTest10(); RegionRegionTest11(); RegionRegionTest12(); RegionRegionTest13(); RegionRegionTest14(); RegionRegionTest15(); RegionRegionTest16(); RegionRegionTest17(); RegionRegionTest18(); RegionRegionTest19(); RegionRegionTest20(); RegionRegionTest21(); RegionRegionTest22(); RegionRegionTest23(); RegionRegionTest24(); }