Skip to content
Commits on Source (5)
grass (7.4.1~rc3-1~exp1~xenial1) xenial; urgency=medium
* Rebuild for xenial.
-- Martin Landa <landa.martin@gmail.com> Thu, 07 Jun 2018 12:34:20 +0200
grass (7.4.1~rc3-1~exp1) experimental; urgency=medium
* New upstream release candidate.
-- Bas Couwenberg <sebastic@debian.org> Wed, 06 Jun 2018 18:54:10 +0200
grass (7.4.1~rc2-1~exp1~xenial1) xenial; urgency=medium
* Rebuild for xenial.
......
......@@ -581,8 +581,8 @@ static int boq_load(struct boq *q, struct line_pnts *Pnts,
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 @@ Vect_line_intersection2(struct line_pnts *APoints,
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,33 +681,46 @@ Vect_line_intersection2(struct line_pnts *APoints,
* 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;
abbox.S -= rethresh;
abbox.E += rethresh;
abbox.W -= 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 @@ Vect_line_check_intersection2(struct line_pnts *APoints,
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,17 +1349,21 @@ Vect_line_check_intersection2(struct line_pnts *APoints,
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;
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;
......
......@@ -310,6 +310,11 @@ int main(int argc, char **argv)
if ((in_proj_info = G_get_projinfo()) == NULL)
G_fatal_error(_("Unable to get projection info of input map"));
/* apparently the +over switch must be set in the input projection,
* not the output latlon projection */
if (curr_proj == PROJECTION_LL)
G_set_key_value("+over", "defined", in_proj_info);
if ((in_unit_info = G_get_projunits()) == NULL)
G_fatal_error(_("Unable to get projection units of input map"));
......