Skip to content

Commit b1957e6

Browse files
author
mhugent
committedApr 24, 2006
only use one closestSegment method of qgsgeometry
git-svn-id: http://svn.osgeo.org/qgis/trunk/qgis@5362 c8812cc2-4d05-0410-92ff-de0c093fc19c
1 parent 0fadefa commit b1957e6

File tree

3 files changed

+33
-45
lines changed

3 files changed

+33
-45
lines changed
 

‎src/core/qgsgeometry.cpp

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ void QgsGeometry::setGeos(geos::Geometry* geos)
214214

215215
}
216216

217-
QgsPoint QgsGeometry::closestVertex(const QgsPoint& point) const
217+
QgsPoint QgsGeometry::closestVertex(const QgsPoint& point, QgsGeometryVertexIndex& atVertex, double& sqrDist) const
218218
{
219219
if(mDirtyWkb)
220220
{
@@ -223,9 +223,10 @@ QgsPoint QgsGeometry::closestVertex(const QgsPoint& point) const
223223

224224
if(mGeometry)
225225
{
226+
int vertexnr;
227+
int vertexcounter = 0;
226228
int wkbType;
227229
double actdist = std::numeric_limits<double>::max();
228-
229230
double x,y;
230231
double *tempx,*tempy;
231232
memcpy(&wkbType, (mGeometry+1), sizeof(int));
@@ -234,6 +235,8 @@ QgsPoint QgsGeometry::closestVertex(const QgsPoint& point) const
234235
case QGis::WKBPoint:
235236
x = *((double *) (mGeometry + 5));
236237
y = *((double *) (mGeometry + 5 + sizeof(double)));
238+
sqrDist = point.sqrDist(x, y);
239+
vertexnr = 0;
237240
break;
238241

239242
case QGis::WKBLineString:
@@ -251,6 +254,7 @@ QgsPoint QgsGeometry::closestVertex(const QgsPoint& point) const
251254
x=*tempx;
252255
y=*tempy;
253256
actdist=point.sqrDist(*tempx,*tempy);
257+
vertexnr = index;
254258
}
255259
ptr+=sizeof(double);
256260
}
@@ -275,8 +279,10 @@ QgsPoint QgsGeometry::closestVertex(const QgsPoint& point) const
275279
x=*tempx;
276280
y=*tempy;
277281
actdist=point.sqrDist(*tempx,*tempy);
282+
vertexnr = vertexcounter;
278283
}
279284
ptr+=sizeof(double);
285+
++vertexcounter;
280286
}
281287
}
282288
}
@@ -296,6 +302,7 @@ QgsPoint QgsGeometry::closestVertex(const QgsPoint& point) const
296302
x=*tempx;
297303
y=*tempy;
298304
actdist=point.sqrDist(*tempx,*tempy);
305+
vertexnr = index;
299306
}
300307
ptr+=(2*sizeof(double));
301308
}
@@ -322,9 +329,10 @@ QgsPoint QgsGeometry::closestVertex(const QgsPoint& point) const
322329
x=*tempx;
323330
y=*tempy;
324331
actdist=point.sqrDist(*tempx,*tempy);
332+
vertexnr = vertexcounter;
325333
}
326334
ptr+=sizeof(double);
327-
335+
++vertexcounter;
328336
}
329337
}
330338
}
@@ -355,8 +363,10 @@ QgsPoint QgsGeometry::closestVertex(const QgsPoint& point) const
355363
x=*tempx;
356364
y=*tempy;
357365
actdist=point.sqrDist(*tempx,*tempy);
366+
vertexnr = vertexcounter;
358367
}
359368
ptr+=sizeof(double);
369+
++vertexcounter;
360370
}
361371
}
362372
}
@@ -366,6 +376,9 @@ QgsPoint QgsGeometry::closestVertex(const QgsPoint& point) const
366376
default:
367377
break;
368378
}
379+
sqrDist = actdist;
380+
atVertex.clear();
381+
atVertex.push_back(vertexnr);
369382
return QgsPoint(x,y);
370383
}
371384
return QgsPoint(0,0);

