本文整理汇总了C++中qgsDoubleNear函数的典型用法代码示例。如果您正苦于以下问题:C++ qgsDoubleNear函数的具体用法?C++ qgsDoubleNear怎么用?C++ qgsDoubleNear使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了qgsDoubleNear函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: removeDuplicateNodes
bool QgsCompoundCurve::removeDuplicateNodes( double epsilon, bool useZValues )
{
bool result = false;
const QVector< QgsCurve * > curves = mCurves;
int i = 0;
QgsPoint lastEnd;
for ( QgsCurve *curve : curves )
{
result = result || curve->removeDuplicateNodes( epsilon, useZValues );
if ( curve->numPoints() == 0 || qgsDoubleNear( curve->length(), 0.0, epsilon ) )
{
// empty curve, remove it
delete mCurves.takeAt( i );
result = true;
}
else
{
// ensure this line starts exactly where previous line ended
if ( i > 0 )
{
curve->moveVertex( QgsVertexId( -1, -1, 0 ), lastEnd );
}
lastEnd = curve->vertexAt( QgsVertexId( -1, -1, curve->numPoints() - 1 ) );
}
i++;
}
return result;
}
示例2: sourceModel
bool QgsLocatorProxyModel::lessThan( const QModelIndex &left, const QModelIndex &right ) const
{
// first go by filter priority
int leftFilterPriority = sourceModel()->data( left, QgsLocatorModel::ResultFilterPriorityRole ).toInt();
int rightFilterPriority = sourceModel()->data( right, QgsLocatorModel::ResultFilterPriorityRole ).toInt();
if ( leftFilterPriority != rightFilterPriority )
return leftFilterPriority < rightFilterPriority;
// then filter name
QString leftFilter = sourceModel()->data( left, QgsLocatorModel::ResultFilterNameRole ).toString();
QString rightFilter = sourceModel()->data( right, QgsLocatorModel::ResultFilterNameRole ).toString();
if ( leftFilter != rightFilter )
return QString::localeAwareCompare( leftFilter, rightFilter ) < 0;
// then make sure filter title appears before filter's results
int leftTypeRole = sourceModel()->data( left, QgsLocatorModel::ResultTypeRole ).toInt();
int rightTypeRole = sourceModel()->data( right, QgsLocatorModel::ResultTypeRole ).toInt();
if ( leftTypeRole != rightTypeRole )
return leftTypeRole < rightTypeRole;
// sort filter's results by score
double leftScore = sourceModel()->data( left, QgsLocatorModel::ResultScoreRole ).toDouble();
double rightScore = sourceModel()->data( right, QgsLocatorModel::ResultScoreRole ).toDouble();
if ( !qgsDoubleNear( leftScore, rightScore ) )
return leftScore > rightScore;
// lastly sort filter's results by string
leftFilter = sourceModel()->data( left, Qt::DisplayRole ).toString();
rightFilter = sourceModel()->data( right, Qt::DisplayRole ).toString();
return QString::localeAwareCompare( leftFilter, rightFilter ) < 0;
}
示例3:
QgsSymbol *QgsGraduatedSymbolRendererWidget::findSymbolForRange( double lowerBound, double upperBound, const QgsRangeList &ranges ) const
{
int decimalPlaces = mRenderer->labelFormat().precision() + 2;
if ( decimalPlaces < 0 )
decimalPlaces = 0;
double precision = 1.0 / std::pow( 10, decimalPlaces );
for ( QgsRangeList::const_iterator it = ranges.begin(); it != ranges.end(); ++it )
{
if ( qgsDoubleNear( lowerBound, it->lowerValue(), precision ) && qgsDoubleNear( upperBound, it->upperValue(), precision ) )
{
return it->symbol();
}
}
return nullptr;
}
示例4: size
void QgsMarkerSymbolV2::setDataDefinedSize( const QgsDataDefined &dd )
{
const double symbolSize = size();
for ( QgsSymbolLayerV2List::iterator it = mLayers.begin(); it != mLayers.end(); ++it )
{
QgsMarkerSymbolLayerV2* layer = static_cast<QgsMarkerSymbolLayerV2 *>( *it );
if ( dd.hasDefaultValues() )
{
layer->removeDataDefinedProperty( "size" );
layer->removeDataDefinedProperty( "offset" );
}
else
{
if ( symbolSize == 0 || qgsDoubleNear( layer->size(), symbolSize ) )
{
layer->setDataDefinedProperty( "size", new QgsDataDefined( dd ) );
}
else
{
layer->setDataDefinedProperty( "size", scaleWholeSymbol( layer->size() / symbolSize, dd ) );
}
if ( layer->offset().x() || layer->offset().y() )
{
layer->setDataDefinedProperty( "offset", scaleWholeSymbol(
layer->offset().x() / symbolSize,
layer->offset().y() / symbolSize, dd ) );
}
}
}
}
示例5: mapRotation
void QgsMapToPixel::updateMatrix()
{
double rotation = mapRotation();
#if 0 // debugging
QgsDebugMsg( QString( "XXX %7 -- xCent:%1 yCent:%2 mWidth:%3 mHeight:%4 uPP:%5 rot:%6" )
.arg( xCenter ).arg( yCenter ).arg( mWidth ).arg( mHeight )
.arg( mMapUnitsPerPixel ).arg( rotation ).arg(( quintptr )this, QT_POINTER_SIZE *2, 15, QChar( '0' ) ) );
#endif
// NOTE: operations are done in the reverse order in which
// they are configured, so translation to geographical
// center happens first, then scaling, then rotation
// and finally translation to output viewport center
if ( qgsDoubleNear( rotation, 0.0 ) )
{
//no rotation, return a simplified matrix
mMatrix = QTransform::fromScale( 1.0 / mMapUnitsPerPixel, -1.0 / mMapUnitsPerPixel )
.translate( -xMin, - ( yMin + mHeight * mMapUnitsPerPixel ) );
return;
}
double cy = mapHeight() / 2.0;
double cx = mapWidth() / 2.0;
mMatrix = QTransform::fromTranslate( cx, cy )
.rotate( rotation )
.scale( 1 / mMapUnitsPerPixel, -1 / mMapUnitsPerPixel )
.translate( -xCenter, -yCenter )
;
}
示例6: setScale
void QgsScaleComboBox::fixupScale()
{
if ( mAllowNull && currentText().trimmed().isEmpty() )
{
setScale( std::numeric_limits< double >::quiet_NaN() );
return;
}
QStringList txtList = currentText().split( ':' );
bool userSetScale = txtList.size() != 2;
bool ok;
double newScale = toDouble( currentText(), &ok );
// Valid string representation
if ( ok )
{
// if a user types scale = 2345, we transform to 1:2345
if ( userSetScale && newScale < 1.0 && !qgsDoubleNear( newScale, 0.0 ) )
{
newScale = 1 / newScale;
}
setScale( newScale );
}
else
{
setScale( mScale );
}
}
示例7: width
void QgsLineSymbolV2::setDataDefinedWidth( const QgsDataDefined& dd )
{
const double symbolWidth = width();
for ( QgsSymbolLayerV2List::iterator it = mLayers.begin(); it != mLayers.end(); ++it )
{
QgsLineSymbolLayerV2* layer = static_cast<QgsLineSymbolLayerV2*>( *it );
if ( dd.hasDefaultValues() )
{
layer->removeDataDefinedProperty( "width" );
layer->removeDataDefinedProperty( "offset" );
}
else
{
if ( symbolWidth == 0 || qgsDoubleNear( layer->width(), symbolWidth ) )
{
layer->setDataDefinedProperty( "width", new QgsDataDefined( dd ) );
}
else
{
layer->setDataDefinedProperty( "width", scaleWholeSymbol( layer->width() / symbolWidth, dd ) );
}
if ( layer->offset() )
{
layer->setDataDefinedProperty( "offset", scaleWholeSymbol( layer->offset() / symbolWidth, dd ) );
}
}
}
}
示例8: angle
void QgsMarkerSymbolV2::setDataDefinedAngle( const QgsDataDefined& dd )
{
const double symbolRotation = angle();
for ( QgsSymbolLayerV2List::iterator it = mLayers.begin(); it != mLayers.end(); ++it )
{
QgsMarkerSymbolLayerV2* layer = static_cast<QgsMarkerSymbolLayerV2 *>( *it );
if ( dd.hasDefaultValues() )
{
layer->removeDataDefinedProperty( "angle" );
}
else
{
if ( qgsDoubleNear( layer->angle(), symbolRotation ) )
{
layer->setDataDefinedProperty( "angle", new QgsDataDefined( dd ) );
}
else
{
QgsDataDefined* rotatedDD = rotateWholeSymbol( layer->angle() - symbolRotation, dd );
layer->setDataDefinedProperty( "angle", rotatedDD );
}
}
}
}
示例9: renderContext
void QgsPointMarkerItem::paint( QPainter * painter )
{
if ( !painter )
{
return;
}
QgsRenderContext rc = renderContext( painter );
bool useEffect = !qgsDoubleNear( mOpacityEffect->transparency(), 0.0 );
if ( useEffect )
{
//use a paint effect to reduce opacity. If we directly set the opacity on the painter, then the symbol will NOT
//be correctly "flattened" and parts of the symbol which should be obscured will show through
mOpacityEffect->begin( rc );
}
mMarkerSymbol->startRender( rc, mFeature.fields() );
mMarkerSymbol->renderPoint( mLocation - pos(), &mFeature, rc );
mMarkerSymbol->stopRender( rc );
if ( useEffect )
{
mOpacityEffect->end( rc );
}
}
示例10: Q_UNUSED
void QgsAtlasComposition::readXmlMapSettings( const QDomElement &elem, const QDomDocument &doc )
{
Q_UNUSED( doc );
//look for stored composer map, to upgrade pre 2.1 projects
int composerMapNo = elem.attribute( "composerMap", "-1" ).toInt();
QgsComposerMap * composerMap = nullptr;
if ( composerMapNo != -1 )
{
QList<QgsComposerMap*> maps;
mComposition->composerItems( maps );
for ( QList<QgsComposerMap*>::iterator it = maps.begin(); it != maps.end(); ++it )
{
if (( *it )->id() == composerMapNo )
{
composerMap = ( *it );
composerMap->setAtlasDriven( true );
break;
}
}
}
//upgrade pre 2.1 projects
double margin = elem.attribute( "margin", "0.0" ).toDouble();
if ( composerMap && !qgsDoubleNear( margin, 0.0 ) )
{
composerMap->setAtlasMargin( margin );
}
bool fixedScale = elem.attribute( "fixedScale", "false" ) == "true" ? true : false;
if ( composerMap && fixedScale )
{
composerMap->setAtlasScalingMode( QgsComposerMap::Fixed );
}
}
示例11: calculateCoordinatePrecision
int QgsCoordinateUtils::calculateCoordinatePrecision( double mapUnitsPerPixel, const QgsCoordinateReferenceSystem& mapCrs )
{
// Get the display precision from the project settings
bool automatic = QgsProject::instance()->readBoolEntry( "PositionPrecision", "/Automatic" );
int dp = 0;
if ( automatic )
{
QString format = QgsProject::instance()->readEntry( "PositionPrecision", "/DegreeFormat", "D" );
bool formatGeographic = ( format == "DM" || format == "DMS" || format == "D" );
// we can only calculate an automatic precision if both map CRS and format are geographic or both not geographic
if ( mapCrs.geographicFlag() == formatGeographic )
{
// Work out a suitable number of decimal places for the coordinates with the aim of always
// having enough decimal places to show the difference in position between adjacent pixels.
// Also avoid taking the log of 0.
if ( !qgsDoubleNear( mapUnitsPerPixel, 0.0 ) )
dp = static_cast<int>( ceil( -1.0 * log10( mapUnitsPerPixel ) ) );
}
else
{
dp = format == "D" ? 4 : 2; //guess sensible fallback
}
}
else
dp = QgsProject::instance()->readNumEntry( "PositionPrecision", "/DecimalPlaces" );
// Keep dp sensible
if ( dp < 0 )
dp = 0;
return dp;
}
示例12: QStringLiteral
bool QgsComposerNodesItem::readXml( const QDomElement& itemElem,
const QDomDocument& doc )
{
// restore general composer item properties
const QDomNodeList composerItemList = itemElem.elementsByTagName( QStringLiteral( "ComposerItem" ) );
if ( !composerItemList.isEmpty() )
{
QDomElement composerItemElem = composerItemList.at( 0 ).toElement();
if ( !qgsDoubleNear( composerItemElem.attribute( QStringLiteral( "rotation" ), QStringLiteral( "0" ) ).toDouble(), 0.0 ) )
setItemRotation( composerItemElem.attribute( QStringLiteral( "rotation" ), QStringLiteral( "0" ) ).toDouble() );
_readXml( composerItemElem, doc );
}
// restore style
QDomElement styleSymbolElem = itemElem.firstChildElement( QStringLiteral( "symbol" ) );
if ( !styleSymbolElem.isNull() )
_readXmlStyle( styleSymbolElem );
// restore nodes
mPolygon.clear();
QDomNodeList nodesList = itemElem.elementsByTagName( QStringLiteral( "node" ) );
for ( int i = 0; i < nodesList.size(); i++ )
{
QDomElement nodeElem = nodesList.at( i ).toElement();
QPointF newPt;
newPt.setX( nodeElem.attribute( QStringLiteral( "x" ) ).toDouble() );
newPt.setY( nodeElem.attribute( QStringLiteral( "y" ) ).toDouble() );
mPolygon.append( newPt );
}
emit itemChanged();
return true;
}
示例13: qgsDoubleNear
QgsSvgCacheEntry* QgsSvgCache::cacheEntry( const QString& file, double size, const QColor& fill, const QColor& outline, double outlineWidth,
double widthScaleFactor )
{
//search entries in mEntryLookup
QgsSvgCacheEntry* currentEntry = nullptr;
QList<QgsSvgCacheEntry*> entries = mEntryLookup.values( file );
QList<QgsSvgCacheEntry*>::iterator entryIt = entries.begin();
for ( ; entryIt != entries.end(); ++entryIt )
{
QgsSvgCacheEntry* cacheEntry = *entryIt;
if ( qgsDoubleNear( cacheEntry->size, size ) && cacheEntry->fill == fill && cacheEntry->outline == outline &&
qgsDoubleNear( cacheEntry->outlineWidth, outlineWidth ) && qgsDoubleNear( cacheEntry->widthScaleFactor, widthScaleFactor ) )
{
currentEntry = cacheEntry;
break;
}
}
//if not found: create new entry
//cache and replace params in svg content
if ( !currentEntry )
{
currentEntry = insertSVG( file, size, fill, outline, outlineWidth, widthScaleFactor );
}
else
{
takeEntryFromList( currentEntry );
if ( !mMostRecentEntry ) //list is empty
{
mMostRecentEntry = currentEntry;
mLeastRecentEntry = currentEntry;
}
else
{
mMostRecentEntry->nextEntry = currentEntry;
currentEntry->previousEntry = mMostRecentEntry;
currentEntry->nextEntry = nullptr;
mMostRecentEntry = currentEntry;
}
}
//debugging
//printEntryList();
return currentEntry;
}
示例14: hasPositionChanged
void QgsQuickPositionKit::onPositionUpdated( const QGeoPositionInfo &info )
{
bool hasPosition = info.coordinate().isValid();
if ( hasPosition != mHasPosition )
{
mHasPosition = hasPosition;
emit hasPositionChanged();
}
// Calculate position
QgsPoint position = QgsPoint(
info.coordinate().longitude(),
info.coordinate().latitude(),
info.coordinate().altitude() ); // can be NaN
if ( position != mPosition )
{
mPosition = position;
emit positionChanged();
}
// calculate accuracy
double accuracy;
if ( info.hasAttribute( QGeoPositionInfo::HorizontalAccuracy ) )
accuracy = info.attribute( QGeoPositionInfo::HorizontalAccuracy );
else
accuracy = -1;
if ( !qgsDoubleNear( accuracy, mAccuracy ) )
{
mAccuracy = accuracy;
emit accuracyChanged();
}
// calculate direction
double direction;
if ( info.hasAttribute( QGeoPositionInfo::Direction ) )
direction = info.attribute( QGeoPositionInfo::Direction );
else
direction = -1;
if ( !qgsDoubleNear( direction, mDirection ) )
{
mDirection = direction;
emit directionChanged();
}
// recalculate projected/screen variables
onMapSettingsUpdated();
}
示例15: straightDistance2d
double QgsCurve::sinuosity() const
{
double d = straightDistance2d();
if ( qgsDoubleNear( d, 0.0 ) )
return std::numeric_limits<double>::quiet_NaN();
return length() / d;
}