[GRASS-SVN] r72747 - grass/branches/releasebranch_7_4/lib/vector/Vlib
svn_grass at osgeo.org
svn_grass at osgeo.org
Mon May 28 12:52:30 PDT 2018
Author: mmetz
Date: 2018-05-28 12:52:30 -0700 (Mon, 28 May 2018)
New Revision: 72747
Modified:
grass/branches/releasebranch_7_4/lib/vector/Vlib/intersect2.c
Log:
Vlib: fix with_z = 0 for Vect_line_check_intersection2() and Vect_line_intersection2(), fixes #3567 (backport trunk r72746)
Modified: grass/branches/releasebranch_7_4/lib/vector/Vlib/intersect2.c
===================================================================
--- grass/branches/releasebranch_7_4/lib/vector/Vlib/intersect2.c 2018-05-28 19:51:49 UTC (rev 72746)
+++ grass/branches/releasebranch_7_4/lib/vector/Vlib/intersect2.c 2018-05-28 19:52:30 UTC (rev 72747)
@@ -581,8 +581,8 @@
int
Vect_line_intersection2(struct line_pnts *APoints,
struct line_pnts *BPoints,
- struct bound_box *ABox,
- struct bound_box *BBox,
+ struct bound_box *pABox,
+ struct bound_box *pBBox,
struct line_pnts ***ALines,
struct line_pnts ***BLines,
int *nalines, int *nblines, int with_z)
@@ -594,7 +594,7 @@
struct line_pnts **XLines, *Points;
struct line_pnts *Points1, *Points2; /* first, second points */
int seg1, seg2, vert1, vert2;
- struct bound_box abbox;
+ struct bound_box ABox, BBox, abbox;
struct boq bo_queue;
struct qitem qi, *found;
struct RB_TREE *bo_ta, *bo_tb;
@@ -681,25 +681,36 @@
* we have to break both A and B at once i.e. in one Vect_line_intersection () call.
*/
- if (!same && !Vect_box_overlap(ABox, BBox)) {
+ /* don't modify original bboxes: make a copy of the bboxes */
+ ABox = *pABox;
+ BBox = *pBBox;
+ if (!with_z) {
+ ABox.T = BBox.T = PORT_DOUBLE_MAX;
+ ABox.B = BBox.B = -PORT_DOUBLE_MAX;
+ }
+
+ if (!same && !Vect_box_overlap(&ABox, &BBox)) {
return 0;
}
/* overlap box of A line and B line */
- abbox = *ABox;
+ abbox = BBox;
if (!same) {
- if (abbox.N > BBox->N)
- abbox.N = BBox->N;
- if (abbox.S < BBox->S)
- abbox.S = BBox->S;
- if (abbox.E > BBox->E)
- abbox.E = BBox->E;
- if (abbox.W < BBox->W)
- abbox.W = BBox->W;
- if (abbox.T > BBox->T)
- abbox.T = BBox->T;
- if (abbox.B < BBox->B)
- abbox.B = BBox->B;
+ if (abbox.N > ABox.N)
+ abbox.N = ABox.N;
+ if (abbox.S < ABox.S)
+ abbox.S = ABox.S;
+ if (abbox.E > ABox.E)
+ abbox.E = ABox.E;
+ if (abbox.W < ABox.W)
+ abbox.W = ABox.W;
+
+ if (with_z) {
+ if (abbox.T > BBox.T)
+ abbox.T = BBox.T;
+ if (abbox.B < BBox.B)
+ abbox.B = BBox.B;
+ }
}
abbox.N += rethresh;
@@ -706,8 +717,10 @@
abbox.S -= rethresh;
abbox.E += rethresh;
abbox.W -= rethresh;
- abbox.T += rethresh;
- abbox.B -= rethresh;
+ if (with_z) {
+ abbox.T += rethresh;
+ abbox.B -= rethresh;
+ }
if (APnts->n_points < 2 || BPnts->n_points < 2) {
G_fatal_error("Intersection with points is not yet supported");
@@ -1317,6 +1330,10 @@
dig_line_box(APoints, &ABox);
dig_line_box(BPoints, &BBox);
+ if (!with_z) {
+ ABox.T = BBox.T = PORT_DOUBLE_MAX;
+ ABox.B = BBox.B = -PORT_DOUBLE_MAX;
+ }
if (!Vect_box_overlap(&ABox, &BBox)) {
return 0;
@@ -1332,18 +1349,22 @@
abbox.E = ABox.E;
if (abbox.W < ABox.W)
abbox.W = ABox.W;
- if (abbox.T > ABox.T)
- abbox.T = ABox.T;
- if (abbox.B < ABox.B)
- abbox.B = ABox.B;
abbox.N += rethresh;
abbox.S -= rethresh;
abbox.E += rethresh;
abbox.W -= rethresh;
- abbox.T += rethresh;
- abbox.B -= rethresh;
+ if (with_z) {
+ if (abbox.T > ABox.T)
+ abbox.T = ABox.T;
+ if (abbox.B < ABox.B)
+ abbox.B = ABox.B;
+
+ abbox.T += rethresh;
+ abbox.B -= rethresh;
+ }
+
/* initialize queue */
bo_queue.count = 0;
bo_queue.alloc = 2 * (APnts->n_points + BPnts->n_points);
More information about the grass-commit
mailing list