changeset 4533:3998a9ab69c6 iso-areas

Find out which triangles are fully inside classes.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Wed, 25 Sep 2019 13:04:08 +0200
parents 769f723c2581
children b7d31a449dd2
files cmd/isoareas/main.go
diffstat 1 files changed, 42 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/cmd/isoareas/main.go	Tue Sep 24 18:03:43 2019 +0200
+++ b/cmd/isoareas/main.go	Wed Sep 25 13:04:08 2019 +0200
@@ -87,12 +87,15 @@
 
 	type indexedCut struct {
 		cut   octree.LineStringZ
-		index int
+		index int32
 	}
 
 	cuts := make([][]indexedCut, len(heights))
 
-	for i := 0; i < len(tri.Triangles); i += 3 {
+	classes := make([][]int32, len(heights)+1)
+
+all:
+	for i := int32(0); i < int32(len(tri.Triangles)); i += 3 {
 		ti := tri.Triangles[i : i+3]
 		t := octree.Triangle{
 			tri.Points[ti[0]],
@@ -100,26 +103,44 @@
 			tri.Points[ti[2]],
 		}
 		min := math.Min(t[0].Z, math.Min(t[1].Z, t[2].Z))
+
+		if min > heights[len(heights)-1] {
+			classes[len(classes)-1] = append(classes[len(classes)-1], i/3)
+			continue
+		}
 		max := math.Max(t[0].Z, math.Max(t[1].Z, t[2].Z))
 
 		for j, h := range heights {
-			if h < min {
+
+			var l float64
+			if j > 0 {
+				l = heights[j-1]
+			} else {
+				l = -math.MaxFloat64
+			}
+
+			if l < min && max < h {
+				classes[j] = append(classes[j], i/3)
+				continue all
+			}
+			if min > h || max < h {
 				continue
 			}
-			if h > max {
-				break
+			cut := t.IntersectHorizontal(h)
+			if len(cut) >= 2 {
+				cuts[j] = append(cuts[j], indexedCut{cut, i / 3})
 			}
-			cut := t.IntersectHorizontal(h)
-			if len(cut) < 2 {
-				continue
-			}
-			cuts[j] = append(cuts[j], indexedCut{cut, i})
 		}
 	}
 
-	log.Println("cuts")
-	for i := range cuts {
-		log.Printf("%.3f: %d\n", heights[i], len(cuts[i]))
+	log.Println("inside classes:")
+	for _, c := range classes {
+		log.Printf("\t%d\n", len(c))
+	}
+
+	log.Println("cuts:")
+	for i, c := range cuts {
+		log.Printf("\t%.3f: %d\n", heights[i], len(c))
 	}
 
 	// TODO: sew segments together.
@@ -130,9 +151,12 @@
 
 	heights, err := octree.ParseClassBreaks(classBreaks)
 	check(err)
+	log.Printf("num classes: %d\n", len(heights))
 
+	start := time.Now()
 	xyz, err := loadXYZ(os.Stdin)
 	check(err)
+	log.Printf("loading took %v\n", time.Since(start))
 
 	log.Printf("num vertices: %d\n", len(xyz))
 
@@ -142,14 +166,14 @@
 		min.X, min.Y, min.Z,
 		max.X, max.Y, max.Z)
 
-	heights = octree.ExtrapolateClassBreaks(heights, min.Z, max.Z)
-
-	log.Printf("classes: %d\n", len(heights))
-
+	start = time.Now()
 	tri, err := octree.Triangulate(xyz)
 	check(err)
+	log.Printf("triangulation took %v\n", time.Since(time.Now()))
 
-	start := time.Now()
+	log.Printf("number of triangles: %d\n", len(tri.Triangles)/3)
+
+	start = time.Now()
 	intersectTriangles(tri, heights)
 	log.Printf("intersecting triangles took %v.\n", time.Since(start))
 }