Mercurial > gemma
diff cmd/octreediff/main.go @ 2572:7686c7c23506
Morphological differences: Moved some code into octree package.
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Mon, 11 Mar 2019 14:00:49 +0100 |
parents | 1ec4c5633eb6 |
children | 2833ff156cb2 |
line wrap: on
line diff
--- a/cmd/octreediff/main.go Mon Mar 11 13:42:27 2019 +0100 +++ b/cmd/octreediff/main.go Mon Mar 11 14:00:49 2019 +0100 @@ -130,97 +130,6 @@ } } -type point struct { - x float64 - y float64 -} - -type pointMap map[point]float64 - -func (pm pointMap) triangulate() (*octree.Triangulation, error) { - vertices := make([]octree.Vertex, len(pm)) - var i int - for p, z := range pm { - vertices[i] = octree.Vertex{X: p.x, Y: p.y, Z: z} - i++ - } - return octree.Triangulate(vertices) -} - -func sliceWork( - vs []octree.Vertex, - dst pointMap, - fn func([]octree.Vertex, func([]octree.Vertex) []octree.Vertex), -) { - n := runtime.NumCPU() - - wg := new(sync.WaitGroup) - - slices := make(chan []octree.Vertex) - out := make(chan []octree.Vertex) - - pool := make(chan []octree.Vertex, n) - - const pageSize = 2048 - - turn := func(p []octree.Vertex) []octree.Vertex { - if p != nil { - out <- p - } - select { - case p = <-pool: - default: - p = make([]octree.Vertex, 0, pageSize) - } - return p - } - - for i := 0; i < n; i++ { - wg.Add(1) - go func() { - defer wg.Done() - for slice := range slices { - fn(slice, turn) - } - }() - } - done := make(chan struct{}) - go func() { - defer close(done) - for s := range out { - for i := range s { - v := &s[i] - key := point{x: v.X, y: v.Y} - if z, found := dst[key]; found { - dst[key] = (z + v.Z) * 0.5 - } else { - dst[key] = v.Z - } - } - select { - case pool <- s[:0:pageSize]: - default: - } - } - }() - - size := len(vs)/n + 1 - for len(vs) > 0 { - var l int - if len(vs) < size { - l = len(vs) - } else { - l = size - } - slices <- vs[:l] - vs = vs[l:] - } - close(slices) - wg.Wait() - close(out) - <-done -} - func process(bottleneck string, firstDate, secondDate time.Time) error { start := time.Now() defer func() { log.Printf("processing took %v\n", time.Since(start)) }() @@ -310,53 +219,7 @@ log.Printf("loading took %v\n", now.Sub(start)) last := now - firstVs, secondVs := first.Vertices(), second.Vertices() - - result := make(pointMap, len(firstVs)+len(secondVs)) - - sliceWork( - firstVs, - result, - func( - slice []octree.Vertex, - turn func([]octree.Vertex) []octree.Vertex, - ) { - p := turn(nil) - for i := range slice { - v := &slice[i] - if z, found := second.Value(v.X, v.Y); found { - p = append(p, octree.Vertex{v.X, v.Y, v.Z - z}) - if len(p) == cap(p) { - p = turn(p) - } - } - } - if len(p) > 0 { - turn(p) - } - }) - - sliceWork( - secondVs, - result, - func( - slice []octree.Vertex, - turn func([]octree.Vertex) []octree.Vertex, - ) { - p := turn(nil) - for i := range slice { - v := &slice[i] - if z, found := first.Value(v.X, v.Y); found { - p = append(p, octree.Vertex{v.X, v.Y, z - v.Z}) - if len(p) == cap(p) { - p = turn(p) - } - } - } - if len(p) > 0 { - turn(p) - } - }) + result := first.Diff(second) now = time.Now() log.Printf("setting in took %v\n", now.Sub(last)) @@ -384,7 +247,7 @@ log.Printf("loading clipping polygon took %v\n", now.Sub(last)) last = now - tri, err := result.triangulate() + tri, err := result.Triangulate() if err != nil { return err }