‎src/core/qgsgeometry.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,9 +83,9 @@ class QgsGeometry {
8383
void setGeos(geos::Geometry* geos);
8484

8585
/**
86-
Returns the vertex closest to the given point
86+
Returns the vertex closest to the given point (and also vertex index and squared distance)
8787
*/
88-
QgsPoint closestVertex(const QgsPoint& point) const;
88+
QgsPoint closestVertex(const QgsPoint& point, QgsGeometryVertexIndex& atVertex, double& sqrDist) const;
8989

9090
/** Insert a new vertex before the given vertex index,
9191
* ring and item (first number is index 0)

‎src/gui/qgsvectorlayer.cpp

Lines changed: 15 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -2813,7 +2813,8 @@ bool QgsVectorLayer::snapPoint(QgsPoint& point, double tolerance)
28132813
double mindisty=point.y();
28142814
QgsFeature* fet;
28152815
QgsPoint vertexFeature;//the closest vertex of a feature
2816-
double minvertexdist;//the distance between 'point' and 'vertexFeature'
2816+
QgsGeometryVertexIndex vindex;
2817+
double minsquaredist;
28172818

28182819
QgsRect selectrect(point.x()-tolerance,point.y()-tolerance,point.x()+tolerance,point.y()+tolerance);
28192820
selectrect = inverseProjectRect(selectrect);
@@ -2825,18 +2826,17 @@ bool QgsVectorLayer::snapPoint(QgsPoint& point, double tolerance)
28252826
{
28262827
if(mChangedGeometries.find(fet->featureId()) != mChangedGeometries.end())//if geometry has been changed, use the new geometry
28272828
{
2828-
vertexFeature = mChangedGeometries[fet->featureId()].closestVertex(point);
2829+
vertexFeature = mChangedGeometries[fet->featureId()].closestVertex(point, vindex, minsquaredist);
28292830
}
28302831
else
28312832
{
2832-
vertexFeature=fet->geometry()->closestVertex(point);
2833+
vertexFeature=fet->geometry()->closestVertex(point, vindex, minsquaredist);
28332834
}
2834-
minvertexdist=vertexFeature.sqrDist(point.x(),point.y());
2835-
if(minvertexdist<mindist)
2835+
if(minsquaredist<mindist)
28362836
{
28372837
mindistx=vertexFeature.x();
28382838
mindisty=vertexFeature.y();
2839-
mindist=minvertexdist;
2839+
mindist=minsquaredist;
28402840
}
28412841
}
28422842

@@ -2845,31 +2845,29 @@ bool QgsVectorLayer::snapPoint(QgsPoint& point, double tolerance)
28452845
{
28462846
if(mChangedGeometries.find((*iter)->featureId()) != mChangedGeometries.end())//use the changed geometry
28472847
{
2848-
vertexFeature = mChangedGeometries[(*iter)->featureId()].closestVertex(point);
2848+
vertexFeature = mChangedGeometries[(*iter)->featureId()].closestVertex(point, vindex, minsquaredist);
28492849
}
28502850
else
28512851
{
2852-
vertexFeature=(*iter)->geometry()->closestVertex(point);
2852+
vertexFeature=(*iter)->geometry()->closestVertex(point, vindex, minsquaredist);
28532853
}
2854-
minvertexdist=vertexFeature.sqrDist(point.x(),point.y());
2855-
if(minvertexdist<mindist)
2854+
if(minsquaredist<mindist)
28562855
{
28572856
mindistx=vertexFeature.x();
28582857
mindisty=vertexFeature.y();
2859-
mindist=minvertexdist;
2858+
mindist=minsquaredist;
28602859
}
28612860
}
28622861

28632862
//and also go through the changed geometries, because the spatial filter of the provider did not consider feature changes
28642863
for(std::map<int, QgsGeometry>::const_iterator iter = mChangedGeometries.begin(); iter != mChangedGeometries.end(); ++iter)
28652864
{
2866-
vertexFeature = iter->second.closestVertex(point);
2867-
minvertexdist=vertexFeature.sqrDist(point.x(),point.y());
2868-
if(minvertexdist<mindist)
2865+
vertexFeature = iter->second.closestVertex(point, vindex, minsquaredist);
2866+
if(minsquaredist<mindist)
28692867
{
28702868
mindistx=vertexFeature.x();
28712869
mindisty=vertexFeature.y();
2872-
mindist=minvertexdist;
2870+
mindist=minsquaredist;
28732871
}
28742872
}
28752873

@@ -2891,16 +2889,6 @@ bool QgsVectorLayer::snapVertexWithContext(QgsPoint& point,
28912889

28922890
QgsPoint origPoint = point;
28932891

2894-
#ifdef QGISDEBUG
2895-
std::cout << "QgsVectorLayer::snapVertexWithContext: Entering."
2896-
<< "." << std::endl;
2897-
#endif
2898-
2899-
#ifdef QGISDEBUG
2900-
std::cout << "QgsVectorLayer::snapVertexWithContext: Tolerance: " << tolerance << ", dataProvider = '" << dataProvider
2901-
<< "'." << std::endl;
2902-
#endif
2903-
29042892
// Sanity checking
29052893
if ( tolerance<=0 ||
29062894
!dataProvider)
@@ -2938,10 +2926,7 @@ bool QgsVectorLayer::snapVertexWithContext(QgsPoint& point,
29382926
feature->setGeometry( mChangedGeometries[ feature->featureId() ] );
29392927
}
29402928

2941-
minDistSegPoint = feature->geometry()->closestVertexWithContext(origPoint,
2942-
atVertexTemp,
2943-
testSqrDist);
2944-
2929+
minDistSegPoint = feature->geometry()->closestVertex(origPoint, atVertexTemp, testSqrDist);
29452930
if (testSqrDist < minSqrDist)
29462931
{
29472932
point = minDistSegPoint;
@@ -2951,13 +2936,6 @@ bool QgsVectorLayer::snapVertexWithContext(QgsPoint& point,
29512936
snappedFeatureId = feature->featureId();
29522937
snappedGeometry = *(feature->geometry());
29532938
vertexFound = true;
2954-
2955-
#ifdef QGISDEBUG
2956-
std::cout << "QgsVectorLayer::snapVertexWithContext: minSqrDist reduced to: " << minSqrDist
2957-
// << " and beforeVertex " << beforeVertex
2958-
<< "." << std::endl;
2959-
#endif
2960-
29612939
}
29622940
}
29632941

@@ -2972,10 +2950,7 @@ bool QgsVectorLayer::snapVertexWithContext(QgsPoint& point,
29722950
iter != mAddedFeatures.end();
29732951
++iter)
29742952
{
2975-
minDistSegPoint = (*iter)->geometry()->closestVertexWithContext(origPoint,
2976-
atVertexTemp,
2977-
testSqrDist);
2978-
2953+
minDistSegPoint = (*iter)->geometry()->closestVertex(origPoint, atVertexTemp, testSqrDist);
29792954
if (testSqrDist < minSqrDist)
29802955
{
29812956
point = minDistSegPoint;

0 commit comments

Comments
 (0)
Please sign in to comment.