int main() { srand((unsigned) time(NULL)); try { XList<Shape*> list; // filling list of figures with random figures of all types. int numberOfElements = rand() % 100; for(int i = 0; i < numberOfElements; i++) { switch (i % 5) { case 0: list.pushElementToBack(new Point("TestPoint", rand() % 100, rand() % 100)); break; case 1: list.pushElementToBack(new Circle("TestCircle", rand() % 100, rand() % 100, rand() % 100)); break; case 2: list.pushElementToBack(new Rect("TestRect", rand() % 100, rand() % 100, rand() % 100, rand() % 100)); break; case 3: list.pushElementToBack(new Square("TestSquare", rand() % 100, rand() % 100, rand() % 100)); break; case 4: Polyline* pol = new Polyline("TestPol"); Point p1("pol_point_1", rand() % 100, rand() % 100); Point p2("pol_point_2", rand() % 100, rand() % 100); Point p3("pol_point_3", rand() % 100, rand() % 100); pol->addPoint(p1); pol->addPoint(p2); pol->addPoint(p3); list.pushElementToBack(pol); break; } } std::cout << "Number of shapes " << Shape::getNumberOfShapes() << "\n"; XList<Shape*>::Iterator it = list.begin(); for(it = list.begin(); it != list.end(); ++it) { std::cout << "\n" << **it << "\n"; } std::cout << "Number of shapes " << Shape::getNumberOfShapes() << "\n"; for(it = list.begin(); it != list.end(); ++it) { delete *it; } // should be zero std::cout << "Number of shapes " << Shape::getNumberOfShapes() << "\n"; return 0; } catch (std::exception ex) { std::cerr << ex.what(); return 1; } }
Polyline * Factory::getRandPolyline() { Polyline * pl = new Polyline(); int N = iRand(1, 10); for (int i = 0; i < N; i++) { Point * p = getRandPoint(); pl->addPoint(* p); delete p; } return pl; }
Polyline* Polyline::constructPolylineFromSegments(const std::vector<Polyline*>& ply_vec, double prox) { size_t nLines = ply_vec.size(); Polyline* new_ply = new Polyline(*ply_vec[0]); std::vector<GEOLIB::Point*> pnt_vec(new_ply->getPointsVec()); std::vector<Polyline*> local_ply_vec; for (size_t i = 1; i < nLines; i++) local_ply_vec.push_back(ply_vec[i]); while (!local_ply_vec.empty()) { bool ply_found(false); prox *= prox; // square distance once to save time later for (std::vector<Polyline*>::iterator it = local_ply_vec.begin(); it != local_ply_vec.end(); ++it) { if (pnt_vec == (*it)->getPointsVec()) { size_t nPoints((*it)->getNumberOfPoints()); // if (new_ply->getPointID(0) == (*it)->getPointID(0)) if (pointsAreIdentical(pnt_vec, new_ply->getPointID(0), (*it)->getPointID(0), prox)) { Polyline* tmp = new Polyline((*it)->getPointsVec()); for (size_t k = 0; k < nPoints; k++) tmp->addPoint((*it)->getPointID(nPoints - k - 1)); size_t new_ply_size(new_ply->getNumberOfPoints()); for (size_t k = 1; k < new_ply_size; k++) tmp->addPoint(new_ply->getPointID(k)); delete new_ply; new_ply = tmp; ply_found = true; } // else if (new_ply->getPointID(0) == (*it)->getPointID(nPoints-1)) else if (pointsAreIdentical(pnt_vec, new_ply->getPointID(0), (*it)->getPointID(nPoints - 1), prox)) { Polyline* tmp = new Polyline(**it); size_t new_ply_size(new_ply->getNumberOfPoints()); for (size_t k = 1; k < new_ply_size; k++) tmp->addPoint(new_ply->getPointID(k)); delete new_ply; new_ply = tmp; ply_found = true; } // else if (new_ply->getPointID(new_ply->getNumberOfPoints()-1) == (*it)->getPointID(0)) else if (pointsAreIdentical(pnt_vec, new_ply->getPointID(new_ply->getNumberOfPoints() - 1), (*it)->getPointID(0), prox)) { for (size_t k = 1; k < nPoints; k++) new_ply->addPoint((*it)->getPointID(k)); ply_found = true; } // else if (new_ply->getPointID(new_ply->getNumberOfPoints()-1) == (*it)->getPointID(nPoints-1)) else if (pointsAreIdentical(pnt_vec, new_ply->getPointID(new_ply->getNumberOfPoints() - 1), (*it)->getPointID(nPoints - 1), prox)) { for (size_t k = 1; k < nPoints; k++) new_ply->addPoint((*it)->getPointID(nPoints - k - 1)); ply_found = true; } if (ply_found) { local_ply_vec.erase(it); break; } } else std::cout << "Error in Polyline::contructPolylineFromSegments() - Line segments use different point " "vectors..." << "\n"; } if (!ply_found) { std::cout << "Error in Polyline::contructPolylineFromSegments() - Not all segments are connected..." << "\n"; new_ply = NULL; break; } } return new_ply; }