OGRBoolean OGRLinearRing::isPointOnRingBoundary(const OGRPoint* poPoint, int bTestEnvelope) const { if ( NULL == poPoint ) { CPLDebug( "OGR", "OGRLinearRing::isPointOnRingBoundary(const OGRPoint* poPoint) - passed point is NULL!" ); return 0; } const int iNumPoints = getNumPoints(); // Simple validation if ( iNumPoints < 4 ) return 0; const double dfTestX = poPoint->getX(); const double dfTestY = poPoint->getY(); // Fast test if point is inside extent of the ring if( bTestEnvelope ) { OGREnvelope extent; getEnvelope(&extent); if ( !( dfTestX >= extent.MinX && dfTestX <= extent.MaxX && dfTestY >= extent.MinY && dfTestY <= extent.MaxY ) ) { return 0; } } double prev_diff_x = getX(0) - dfTestX; double prev_diff_y = getY(0) - dfTestY; for ( int iPoint = 1; iPoint < iNumPoints; iPoint++ ) { const double x1 = getX(iPoint) - dfTestX; const double y1 = getY(iPoint) - dfTestY; const double x2 = prev_diff_x; const double y2 = prev_diff_y; /* If the point is on the segment, return immediatly */ /* FIXME? If the test point is not exactly identical to one of */ /* the vertices of the ring, but somewhere on a segment, there's */ /* little chance that we get 0. So that should be tested against some epsilon */ if ( x1 * y2 - x2 * y1 == 0 ) { /* If iPoint and iPointPrev are the same, go on */ if( !(x1 == x2 && y1 == y2) ) { return 1; } } prev_diff_x = x1; prev_diff_y = y1; } return 0; }
bool RepeatedTimeData::insertSignalValue(quint64 index, qreal value) { bool retval=false; const qreal * envelopData; qreal *_s=signalData(); RepeatedTimeDataParams* _params=dynamic_cast<RepeatedTimeDataParams*>(getDataParameters()); Q_ASSERT(_params); quint64 _sampleSingleShotDuration=qFloor((_params->duration()+_params->blankTime())*_params->sampleRate()); quint64 lowestIndex=lowestSampleIndexForModification(); bool _envEnable=getEnvelopeParameters()->isEnabledEnvelope(); if (_envEnable) { envelopData=getEnvelope()->getEnvelope(); } qreal _tVal; if ((lowestIndex<=index) && (index<=highestSampleIndexForModification()) ) { _tVal=(_envEnable ? value*envelopData[index-lowestIndex] : value); quint64 i; for (unsigned int _rep=0; _rep < m_repetitions; _rep++) { i=_rep*_sampleSingleShotDuration+index; // Q_ASSERT(i<=getSampleNumber()); if (i<=getSampleNumber()) _s[i]= _tVal; else break; } retval=true; } return retval; }
OGRBoolean OGRLinearRing::isPointInRing(const OGRPoint* poPoint, int bTestEnvelope) const { if ( NULL == poPoint ) { CPLDebug( "OGR", "OGRLinearRing::isPointInRing(const OGRPoint* poPoint) - passed point is NULL!" ); return 0; } const int iNumPoints = getNumPoints(); // Simple validation if ( iNumPoints < 4 ) return 0; const double dfTestX = poPoint->getX(); const double dfTestY = poPoint->getY(); // Fast test if point is inside extent of the ring if (bTestEnvelope) { OGREnvelope extent; getEnvelope(&extent); if ( !( dfTestX >= extent.MinX && dfTestX <= extent.MaxX && dfTestY >= extent.MinY && dfTestY <= extent.MaxY ) ) { return 0; } } // For every point p in ring, // test if ray starting from given point crosses segment (p - 1, p) int iNumCrossings = 0; for ( int iPoint = 1; iPoint < iNumPoints; iPoint++ ) { const int iPointPrev = iPoint - 1; const double x1 = getX(iPoint) - dfTestX; const double y1 = getY(iPoint) - dfTestY; const double x2 = getX(iPointPrev) - dfTestX; const double y2 = getY(iPointPrev) - dfTestY; if( ( ( y1 > 0 ) && ( y2 <= 0 ) ) || ( ( y2 > 0 ) && ( y1 <= 0 ) ) ) { // Check if ray intersects with segment of the ring const double dfIntersection = ( x1 * y2 - x2 * y1 ) / (y2 - y1); if ( 0.0 < dfIntersection ) { // Count intersections iNumCrossings++; } } } // If iNumCrossings number is even, given point is outside the ring, // when the crossings number is odd, the point is inside the ring. return ( ( iNumCrossings % 2 ) == 1 ? 1 : 0 ); }
void OGRCurveCollection::getEnvelope( OGREnvelope * psEnvelope ) const { OGREnvelope3D oEnv3D; getEnvelope(&oEnv3D); psEnvelope->MinX = oEnv3D.MinX; psEnvelope->MinY = oEnv3D.MinY; psEnvelope->MaxX = oEnv3D.MaxX; psEnvelope->MaxY = oEnv3D.MaxY; }