diff pkg/octree/vertex.go @ 795:bd5f38eb6153

Vertical Triangle intersection: Fixed function to determine where intersection point is relatively to the vertices.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Thu, 27 Sep 2018 10:57:39 +0200
parents ce23a4192788
children 0cc97135717c
line wrap: on
line diff
--- a/pkg/octree/vertex.go	Thu Sep 27 10:12:41 2018 +0200
+++ b/pkg/octree/vertex.go	Thu Sep 27 10:57:39 2018 +0200
@@ -4,6 +4,7 @@
 	"bytes"
 	"encoding/binary"
 	"io"
+	"log"
 	"math"
 	"sort"
 )
@@ -421,20 +422,9 @@
 }
 
 func relative(v1, v2 Vertex) func(x, y float64) float64 {
-
-	length := dist(v1.X, v1.Y, v2.X, v2.Y)
-
-	// f(0) = v1.Z
-	// f(length) = v2.Z
-	// v1.Z = 0*m + b
-	// v2.Z = length*m + b
-
-	b := v1.Z
-	m := (v2.Z - v1.Z) / length
-
+	ls := linearScale(v1.X, v1.Y, v2.X, v2.Y)
 	return func(x, y float64) float64 {
-		l := dist(v1.X, v1.Y, x, y)
-		return m*l + b
+		return ls(Vertex{x, y, 0})
 	}
 }
 
@@ -471,6 +461,8 @@
 		o1 := onPlane(s1)
 		o2 := onPlane(s2)
 
+		log.Printf("s1, s2: %t %t\n", o1, o2)
+
 		switch {
 		case o1 && o2:
 			pos := relative(t[i], t[j])
@@ -532,15 +524,23 @@
 			if !intersects {
 				continue edges
 			}
+
+			log.Println("Intersection -----------------------------")
 			t1 := relative(t[i], t[j])(x, y)
+			log.Printf("rel p1: %f\n", relative(t[i], t[j])(t[i].X, t[i].Y))
+			log.Printf("rel p2: %f\n", relative(t[i], t[j])(t[j].X, t[j].Y))
+			log.Printf("relative pos: %f\n", t1)
 			if !inRange(t1) {
 				continue edges
 			}
 
+			log.Println("valid ***************")
+
 			z := interpolate(t[j].Z, t[i].Z)(t1)
 			n := Vertex{x, y, z}
 
 			if math.Signbit(s1) != math.Signbit(s2) {
+				log.Println("\ton different sides")
 				// different sides -> vertex on edge.
 				out = append(out, n)
 			} else { // same side -> inside. Find peer
@@ -613,6 +613,8 @@
 		}
 	}
 
+	log.Printf("length out: %d\n", len(out))
+
 	// supress single point touches.
 	if len(out) == 1 {
 		out = out[:0]