Mercurial > gemma
annotate pkg/octree/simplify.go @ 4423:f42c6efd76fe
Waterlevel: only generate csvFilename when dates are present
author | Thomas Junk <thomas.junk@intevation.de> |
---|---|
date | Wed, 18 Sep 2019 15:37:42 +0200 |
parents | 33fa76994b8a |
children |
rev | line source |
---|---|
3772
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
1 // This is Free Software under GNU Affero General Public License v >= 3.0 |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
2 // without warranty, see README.md and license for details. |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
3 // |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
4 // SPDX-License-Identifier: AGPL-3.0-or-later |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
5 // License-Filename: LICENSES/AGPL-3.0.txt |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
6 // |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
7 // Copyright (C) 2019 by via donau |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
8 // – Österreichische Wasserstraßen-Gesellschaft mbH |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
9 // Software engineering by Intevation GmbH |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
10 // |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
11 // Author(s): |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
12 // * Sascha L. Teichmann <sascha.teichmann@intevation.de> |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
13 |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
14 package octree |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
15 |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
16 import ( |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
17 "math" |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
18 ) |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
19 |
3775
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
20 func handleTriangle( |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
21 t *Triangle, |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
22 maxDist, tolerance float64, |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
23 maxIdx int, |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
24 points MultiPointZ, |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
25 result *MultiPointZ, |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
26 ) bool { |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
27 if maxDist <= tolerance { |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
28 return false |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
29 } |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
30 |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
31 if len(points) == 1 { |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
32 *result = append(*result, points[0]) |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
33 return true |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
34 } |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
35 |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
36 var ( |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
37 tris [3]Triangle |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
38 planes [3]Plane3D |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
39 maxDists [3]float64 |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
40 maxIdxs [3]int |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
41 parts [3]MultiPointZ |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
42 ) |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
43 |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
44 top := points[maxIdx] |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
45 for i := 0; i < 3; i++ { |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
46 tris[i] = Triangle{t[i], t[(i+1)%3], top} |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
47 planes[i] = tris[i].Plane3D() |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
48 } |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
49 |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
50 nextPoint: |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
51 for i, v := range points { |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
52 if i == maxIdx { |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
53 continue |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
54 } |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
55 |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
56 for j := range tris { |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
57 if tris[j].Contains(v.X, v.Y) { |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
58 if dist := math.Abs(planes[j].Eval(v)); dist > maxDists[j] { |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
59 maxDists[j] = dist |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
60 maxIdxs[j] = len(parts[j]) |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
61 } |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
62 parts[j] = append(parts[j], v) |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
63 continue nextPoint |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
64 } |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
65 } |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
66 } |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
67 |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
68 var found bool |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
69 for i, part := range parts { |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
70 if len(part) > 0 && handleTriangle( |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
71 &tris[i], |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
72 maxDists[i], tolerance, |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
73 maxIdxs[i], |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
74 part, |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
75 result, |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
76 ) { |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
77 found = true |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
78 } |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
79 } |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
80 |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
81 if found { |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
82 *result = append(*result, top) |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
83 } |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
84 |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
85 return found |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
86 } |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
87 |
3772
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
88 func (points MultiPointZ) Simplify(tolerance float64) MultiPointZ { |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
89 |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
90 if len(points) < 2 { |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
91 return points |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
92 } |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
93 |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
94 if tolerance < 0 { |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
95 tolerance = -tolerance |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
96 } |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
97 |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
98 min := Vertex{X: math.MaxFloat64, Y: math.MaxFloat64, Z: math.MaxFloat64} |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
99 max := Vertex{X: -math.MaxFloat64, Y: -math.MaxFloat64, Z: -math.MaxFloat64} |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
100 |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
101 var maxIdx int |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
102 |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
103 for i, v := range points { |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
104 min.Minimize(v) |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
105 |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
106 if v.X < min.X { |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
107 min.X = v.X |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
108 } |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
109 if v.X > max.X { |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
110 max.X = v.X |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
111 } |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
112 if v.Y < min.Y { |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
113 min.Y = v.Y |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
114 } |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
115 if v.Y > max.Y { |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
116 max.Y = v.Y |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
117 } |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
118 if v.Z < min.Z { |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
119 min.Z = v.Z |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
120 } |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
121 if v.Z > max.Z { |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
122 max.Z = v.Z |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
123 maxIdx = i |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
124 } |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
125 |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
126 max.Maximize(v) |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
127 } |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
128 |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
129 /* |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
130 log.Printf("(%.5f, %.5f, %.5f) - (%.5f, %.5f, %.5f)\n", |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
131 min.X, min.Y, min.Z, |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
132 max.X, max.Y, max.Z) |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
133 */ |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
134 |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
135 below := min.Z - 3*tolerance |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
136 xMin := min.X - tolerance |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
137 xMax := max.X + tolerance |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
138 yMin := min.Y - tolerance |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
139 yMax := max.Y + tolerance |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
140 |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
141 corners := []Vertex{ |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
142 {xMin, yMin, below}, |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
143 {xMax, yMin, below}, |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
144 {xMax, yMax, below}, |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
145 {xMin, yMax, below}, |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
146 } |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
147 |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
148 top := points[maxIdx] |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
149 |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
150 tris := make([]Triangle, len(corners)) |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
151 planes := make([]Plane3D, len(corners)) |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
152 |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
153 for i, v1 := range corners { |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
154 v2 := corners[(i+1)%len(corners)] |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
155 tris[i] = Triangle{v1, v2, top} |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
156 planes[i] = tris[i].Plane3D() |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
157 } |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
158 |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
159 parts := make([][]Vertex, len(tris)) |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
160 |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
161 maxDists := make([]float64, len(planes)) |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
162 maxIdxs := make([]int, len(planes)) |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
163 |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
164 nextPoint: |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
165 for i, v := range points { |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
166 if i == maxIdx { |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
167 continue |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
168 } |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
169 |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
170 for j := range tris { |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
171 if tris[j].Contains(v.X, v.Y) { |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
172 if dist := math.Abs(planes[j].Eval(v)); dist > maxDists[j] { |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
173 maxDists[j] = dist |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
174 maxIdxs[j] = len(parts[j]) |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
175 } |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
176 parts[j] = append(parts[j], v) |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
177 continue nextPoint |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
178 } |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
179 } |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
180 } |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
181 |
3775
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
182 result := make(MultiPointZ, 0, len(points)) |
3772
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
183 |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
184 var found bool |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
185 for i, part := range parts { |
3775
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
186 if len(part) > 0 && handleTriangle( |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
187 &tris[i], |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
188 maxDists[i], tolerance, |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
189 maxIdxs[i], |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
190 part, |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
191 &result, |
33fa76994b8a
Fixed simplification a bit.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3772
diff
changeset
|
192 ) { |
3772
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
193 found = true |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
194 } |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
195 } |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
196 |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
197 if found { |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
198 result = append(result, top) |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
199 } |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
200 |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
201 return result |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
202 } |