annotate pkg/octree/contours.go @ 2549:9bf6b767a56a

client: refactored and improved splitscreen for diagrams To make different diagrams possible, the splitscreen view needed to be decoupled from the cross profiles. Also the style has changed to make it more consistent with the rest of the app. The standard box header is now used and there are collapse and expand animations.
author Markus Kottlaender <markus@intevation.de>
date Fri, 08 Mar 2019 08:50:47 +0100
parents 45d51a49f191
children 647a58ee9ae9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1017
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 977
diff changeset
1 // This is Free Software under GNU Affero General Public License v >= 3.0
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 977
diff changeset
2 // without warranty, see README.md and license for details.
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 977
diff changeset
3 //
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 977
diff changeset
4 // SPDX-License-Identifier: AGPL-3.0-or-later
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 977
diff changeset
5 // License-Filename: LICENSES/AGPL-3.0.txt
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 977
diff changeset
6 //
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 977
diff changeset
7 // Copyright (C) 2018 by via donau
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 977
diff changeset
8 // – Österreichische Wasserstraßen-Gesellschaft mbH
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 977
diff changeset
9 // Software engineering by Intevation GmbH
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 977
diff changeset
10 //
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 977
diff changeset
11 // Author(s):
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 977
diff changeset
12 // * Sascha L. Teichmann <sascha.teichmann@intevation.de>
1317
5443f5c9154c Added missing authors names in Go files.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1186
diff changeset
13 // * Tom Gottfried <tom.gottfried@intevation.de>
1017
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 977
diff changeset
14
976
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
15 package octree
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
16
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
17 import (
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
18 "runtime"
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
19 "sync"
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
20 )
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
21
1692
f4dcbe8941a1 Octree: Resolved the remaing golint issues with this package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1317
diff changeset
22 // ContourResult stores an calculated iso line for a given height.
f4dcbe8941a1 Octree: Resolved the remaing golint issues with this package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1317
diff changeset
23 // Is used as a future variable in the concurrent iso line calculation.
977
4a2ca0e20006 Fixed build error.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 976
diff changeset
24 type ContourResult struct {
4a2ca0e20006 Fixed build error.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 976
diff changeset
25 Height float64
4a2ca0e20006 Fixed build error.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 976
diff changeset
26 Lines MultiLineStringZ
1134
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
27
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
28 done bool
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
29 mu sync.Mutex
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
30 cond *sync.Cond
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
31 }
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
32
1692
f4dcbe8941a1 Octree: Resolved the remaing golint issues with this package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1317
diff changeset
33 // NewContourResult prepares a future variable to later hold
f4dcbe8941a1 Octree: Resolved the remaing golint issues with this package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1317
diff changeset
34 // the result of the iso line calculation.
1186
ba0d8c327b0b Made code more idiomatic.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1184
diff changeset
35 func NewContourResult(height float64) *ContourResult {
1134
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
36 cr := ContourResult{Height: height}
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
37 cr.cond = sync.NewCond(&cr.mu)
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
38 return &cr
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
39 }
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
40
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
41 func (cr *ContourResult) wait() {
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
42 cr.cond.L.Lock()
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
43 for !cr.done {
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
44 cr.cond.Wait()
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
45 }
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
46 cr.cond.L.Unlock()
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
47 }
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
48
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
49 func (cr *ContourResult) get() float64 {
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
50 cr.cond.L.Lock()
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
51 defer cr.cond.L.Unlock()
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
52 return cr.Height
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
53 }
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
54
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
55 func (cr *ContourResult) set(lines MultiLineStringZ) {
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
56 cr.cond.L.Lock()
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
57 defer cr.cond.L.Unlock()
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
58 cr.Lines = lines
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
59 cr.done = true
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
60 cr.cond.Signal()
976
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
61 }
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
62
1692
f4dcbe8941a1 Octree: Resolved the remaing golint issues with this package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1317
diff changeset
63 // DoContours calculates the iso line for the given heights.
f4dcbe8941a1 Octree: Resolved the remaing golint issues with this package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1317
diff changeset
64 // This is done concurrently.
f4dcbe8941a1 Octree: Resolved the remaing golint issues with this package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1317
diff changeset
65 // It is guaranteed that the results are given to the store
f4dcbe8941a1 Octree: Resolved the remaing golint issues with this package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1317
diff changeset
66 // function in order of the original heights values.
1184
064d44ccc6f2 Adjust contour lines heights to multiples of step width
Tom Gottfried <tom@intevation.de>
parents: 1134
diff changeset
67 func DoContours(tree *Tree, heights []float64, store func(*ContourResult)) {
976
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
68
2479
c85b16db8a02 Calculate better triangulation and store it into database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1692
diff changeset
69 if len(heights) == 0 {
c85b16db8a02 Calculate better triangulation and store it into database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1692
diff changeset
70 return
c85b16db8a02 Calculate better triangulation and store it into database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1692
diff changeset
71 }
c85b16db8a02 Calculate better triangulation and store it into database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1692
diff changeset
72
1186
ba0d8c327b0b Made code more idiomatic.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1184
diff changeset
73 contours := make([]*ContourResult, len(heights))
ba0d8c327b0b Made code more idiomatic.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1184
diff changeset
74
ba0d8c327b0b Made code more idiomatic.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1184
diff changeset
75 for i, h := range heights {
ba0d8c327b0b Made code more idiomatic.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1184
diff changeset
76 contours[i] = NewContourResult(h)
1134
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
77 }
976
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
78
1134
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
79 jobs := make(chan *ContourResult)
976
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
80
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
81 var wg sync.WaitGroup
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
82 for i, n := 0, runtime.NumCPU(); i < n; i++ {
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
83 wg.Add(1)
1134
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
84 go processLevels(tree, jobs, &wg)
976
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
85 }
1134
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
86
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
87 done := make(chan struct{})
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
88 go func() {
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
89 defer close(done)
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
90 for _, cr := range contours {
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
91 cr.wait()
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
92 store(cr)
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
93 }
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
94 }()
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
95
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
96 for _, cr := range contours {
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
97 jobs <- cr
976
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
98 }
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
99 close(jobs)
1134
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
100
976
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
101 wg.Wait()
1134
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
102 <-done
976
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
103 }
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
104
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
105 func processLevels(
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
106 tree *Tree,
1134
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
107 jobs <-chan *ContourResult,
976
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
108 wg *sync.WaitGroup,
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
109 ) {
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
110 defer wg.Done()
1134
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
111 for cr := range jobs {
976
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
112 var lines MultiLineStringZ
1134
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
113 h := cr.get()
976
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
114 tree.Horizontal(h, func(t *Triangle) {
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
115 line := t.IntersectHorizontal(h)
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
116 if len(line) > 1 {
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
117 lines = append(lines, line)
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
118 }
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
119 })
1134
0420761c1c3f Store contour lines in deterministic order.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1017
diff changeset
120 cr.set(lines.Merge())
976
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
121 }
c397fdd8c327 Generate the contour lines of the sounding result during the import, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
122 }