/** ** ** @RDE_HEADER@ ** Rasterize functional path geometries to polylines ** $Id$ ** $HeadURL$ ** $Author$ ** ** ----------------------------------------------------------------------------------------------- ** ** Hardware-Environment: Intel-PC ** Software-Environment: Windows 7, Qt 5.4. ArcGIS 10.2.5 ** ** Language ........: C++ 11 ** ** ----------------------------------------------------------------------------------------------- ** ** Author ...........: Jörg Turla, SPD G, Tel. 3132 ** ** ----------------------------------------------------------------------------------------------- ** ** Notes .........: ** ** 12.08.2015, JT : First edition for use with Qt5 ** ** ----------------------------------------------------------------------------------------------- */ #include "path_rasterer.h" #include namespace SituationMap { namespace MathUtils { PathRasterer::PathRasterer() : _eps(1.0), _maxVertexCount(0) { } /* PathRasterer::PathRasterer */ void PathRasterer::rasterize(qreal tMin, qreal tMax, QVector & vertexList) { exeRasterize( tMin, tMax, vertexList ); } void PathRasterer::rasterize(qreal tMin, qreal tMax, QList & vertexList) { exeRasterize( tMin, tMax, vertexList ); } template void PathRasterer::exeRasterize( qreal tMin, qreal tMax, List & vertexList ) { vertexList.clear(); if (tMin >= tMax) return; QPointF vMin, vMax; function( tMax, vMax ); function( tMin, vMin ); vertexList.append(vMin); splitSegment( vMin, tMin, vMax, tMax, _maxVertexCount, vertexList ); vertexList.append(vMax); } /* PathRasterer::exeRasterize */ template void PathRasterer::splitSegment( const QPointF & v0 , qreal t0 , const QPointF & v1 , qreal t1 , unsigned int maxVertexCount , List & vertexList ) { if (maxVertexCount < 1) return; QPointF v2; qreal t2 = (t0+t1) * 0.5; function( t2, v2 ); auto length = []( const QPointF & v ) -> qreal { return sqrt(v.x()*v.x() + v.y()*v.y()); }; qreal l0 = length(v1-v0); qreal l1 = length(v1-v2); qreal l2 = length(v2-v0); /* ------------------------------------------------------------------------- * Berechnen der Höhe des Dreiecks über l0 für den Vergleich mit * dem Schwellwert (siehe Kosinussatz, Trigonometrische Funktionen, etc.). * ------------------------------------------------------------------------- */ qreal cosPhi = (l2*l2+l0*l0-l1*l1)/(2.0*l2*l0); qreal h_eps = l2*sqrt(1.0-cosPhi*cosPhi); // (maxVertexCount > 0) -> see pre-condition if (((std::isnan(h_eps)) || (h_eps > _eps))) { maxVertexCount /= 2; splitSegment( v0, t0, v2, t2, maxVertexCount, vertexList ); vertexList.append( v2 ); splitSegment( v2, t2, v1, t1, maxVertexCount, vertexList ); } } /* PathRasterer::splitSegment */ } } // namespace SituationMap::MathUtils