Mercurial > gemma
changeset 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 | afe62d1ce01c |
children | 0cc97135717c |
files | pkg/octree/vertex.go |
diffstat | 1 files changed, 15 insertions(+), 13 deletions(-) [+] |
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]