changeset 5419:202715173935 marking-single-beam

Do clipping correctly.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Wed, 07 Jul 2021 19:24:03 +0200
parents e89ff1894bb4
children 851c14d57680
files pkg/imports/sr.go pkg/mesh/vertex.go
diffstat 2 files changed, 25 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/pkg/imports/sr.go	Wed Jul 07 18:27:40 2021 +0200
+++ b/pkg/imports/sr.go	Wed Jul 07 19:24:03 2021 +0200
@@ -642,6 +642,17 @@
 
 		feedback.Info("Building final mesh took %v.", time.Since(start))
 		feedback.Info("Store mesh.")
+	} else {
+		start = time.Now()
+		clippingPolygonBuffered.Indexify()
+		removed = make(map[int32]struct{})
+		for i, v := range xyz {
+			if clippingPolygonBuffered.IntersectionBox2D(v.Box2D()) == mesh.IntersectionOutSide {
+				removed[int32(i)] = struct{}{}
+			}
+		}
+		feedback.Info("Clipping took %v.", time.Since(start))
+		feedback.Info("Number of points to clip %d.", len(removed))
 	}
 
 	start = time.Now()
@@ -702,7 +713,7 @@
 	} else { // SurveyTypeMarking
 		if err := generateMarkingPoints(
 			ctx, tx, feedback,
-			xyz, epsg,
+			xyz, removed, epsg,
 			id,
 		); err != nil {
 			return nil, err
@@ -953,18 +964,19 @@
 	tx *sql.Tx,
 	feedback Feedback,
 	xyz mesh.MultiPointZ,
+	removed map[int32]struct{},
 	epsg uint32,
 	id int64,
 ) error {
 	log.Printf("debug: generateMarkingPoints")
 
-	min, max := mesh.MinMaxVertex(xyz.All())
+	min, max := mesh.MinMaxVertex(xyz.FilterRemoved(removed))
 
 	log.Printf("debug: min/max %.2f/%.2f\n", min.Z, max.Z)
 
 	heights := loadClassBreaks(ctx, tx, feedback, min.Z, max.Z)
 
-	classes := heights.Classify(xyz.All())
+	classes := heights.Classify(xyz.FilterRemoved(removed))
 
 	// Should not happen ... Z values over the top.
 	if n := len(classes) - 1; n > 1 && len(classes[n]) > 0 {
--- a/pkg/mesh/vertex.go	Wed Jul 07 18:27:40 2021 +0200
+++ b/pkg/mesh/vertex.go	Wed Jul 07 19:24:03 2021 +0200
@@ -163,6 +163,16 @@
 	return math.Sqrt(v.Dot(v))
 }
 
+// Box2D constructs a Box2D of this vertex.
+func (v Vertex) Box2D() Box2D {
+	return Box2D{
+		X1: v.X,
+		Y1: v.Y,
+		X2: v.X,
+		Y2: v.Y,
+	}
+}
+
 func area(a, b, c Vertex) float64 {
 	return (b.Y-a.Y)*(c.X-b.X) - (b.X-a.X)*(c.Y-b.Y)
 }