本文整理汇总了C++中GeoDataLineString::constEnd方法的典型用法代码示例。如果您正苦于以下问题:C++ GeoDataLineString::constEnd方法的具体用法?C++ GeoDataLineString::constEnd怎么用?C++ GeoDataLineString::constEnd使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类GeoDataLineString
的用法示例。
在下文中一共展示了GeoDataLineString::constEnd方法的5个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: optimize
void GeoDataLineStringPrivate::optimize (GeoDataLineString& lineString) const
{
QVector<GeoDataCoordinates>::iterator itCoords = lineString.begin();
QVector<GeoDataCoordinates>::const_iterator itEnd = lineString.constEnd();
if (lineString.size() < 2) return;
// Calculate the least non-zero detail-level by checking the bounding box
int startLevel = levelForResolution( ( lineString.latLonAltBox().width() + lineString.latLonAltBox().height() ) / 2 );
int currentLevel = startLevel;
int maxLevel = startLevel;
GeoDataCoordinates currentCoords;
lineString.first().setDetail(startLevel);
// Iterate through the linestring to assign different detail levels to the nodes.
// In general the first and last node should have the start level assigned as
// a detail level.
// Starting from the first node the algorithm picks those nodes which
// have a distance from each other that is just above the resolution that is
// associated with the start level (which we use as a "current level").
// Each of those nodes get the current level assigned as the detail level.
// After iterating through the linestring we increment the current level value
// and starting again with the first node we assign detail values in a similar way
// to the remaining nodes which have no final detail level assigned yet.
// We do as many iterations through the lineString as needed and bump up the
// current level until all nodes have a non-zero detail level assigned.
while ( currentLevel < 16 && currentLevel <= maxLevel + 1 ) {
itCoords = lineString.begin();
currentCoords = *itCoords;
++itCoords;
for( ; itCoords != itEnd; ++itCoords) {
if (itCoords->detail() != 0 && itCoords->detail() < currentLevel) continue;
if ( currentLevel == startLevel && (itCoords->longitude() == -M_PI || itCoords->longitude() == M_PI
|| itCoords->latitude() < -89 * DEG2RAD || itCoords->latitude() > 89 * DEG2RAD)) {
itCoords->setDetail(startLevel);
currentCoords = *itCoords;
maxLevel = currentLevel;
continue;
}
if (distanceSphere( currentCoords, *itCoords ) < resolutionForLevel(currentLevel + 1)) {
itCoords->setDetail(currentLevel + 1);
}
else {
itCoords->setDetail(currentLevel);
currentCoords = *itCoords;
maxLevel = currentLevel;
}
}
++currentLevel;
}
lineString.last().setDetail(startLevel);
}
示例2: setupRegionsLists
void PolylineAnnotation::setupRegionsLists( GeoPainter *painter )
{
Q_ASSERT( state() == SceneGraphicsItem::DrawingPolyline || !m_regionsInitialized );
const GeoDataLineString line = static_cast<const GeoDataLineString>( *placemark()->geometry() );
// Add poyline nodes.
QVector<GeoDataCoordinates>::ConstIterator itBegin = line.constBegin();
QVector<GeoDataCoordinates>::ConstIterator itEnd = line.constEnd();
m_nodesList.clear();
for ( ; itBegin != itEnd; ++itBegin ) {
const PolylineNode newNode = PolylineNode( painter->regionFromEllipse( *itBegin, regularDim, regularDim ) );
m_nodesList.append( newNode );
}
// Add region from polyline so that events on polyline's 'lines' could be caught.
m_polylineRegion = painter->regionFromPolyline( line, 15 );
}
示例3: fromLineString
GeoDataLatLonAltBox GeoDataLatLonAltBox::fromLineString( const GeoDataLineString& lineString )
{
// If the line string is empty return a boundingbox that contains everything
if ( lineString.size() == 0 ) {
return GeoDataLatLonAltBox();
}
const qreal altitude = lineString.first().altitude();
GeoDataLatLonAltBox temp ( GeoDataLatLonBox::fromLineString( lineString ), altitude, altitude );
qreal maxAltitude = altitude;
qreal minAltitude = altitude;
// If there's only a single node stored then the boundingbox only contains that point
if ( lineString.size() == 1 ) {
temp.setMinAltitude( minAltitude );
temp.setMaxAltitude( maxAltitude );
return temp;
}
QVector<GeoDataCoordinates>::ConstIterator it( lineString.constBegin() );
QVector<GeoDataCoordinates>::ConstIterator itEnd( lineString.constEnd() );
for ( ; it != itEnd; ++it )
{
// Get coordinates and normalize them to the desired range.
const qreal altitude = (it)->altitude();
// Determining the maximum and minimum latitude
if ( altitude > maxAltitude ) maxAltitude = altitude;
if ( altitude < minAltitude ) minAltitude = altitude;
}
temp.setMinAltitude( minAltitude );
temp.setMaxAltitude( maxAltitude );
return temp;
}
示例4: toDateLineCorrected
void GeoDataLineStringPrivate::toDateLineCorrected(
const GeoDataLineString & q,
QVector<GeoDataLineString*> & lineStrings
)
{
const bool isClosed = q.isClosed();
const QVector<GeoDataCoordinates>::const_iterator itStartPoint = q.constBegin();
const QVector<GeoDataCoordinates>::const_iterator itEndPoint = q.constEnd();
QVector<GeoDataCoordinates>::const_iterator itPoint = itStartPoint;
QVector<GeoDataCoordinates>::const_iterator itPreviousPoint = itPoint;
TessellationFlags f = q.tessellationFlags();
GeoDataLineString * unfinishedLineString = 0;
GeoDataLineString * dateLineCorrected = isClosed ? new GeoDataLinearRing( f )
: new GeoDataLineString( f );
qreal currentLon = 0.0;
qreal previousLon = 0.0;
int previousSign = 1;
bool unfinished = false;
for (; itPoint != itEndPoint; ++itPoint ) {
currentLon = itPoint->longitude();
int currentSign = ( currentLon < 0.0 ) ? -1 : +1 ;
if( itPoint == q.constBegin() ) {
previousSign = currentSign;
previousLon = currentLon;
}
// If we are crossing the date line ...
if ( previousSign != currentSign && fabs(previousLon) + fabs(currentLon) > M_PI ) {
unfinished = !unfinished;
GeoDataCoordinates previousTemp;
GeoDataCoordinates currentTemp;
interpolateDateLine( *itPreviousPoint, *itPoint,
previousTemp, currentTemp, q.tessellationFlags() );
*dateLineCorrected << previousTemp;
if ( isClosed && unfinished ) {
// If it's a linear ring and if it crossed the IDL only once then
// store the current string inside the unfinishedLineString for later use ...
unfinishedLineString = dateLineCorrected;
// ... and start a new linear ring for now.
dateLineCorrected = new GeoDataLinearRing( f );
}
else {
// Now it can only be a (finished) line string or a finished linear ring.
// Store it in the vector if the size is not zero.
if ( dateLineCorrected->size() > 0 ) {
lineStrings << dateLineCorrected;
}
else {
// Or delete it.
delete dateLineCorrected;
}
// If it's a finished linear ring restore the "remembered" unfinished String
if ( isClosed && !unfinished && unfinishedLineString ) {
dateLineCorrected = unfinishedLineString;
}
else {
// if it's a line string just create a new line string.
dateLineCorrected = new GeoDataLineString( f );
}
}
*dateLineCorrected << currentTemp;
*dateLineCorrected << *itPoint;
}
else {
*dateLineCorrected << *itPoint;
}
previousSign = currentSign;
previousLon = currentLon;
itPreviousPoint = itPoint;
}
// If the line string doesn't cross the dateline an even number of times
// then need to take care of the data stored in the unfinishedLineString
if ( unfinished && unfinishedLineString && !unfinishedLineString->isEmpty() ) {
*dateLineCorrected << *unfinishedLineString;
delete unfinishedLineString;
}
lineStrings << dateLineCorrected;
}
示例5: lineStringToPolygon
bool CylindricalProjectionPrivate::lineStringToPolygon( const GeoDataLineString &lineString,
const ViewportParams *viewport,
QVector<QPolygonF *> &polygons ) const
{
const TessellationFlags f = lineString.tessellationFlags();
qreal x = 0;
qreal y = 0;
qreal previousX = -1.0;
qreal previousY = -1.0;
int mirrorCount = 0;
qreal distance = repeatDistance( viewport );
polygons.append( new QPolygonF );
GeoDataLineString::ConstIterator itCoords = lineString.constBegin();
GeoDataLineString::ConstIterator itPreviousCoords = lineString.constBegin();
GeoDataLineString::ConstIterator itBegin = lineString.constBegin();
GeoDataLineString::ConstIterator itEnd = lineString.constEnd();
bool processingLastNode = false;
// We use a while loop to be able to cover linestrings as well as linear rings:
// Linear rings require to tessellate the path from the last node to the first node
// which isn't really convenient to achieve with a for loop ...
const bool isLong = lineString.size() > 10;
const int maximumDetail = levelForResolution(viewport->angularResolution());
// The first node of optimized linestrings has a non-zero detail value.
const bool hasDetail = itBegin->detail() != 0;
while ( itCoords != itEnd )
{
// Optimization for line strings with a big amount of nodes
bool skipNode = (hasDetail ? itCoords->detail() > maximumDetail
: itCoords != itBegin && isLong && !processingLastNode &&
!viewport->resolves( *itPreviousCoords, *itCoords ) );
if ( !skipNode ) {
Q_Q( const CylindricalProjection );
q->screenCoordinates( *itCoords, viewport, x, y );
// Initializing variables that store the values of the previous iteration
if ( !processingLastNode && itCoords == itBegin ) {
itPreviousCoords = itCoords;
previousX = x;
previousY = y;
}
// This if-clause contains the section that tessellates the line
// segments of a linestring. If you are about to learn how the code of
// this class works you can safely ignore this section for a start.
if ( lineString.tessellate() ) {
mirrorCount = tessellateLineSegment( *itPreviousCoords, previousX, previousY,
*itCoords, x, y,
polygons, viewport,
f, mirrorCount, distance );
}
else {
// special case for polys which cross dateline but have no Tesselation Flag
// the expected rendering is a screen coordinates straight line between
// points, but in projections with repeatX things are not smooth
mirrorCount = crossDateLine( *itPreviousCoords, *itCoords, x, y, polygons, mirrorCount, distance );
}
itPreviousCoords = itCoords;
previousX = x;
previousY = y;
}
// Here we modify the condition to be able to process the
// first node after the last node in a LinearRing.
if ( processingLastNode ) {
break;
}
++itCoords;
if ( itCoords == itEnd && lineString.isClosed() ) {
itCoords = itBegin;
processingLastNode = true;
}
}
GeoDataLatLonAltBox box = lineString.latLonAltBox();
// Closing e.g. in the Antarctica case.
// This code makes the assumption that
// - the first node is located at 180 E
// - and the last node is located at 180 W
// TODO: add a similar pattern in the crossDateLine() code.
//.........这里部分代码省略.........