std::shared_ptr< Surface > flat::PdmFileReader< Surface >::operator() ( ) { # if defined DBG_FLAT_PDM_FILE_READER std::clog << "flat::PdmFileReader< Surface >::PdmFileReader\t|" << " path \"" << path << '\"' << std::endl; # endif size_t index = 0; std::ifstream stream; stream.exceptions( std::ifstream::failbit | std::ifstream::badbit ); stream.open( path.c_str() ); read_file_header( stream ); const size_t num_vertices = get<0>( vertex_field_size ) * get<1>( vertex_field_size ); std::shared_ptr< Surface > surface = Surface::create_with_size( num_vertices ); do { read_sample( stream, surface, index ); } while( ++index < num_vertices ); stream.close(); flat::SimpleRectlinearTriangulator triangulator( vertex_field_size ); triangulator( surface ); return surface; }
void TriangulationECWindow::FourBoxesThreeNested(int i0, int i1, int i2) { ClearAll(); mExample = 5; mPositions.resize(16); mPositions[0] = { 64.0f, 16.0f }; mPositions[1] = { 448.0f, 16.0f }; mPositions[2] = { 448.0f, 496.0f }; mPositions[3] = { 64.0f, 496.0f }; mPositions[4] = { 320.0f, 32.0f }; mPositions[5] = { 320.0f, 240.0f }; mPositions[6] = { 384.0f, 240.0f }; mPositions[7] = { 384.0f, 32.0f }; mPositions[8] = { 320.0f, 272.0f }; mPositions[9] = { 320.0f, 480.0f }; mPositions[10] = { 384.0f, 480.0f }; mPositions[11] = { 384.0f, 272.0f }; mPositions[12] = { 128.0f, 272.0f }; mPositions[13] = { 128.0f, 480.0f }; mPositions[14] = { 192.0f, 480.0f }; mPositions[15] = { 192.0f, 272.0f }; mOuter.resize(4); mOuter[0] = 0; mOuter[1] = 1; mOuter[2] = 2; mOuter[3] = 3; mFillSeeds.push_back(Vector2<float>{ 128.0f, 32.0f }); mInner0.resize(4); mInner0[0] = 4; mInner0[1] = 5; mInner0[2] = 6; mInner0[3] = 7; mInner1.resize(4); mInner1[0] = 8; mInner1[1] = 9; mInner1[2] = 10; mInner1[3] = 11; mInner2.resize(4); mInner2[0] = 12; mInner2[1] = 13; mInner2[2] = 14; mInner2[3] = 15; Triangulator::Polygon outer = { (int)mOuter.size(), &mOuter[0] }; std::vector<Triangulator::Polygon> inners(3); inners[i0] = { (int)mInner0.size(), &mInner0[0] }; inners[i1] = { (int)mInner1.size(), &mInner1[0] }; inners[i2] = { (int)mInner2.size(), &mInner2[0] }; Triangulator triangulator((int)mPositions.size(), &mPositions[0]); triangulator(outer, inners); mTriangles = triangulator.GetTriangles(); }
void TriangulationECWindow::TwoNestedPolygons() { ClearAll(); mExample = 3; mPositions.resize(16); mPositions[0] = { 58.0f, 278.0f }; mPositions[1] = { 156.0f, 198.0f }; mPositions[2] = { 250.0f, 282.0f }; mPositions[3] = { 328.0f, 232.0f }; mPositions[4] = { 402.0f, 336.0f }; mPositions[5] = { 314.0f, 326.0f }; mPositions[6] = { 274.0f, 400.0f }; mPositions[7] = { 196.0f, 268.0f }; mPositions[8] = { 104.0f, 292.0f }; mPositions[9] = { 110.0f, 382.0f }; mPositions[10] = (mPositions[2] + mPositions[5] + mPositions[6]) / 3.0f; mPositions[11] = (mPositions[2] + mPositions[3] + mPositions[4]) / 3.0f; mPositions[12] = (mPositions[2] + mPositions[6] + mPositions[7]) / 3.0f; mPositions[13] = (mPositions[1] + mPositions[0] + mPositions[8]) / 3.0f; mPositions[14] = (mPositions[1] + mPositions[8] + mPositions[7]) / 3.0f; mPositions[14][1] += 6.0f; mPositions[15] = (mPositions[1] + mPositions[7] + mPositions[2]) / 3.0f; mOuter.resize(10); mOuter[0] = 0; mOuter[1] = 1; mOuter[2] = 2; mOuter[3] = 3; mOuter[4] = 4; mOuter[5] = 5; mOuter[6] = 6; mOuter[7] = 7; mOuter[8] = 8; mOuter[9] = 9; mFillSeeds.push_back(Vector2<float>{ 62.0f, 278.0f }); mInner0.resize(3); mInner0[0] = 11; mInner0[1] = 12; mInner0[2] = 10; mInner1.resize(3); mInner1[0] = 13; mInner1[1] = 14; mInner1[2] = 15; Triangulator::Polygon outer = { (int)mOuter.size(), &mOuter[0] }; std::vector<Triangulator::Polygon> inners(2); inners[0] = { (int)mInner0.size(), &mInner0[0] }; inners[1] = { (int)mInner1.size(), &mInner1[0] }; Triangulator triangulator((int)mPositions.size(), &mPositions[0]); triangulator(outer, inners); mTriangles = triangulator.GetTriangles(); }
void object::test<2>() { Geometry* sites; QuadEdgeSubdivision* subdiv; sites = reader.read("MULTIPOINT ((150 200), (180 270), (275 163))"); CoordinateSequence* siteCoords = DelaunayTriangulationBuilder::extractUniqueCoordinates(*sites); Envelope Env = DelaunayTriangulationBuilder::envelope(*siteCoords); double expandBy = std::max(Env.getWidth() , Env.getHeight()); Env.expandBy(expandBy); IncrementalDelaunayTriangulator::VertexList* vertices = DelaunayTriangulationBuilder::toVertices(*siteCoords); subdiv = new quadedge::QuadEdgeSubdivision(Env,0); IncrementalDelaunayTriangulator triangulator(subdiv); triangulator.insertSites(*vertices); //Test for getVoronoiDiagram:: GeometryFactory geomFact; std::auto_ptr<GeometryCollection> polys = subdiv->getVoronoiDiagram(geomFact); const char *expected_str = "GEOMETRYCOLLECTION (POLYGON ((-5849.974929324658 2268.0517257497568, -4529.9920486948895 2247.139449440667, 221.20588235294116 210.91176470588235, -684.4227119984187 -2848.644297291955, -5849.974929324658 2268.0517257497568)), POLYGON ((212.5 -3774.5, -684.4227119984187 -2848.644297291955, 221.20588235294116 210.91176470588235, 2448.7167655626645 2188.608343256571, 6235.0370264064295 2248.0370264064295, 212.5 -3774.5)), POLYGON ((-4529.9920486948895 2247.139449440667, 2448.7167655626645 2188.608343256571, 221.20588235294116 210.91176470588235, -4529.9920486948895 2247.139449440667)))"; // std::cout << polys->toString() << std::endl; Geometry *expected = reader.read(expected_str); polys->normalize(); expected->normalize(); ensure(polys->equalsExact(expected, 1e-7)); delete siteCoords; delete sites; delete subdiv; delete vertices; delete expected; // ensure(polys->getCoordinateDimension() == expected->getCoordinateDimension()); }
void TriangulationECWindow::IndexedSimplePolygon() { ClearAll(); mExample = 1; mPositions.resize(20); mPositions[0] = { 58.0f, 278.0f }; mPositions[1] = { 0.0f, 0.0f }; mPositions[2] = { 156.0f, 198.0f }; mPositions[3] = { 0.0f, 0.0f }; mPositions[4] = { 250.0f, 282.0f }; mPositions[5] = { 0.0f, 0.0f }; mPositions[6] = { 328.0f, 232.0f }; mPositions[7] = { 0.0f, 0.0f }; mPositions[8] = { 402.0f, 336.0f }; mPositions[9] = { 0.0f, 0.0f }; mPositions[10] = { 314.0f, 326.0f }; mPositions[11] = { 0.0f, 0.0f }; mPositions[12] = { 274.0f, 400.0f }; mPositions[13] = { 0.0f, 0.0f }; mPositions[14] = { 196.0f, 268.0f }; mPositions[15] = { 0.0f, 0.0f }; mPositions[16] = { 104.0f, 292.0f }; mPositions[17] = { 0.0f, 0.0f }; mPositions[18] = { 110.0f, 382.0f }; mPositions[19] = { 0.0f, 0.0f }; mOuter.resize(10); mOuter[0] = 0; mOuter[1] = 2; mOuter[2] = 4; mOuter[3] = 6; mOuter[4] = 8; mOuter[5] = 10; mOuter[6] = 12; mOuter[7] = 14; mOuter[8] = 16; mOuter[9] = 18; mFillSeeds.push_back(Vector2<float>{ 132.0f, 256 }); Triangulator::Polygon outer = { (int)mOuter.size(), &mOuter[0] }; Triangulator triangulator((int)mPositions.size(), &mPositions[0]); triangulator(outer); mTriangles = triangulator.GetTriangles(); }
void object::test<1>() { //Create a subdivision centered at (0,0) QuadEdgeSubdivision sub(Envelope(-100, 100, -100, 100), .00001); //make a triagulaor to work on sub IncrementalDelaunayTriangulator triangulator(&sub); triangulator.insertSite(Vertex(0, 0)); //extract the triangles from the subdivision GeometryFactory geomFact; std::auto_ptr<GeometryCollection> tris = sub.getTriangles(geomFact); }
void TriangulationECWindow::UnindexedSimplePolygon() { ClearAll(); mExample = 0; mPositions.resize(10); mPositions[0] = { 58.0f, 278.0f }; mPositions[1] = { 156.0f, 198.0f }; mPositions[2] = { 250.0f, 282.0f }; mPositions[3] = { 328.0f, 232.0f }; mPositions[4] = { 402.0f, 336.0f }; mPositions[5] = { 314.0f, 326.0f }; mPositions[6] = { 274.0f, 400.0f }; mPositions[7] = { 196.0f, 268.0f }; mPositions[8] = { 104.0f, 292.0f }; mPositions[9] = { 110.0f, 382.0f }; mFillSeeds.push_back(Vector2<float>{ 132.0f, 256.0f }); Triangulator triangulator((int)mPositions.size(), &mPositions[0]); triangulator(); mTriangles = triangulator.GetTriangles(); }
void TriangulationECWindow::OneNestedPolygon() { // Polygon with one hole. The top and bottom vertices of the outer // polygon are on the line containing the left edge of the inner polygon. // This example tests how the collinearity detection works when // identifying ears. ClearAll(); mExample = 2; mPositions.resize(7); mPositions[0] = { 128.0f, 256.0f }; mPositions[1] = { 256.0f, 128.0f }; mPositions[2] = { 384.0f, 256.0f }; mPositions[3] = { 256.0f, 384.0f }; mPositions[4] = { 320.0f, 256.0f }; mPositions[5] = { 256.0f, 192.0f }; mPositions[6] = { 256.0f, 320.0f }; mOuter.resize(4); mOuter[0] = 0; mOuter[1] = 1; mOuter[2] = 2; mOuter[3] = 3; mFillSeeds.push_back(Vector2<float>{ 132.0f, 256.0f }); mInner0.resize(3); mInner0[0] = 4; mInner0[1] = 5; mInner0[2] = 6; Triangulator::Polygon outer = { (int)mOuter.size(), &mOuter[0] }; Triangulator::Polygon inner = { (int)mInner0.size(), &mInner0[0] }; Triangulator triangulator((int)mPositions.size(), &mPositions[0]); triangulator(outer, inner); mTriangles = triangulator.GetTriangles(); }
void TriangulationECWindow::TreeOfNestedPolygons() { ClearAll(); mExample = 4; mPositions.resize(43); mPositions[0] = { 204.0f, 30.0f }; mPositions[1] = { 466.0f, 174.0f }; mPositions[2] = { 368.0f, 496.0f }; mPositions[3] = { 66.0f, 464.0f }; mPositions[4] = { 28.0f, 256.0f }; mPositions[5] = { 274.0f, 84.0f }; mPositions[6] = { 186.0f, 82.0f }; mPositions[7] = { 274.0f, 158.0f }; mPositions[8] = { 292.0f, 132.0f }; mPositions[9] = { 322.0f, 426.0f }; mPositions[10] = { 426.0f, 226.0f }; mPositions[11] = { 216.0f, 134.0f }; mPositions[12] = { 72.0f, 306.0f }; mPositions[13] = { 178.0f, 440.0f }; mPositions[14] = { 266.0f, 372.0f }; mPositions[15] = { 294.0f, 474.0f }; mPositions[16] = { 354.0f, 474.0f }; mPositions[17] = { 368.0f, 404.0f }; mPositions[18] = { 318.0f, 450.0f }; mPositions[19] = { 172.0f, 226.0f }; mPositions[20] = { 230.0f, 236.0f }; mPositions[21] = { 196.0f, 268.0f }; mPositions[22] = { 218.0f, 306.0f }; mPositions[23] = { 136.0f, 266.0f }; mPositions[24] = { 136.0f, 312.0f }; mPositions[25] = { 230.0f, 350.0f }; mPositions[26] = { 216.0f, 388.0f }; mPositions[27] = { 160.0f, 384.0f }; mPositions[28] = { 326.0f, 216.0f }; mPositions[29] = { 370.0f, 216.0f }; mPositions[30] = { 344.0f, 352.0f }; mPositions[31] = { 158.0f, 340.0f }; mPositions[32] = { 158.0f, 358.0f }; mPositions[33] = { 176.0f, 358.0f }; mPositions[34] = { 176.0f, 340.0f }; mPositions[35] = { 192.0f, 358.0f }; mPositions[36] = { 192.0f, 374.0f }; mPositions[37] = { 206.0f, 374.0f }; mPositions[38] = { 206.0f, 358.0f }; mPositions[39] = { 338.0f, 242.0f }; mPositions[40] = { 338.0f, 262.0f }; mPositions[41] = { 356.0f, 262.0f }; mPositions[42] = { 356.0f, 242.0f }; // outer0 polygon mTree = new Triangulator::Tree(); mTree->polygon.numIndices = 5; mTree->polygon.indices = new int[mTree->polygon.numIndices]; mTree->polygon.indices[0] = 0; mTree->polygon.indices[1] = 1; mTree->polygon.indices[2] = 2; mTree->polygon.indices[3] = 3; mTree->polygon.indices[4] = 4; mFillSeeds.push_back(Vector2<float>{ 164.0f, 138.0f }); // inner0 polygon Triangulator::Tree* inner0 = new Triangulator::Tree(); inner0->polygon.numIndices = 3; inner0->polygon.indices = new int[inner0->polygon.numIndices]; inner0->polygon.indices[0] = 5; inner0->polygon.indices[1] = 6; inner0->polygon.indices[2] = 7; mTree->child.push_back(inner0); // inner1 polygon Triangulator::Tree* inner1 = new Triangulator::Tree(); inner1->polygon.numIndices = 3; inner1->polygon.indices = new int[inner1->polygon.numIndices]; inner1->polygon.indices[0] = 8; inner1->polygon.indices[1] = 9; inner1->polygon.indices[2] = 10; mTree->child.push_back(inner1); // inner2 polygon Triangulator::Tree* inner2 = new Triangulator::Tree(); inner2->polygon.numIndices = 8; inner2->polygon.indices = new int[inner2->polygon.numIndices]; inner2->polygon.indices[0] = 11; inner2->polygon.indices[1] = 12; inner2->polygon.indices[2] = 13; inner2->polygon.indices[3] = 14; inner2->polygon.indices[4] = 15; inner2->polygon.indices[5] = 16; inner2->polygon.indices[6] = 17; inner2->polygon.indices[7] = 18; mTree->child.push_back(inner2); // outer1 polygon (contained in inner2) Triangulator::Tree* outer1 = new Triangulator::Tree(); outer1->polygon.numIndices = 5; outer1->polygon.indices = new int[outer1->polygon.numIndices]; outer1->polygon.indices[0] = 19; outer1->polygon.indices[1] = 20; outer1->polygon.indices[2] = 21; outer1->polygon.indices[3] = 22; outer1->polygon.indices[4] = 23; inner2->child.push_back(outer1); mFillSeeds.push_back(Vector2<float>{ 184.0f, 248.0f }); // outer2 polygon (contained in inner2) Triangulator::Tree* outer2 = new Triangulator::Tree(); outer2->polygon.numIndices = 4; outer2->polygon.indices = new int[outer2->polygon.numIndices]; outer2->polygon.indices[0] = 24; outer2->polygon.indices[1] = 25; outer2->polygon.indices[2] = 26; outer2->polygon.indices[3] = 27; inner2->child.push_back(outer2); mFillSeeds.push_back(Vector2<float>{ 218.0f, 358.0f }); // outer3 polygon (contained in inner1) Triangulator::Tree* outer3 = new Triangulator::Tree(); outer3->polygon.numIndices = 3; outer3->polygon.indices = new int[outer3->polygon.numIndices]; outer3->polygon.indices[0] = 28; outer3->polygon.indices[1] = 29; outer3->polygon.indices[2] = 30; inner1->child.push_back(outer3); mFillSeeds.push_back(Vector2<float>{ 344.0f, 278.0f }); // inner3 polygon (contained in outer2) Triangulator::Tree* inner3 = new Triangulator::Tree(); inner3->polygon.numIndices = 4; inner3->polygon.indices = new int[inner3->polygon.numIndices]; inner3->polygon.indices[0] = 31; inner3->polygon.indices[1] = 32; inner3->polygon.indices[2] = 33; inner3->polygon.indices[3] = 34; outer2->child.push_back(inner3); // inner4 polygon (contained in outer2) Triangulator::Tree* inner4 = new Triangulator::Tree(); inner4->polygon.numIndices = 4; inner4->polygon.indices = new int[inner4->polygon.numIndices]; inner4->polygon.indices[0] = 35; inner4->polygon.indices[1] = 36; inner4->polygon.indices[2] = 37; inner4->polygon.indices[3] = 38; outer2->child.push_back(inner4); // inner5 polygon (contained in outer3) Triangulator::Tree* inner5 = new Triangulator::Tree(); inner5->polygon.numIndices = 4; inner5->polygon.indices = new int[inner5->polygon.numIndices]; inner5->polygon.indices[0] = 39; inner5->polygon.indices[1] = 40; inner5->polygon.indices[2] = 41; inner5->polygon.indices[3] = 42; outer3->child.push_back(inner5); Triangulator triangulator((int)mPositions.size(), &mPositions[0]); triangulator(*mTree); mTriangles = triangulator.GetTriangles(); }
void TriangulateLitePointCloud(tSonarMeshData& xMesh, const tPointList& inputCloud, int startInputCloudIndex, int endInputCloudIndex, const QList<boost::shared_ptr<tSidescan3DSample> >& samples, float maxTriangleVertexSizeX, float maxTriangleVertexSizeY) { tLiteTriangulate triangulator(inputCloud, startInputCloudIndex, endInputCloudIndex, samples, maxTriangleVertexSizeX, maxTriangleVertexSizeY); triangulator.Process(xMesh.meshData); }