void TestQgsTessellator::asMultiPolygon() { QgsPolygon polygon; polygon.fromWkt( "POLYGON((1 1, 2 1, 3 2, 1 2, 1 1))" ); QgsPolygon polygonZ; polygonZ.fromWkt( "POLYGONZ((1 1 1, 2 1 2, 3 2 3, 1 2 4, 1 1 1))" ); QgsTessellator t( 0, 0, false ); t.addPolygon( polygon, 0 ); QCOMPARE( t.asMultiPolygon()->asWkt(), QStringLiteral( "MultiPolygonZ (((1 2 0, 2 1 0, 3 2 0, 1 2 0)),((1 2 0, 1 1 0, 2 1 0, 1 2 0)))" ) ); QgsTessellator t2( 0, 0, false ); t2.addPolygon( polygonZ, 0 ); QCOMPARE( t2.asMultiPolygon()->asWkt(), QStringLiteral( "MultiPolygonZ (((1 2 4, 2 1 2, 3 2 3, 1 2 4)),((1 2 4, 1 1 1, 2 1 2, 1 2 4)))" ) ); }
void TestQgsTessellator::testBasic() { QgsPolygon polygon; polygon.fromWkt( "POLYGON((1 1, 2 1, 3 2, 1 2, 1 1))" ); QgsPolygon polygonZ; polygonZ.fromWkt( "POLYGONZ((1 1 0, 2 1 0, 3 2 0, 1 2 0, 1 1 0))" ); QList<TriangleCoords> tc; tc << TriangleCoords( QVector3D( 1, 2, 0 ), QVector3D( 2, 1, 0 ), QVector3D( 3, 2, 0 ) ); tc << TriangleCoords( QVector3D( 1, 2, 0 ), QVector3D( 1, 1, 0 ), QVector3D( 2, 1, 0 ) ); QVector3D up( 0, 0, 1 ); // surface normal pointing straight up QList<TriangleCoords> tcNormals; tcNormals << TriangleCoords( QVector3D( 1, 2, 0 ), QVector3D( 2, 1, 0 ), QVector3D( 3, 2, 0 ), up, up, up ); tcNormals << TriangleCoords( QVector3D( 1, 2, 0 ), QVector3D( 1, 1, 0 ), QVector3D( 2, 1, 0 ), up, up, up ); // without normals QgsTessellator t( 0, 0, false ); t.addPolygon( polygon, 0 ); QVERIFY( checkTriangleOutput( t.data(), false, tc ) ); QgsTessellator tZ( 0, 0, false ); tZ.addPolygon( polygonZ, 0 ); QVERIFY( checkTriangleOutput( tZ.data(), false, tc ) ); // with normals QgsTessellator tN( 0, 0, true ); tN.addPolygon( polygon, 0 ); QVERIFY( checkTriangleOutput( tN.data(), true, tcNormals ) ); QgsTessellator tNZ( 0, 0, true ); tNZ.addPolygon( polygonZ, 0 ); QVERIFY( checkTriangleOutput( tNZ.data(), true, tcNormals ) ); }
void TestQgsTessellator::testBadCoordinates() { // triangulation would crash for me with this polygon if there is no simplification // to remove the coordinates that are very close to each other QgsPolygon polygon; polygon.fromWkt( "POLYGON((1 1, 2 1, 2.0000001 1.0000001, 2.0000002 1.0000001, 2.0000001 1.0000002, 2.0000002 1.0000002, 3 2, 1 2, 1 1))" ); QList<TriangleCoords> tc; tc << TriangleCoords( QVector3D( 1, 2, 0 ), QVector3D( 2, 1, 0 ), QVector3D( 3, 2, 0 ) ); tc << TriangleCoords( QVector3D( 1, 2, 0 ), QVector3D( 1, 1, 0 ), QVector3D( 2, 1, 0 ) ); QgsTessellator t( 0, 0, false ); t.addPolygon( polygon, 0 ); QVERIFY( checkTriangleOutput( t.data(), false, tc ) ); }
void TestQgsTessellator::testWalls() { QgsPolygon polygonZ; polygonZ.fromWkt( "POLYGONZ((1 1 1, 2 1 2, 3 2 3, 1 2 4, 1 1 1))" ); QList<TriangleCoords> tc; tc << TriangleCoords( QVector3D( 1, 2, 14 ), QVector3D( 2, 1, 12 ), QVector3D( 3, 2, 13 ) ); tc << TriangleCoords( QVector3D( 1, 2, 14 ), QVector3D( 1, 1, 11 ), QVector3D( 2, 1, 12 ) ); tc << TriangleCoords( QVector3D( 1, 1, 11 ), QVector3D( 1, 2, 14 ), QVector3D( 1, 1, 1 ) ); tc << TriangleCoords( QVector3D( 1, 1, 1 ), QVector3D( 1, 2, 14 ), QVector3D( 1, 2, 4 ) ); tc << TriangleCoords( QVector3D( 1, 2, 14 ), QVector3D( 3, 2, 13 ), QVector3D( 1, 2, 4 ) ); tc << TriangleCoords( QVector3D( 1, 2, 4 ), QVector3D( 3, 2, 13 ), QVector3D( 3, 2, 3 ) ); tc << TriangleCoords( QVector3D( 3, 2, 13 ), QVector3D( 2, 1, 12 ), QVector3D( 3, 2, 3 ) ); tc << TriangleCoords( QVector3D( 3, 2, 3 ), QVector3D( 2, 1, 12 ), QVector3D( 2, 1, 2 ) ); tc << TriangleCoords( QVector3D( 2, 1, 12 ), QVector3D( 1, 1, 11 ), QVector3D( 2, 1, 2 ) ); tc << TriangleCoords( QVector3D( 2, 1, 2 ), QVector3D( 1, 1, 11 ), QVector3D( 1, 1, 1 ) ); QgsTessellator tZ( 0, 0, false ); tZ.addPolygon( polygonZ, 10 ); QVERIFY( checkTriangleOutput( tZ.data(), false, tc ) ); }