Mercurial > gemma
annotate pkg/octree/simplify.go @ 3790:60977e18e227 yworks-svg2pdf
client: improve pdf generation getTextHeight()
* Remove second appearance of getTextHeight() in PdfTool.vue.
* Rectify getTextHeight() by adding a comment about what it
does and correcting the calulcation to output millimeter.
author | Bernhard Reiter <bernhard@intevation.de> |
---|---|
date | Wed, 03 Jul 2019 16:53:06 +0200 |
parents | 545304d3ff93 |
children | 33fa76994b8a |
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 |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
20 func (points MultiPointZ) Simplify(tolerance float64) MultiPointZ { |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
21 |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
22 if len(points) < 2 { |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
23 return points |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
24 } |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
25 |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
26 if tolerance < 0 { |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
27 tolerance = -tolerance |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
28 } |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
29 |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
30 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
|
31 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
|
32 |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
33 var maxIdx int |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
34 |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
35 for i, v := range points { |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
36 min.Minimize(v) |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
37 |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
38 if v.X < min.X { |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
39 min.X = v.X |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
40 } |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
41 if v.X > max.X { |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
42 max.X = v.X |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
43 } |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
44 if v.Y < min.Y { |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
45 min.Y = v.Y |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
46 } |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
47 if v.Y > max.Y { |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
48 max.Y = v.Y |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
49 } |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
50 if v.Z < min.Z { |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
51 min.Z = v.Z |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
52 } |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
53 if v.Z > max.Z { |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
54 max.Z = v.Z |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
55 maxIdx = i |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
56 } |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
57 |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
58 max.Maximize(v) |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
59 } |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
60 |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
61 /* |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
62 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
|
63 min.X, min.Y, min.Z, |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
64 max.X, max.Y, max.Z) |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
65 */ |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
66 |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
67 below := min.Z - 3*tolerance |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
68 xMin := min.X - tolerance |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
69 xMax := max.X + tolerance |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
70 yMin := min.Y - tolerance |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
71 yMax := max.Y + tolerance |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
72 |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
73 corners := []Vertex{ |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
74 {xMin, yMin, below}, |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
75 {xMax, yMin, below}, |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
76 {xMax, yMax, below}, |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
77 {xMin, yMax, below}, |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
78 } |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
79 |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
80 top := points[maxIdx] |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
81 |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
82 tris := make([]Triangle, len(corners)) |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
83 planes := make([]Plane3D, len(corners)) |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
84 |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
85 for i, v1 := range corners { |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
86 v2 := corners[(i+1)%len(corners)] |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
87 tris[i] = Triangle{v1, v2, top} |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
88 planes[i] = tris[i].Plane3D() |
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 |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
91 parts := make([][]Vertex, len(tris)) |
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 maxDists := make([]float64, len(planes)) |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
94 maxIdxs := make([]int, len(planes)) |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
95 |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
96 nextPoint: |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
97 for i, v := range points { |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
98 if i == maxIdx { |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
99 continue |
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 |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
102 for j := range tris { |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
103 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
|
104 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
|
105 maxDists[j] = dist |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
106 maxIdxs[j] = len(parts[j]) |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
107 } |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
108 parts[j] = append(parts[j], v) |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
109 continue nextPoint |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
110 } |
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 } |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
113 |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
114 result := make([]Vertex, 0, len(points)) |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
115 |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
116 var handleTriangle func(*Triangle, float64, int, []Vertex) bool |
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 handleTriangle = func( |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
119 t *Triangle, |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
120 maxDist float64, maxIdx int, |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
121 points []Vertex, |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
122 ) bool { |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
123 if maxDist <= tolerance { |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
124 return false |
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 |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
127 if len(points) == 1 { |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
128 result = append(result, points[0]) |
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 |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
131 var ( |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
132 tris [3]Triangle |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
133 planes [3]Plane3D |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
134 maxDists [3]float64 |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
135 maxIdxs [3]int |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
136 parts [3][]Vertex |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
137 ) |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
138 |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
139 top := points[maxIdx] |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
140 for i := 0; i < 3; i++ { |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
141 tris[i] = Triangle{t[i], t[(i+1)%3], top} |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
142 planes[i] = tris[i].Plane3D() |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
143 } |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
144 |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
145 nextPoint: |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
146 for i, v := range points { |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
147 if i == maxIdx { |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
148 continue |
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 |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
151 for j := range tris { |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
152 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
|
153 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
|
154 maxDists[j] = dist |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
155 maxIdxs[j] = len(parts[j]) |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
156 } |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
157 parts[j] = append(parts[j], v) |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
158 continue nextPoint |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
159 } |
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 } |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
162 |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
163 var found bool |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
164 for i, part := range parts { |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
165 if len(part) > 0 && handleTriangle(&tris[i], maxDists[i], maxIdxs[i], part) { |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
166 found = true |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
167 } |
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 if found { |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
171 result = append(result, top) |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
172 } |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
173 |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
174 return found |
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 |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
177 var found bool |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
178 for i, part := range parts { |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
179 if len(part) > 0 && handleTriangle(&tris[i], maxDists[i], maxIdxs[i], part) { |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
180 found = true |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
181 } |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
182 } |
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 if found { |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
185 result = append(result, top) |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
186 } |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
187 |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
188 return result |
545304d3ff93
Moved simplification algorithm to octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
189 } |