Mercurial > gemma
annotate cmd/isoareas/main.go @ 4546:a3f1d92b8597 iso-areas
Simplified code.
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Fri, 27 Sep 2019 17:26:43 +0200 |
parents | e7970d84cb4f |
children | 6247f5a42226 |
rev | line source |
---|---|
4531
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
1 // This is Free Software under GNU Affero General Public License v >= 3.0 |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
2 // without warranty, see README.md and license for details. |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
3 // |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
4 // SPDX-License-Identifier: AGPL-3.0-or-later |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
5 // License-Filename: LICENSES/AGPL-3.0.txt |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
6 // |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
7 // Copyright (C) 2019 by via donau |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
8 // – Österreichische Wasserstraßen-Gesellschaft mbH |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
9 // Software engineering by Intevation GmbH |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
10 // |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
11 // Author(s): |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
12 // * Sascha L. Teichmann <sascha.teichmann@intevation.de> |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
13 |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
14 package main |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
15 |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
16 import ( |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
17 "bufio" |
4542
56f4e8cbfab7
Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4541
diff
changeset
|
18 "container/list" |
4541
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
19 "fmt" |
4531
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
20 "io" |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
21 "log" |
4532
769f723c2581
Cut triangles against class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4531
diff
changeset
|
22 "math" |
4540
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
23 "math/bits" |
4541
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
24 "math/rand" |
4531
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
25 "os" |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
26 "strconv" |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
27 "strings" |
4532
769f723c2581
Cut triangles against class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4531
diff
changeset
|
28 "time" |
4531
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
29 |
4541
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
30 svg "github.com/ajstarks/svgo" |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
31 |
4531
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
32 "gemma.intevation.de/gemma/pkg/octree" |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
33 ) |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
34 |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
35 const classBreaks = `1:#ff00dd,1.5,1.7,1.9,2.1,2.3,2.5:#f25f20,2.7,2.9,3.1:#f7e40e,3.3,3.5,4:#8ad51a,4.5,5,5.5,6,6.5,7:#1414ff` |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
36 |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
37 func loadXYZ(r io.Reader) (octree.MultiPointZ, error) { |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
38 |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
39 scanner := bufio.NewScanner(r) |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
40 |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
41 points := make(octree.MultiPointZ, 0, 2000000) |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
42 |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
43 var x, y, z float64 |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
44 var err error |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
45 |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
46 for scanner.Scan() { |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
47 line := strings.TrimSpace(scanner.Text()) |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
48 if len(line) == 0 || strings.HasPrefix(line, "#") { |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
49 continue |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
50 } |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
51 parts := strings.SplitN(line, " ", 3) |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
52 if len(parts) != 3 { |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
53 continue |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
54 } |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
55 |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
56 if x, err = strconv.ParseFloat(parts[0], 64); err != nil { |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
57 return nil, err |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
58 } |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
59 if y, err = strconv.ParseFloat(parts[1], 64); err != nil { |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
60 return nil, err |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
61 } |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
62 if z, err = strconv.ParseFloat(parts[2], 64); err != nil { |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
63 return nil, err |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
64 } |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
65 points = append(points, octree.Vertex{X: x, Y: y, Z: z}) |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
66 } |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
67 |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
68 return points, nil |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
69 } |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
70 |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
71 func minMax(points []octree.Vertex) (octree.Vertex, octree.Vertex) { |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
72 if len(points) == 0 { |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
73 return octree.Vertex{}, octree.Vertex{} |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
74 } |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
75 |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
76 min, max := points[0], points[0] |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
77 |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
78 for _, v := range points { |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
79 min.Minimize(v) |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
80 max.Maximize(v) |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
81 } |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
82 |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
83 return min, max |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
84 } |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
85 |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
86 func check(err error) { |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
87 if err != nil { |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
88 log.Fatalf("error: %v\n", err) |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
89 } |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
90 } |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
91 |
4544
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
92 type indexedArc struct { |
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
93 arc int32 |
4543
2a707732331f
Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4542
diff
changeset
|
94 index int32 |
2a707732331f
Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4542
diff
changeset
|
95 } |
4532
769f723c2581
Cut triangles against class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4531
diff
changeset
|
96 |
4545
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
97 func glue(a, b octree.LineStringZ) octree.LineStringZ { |
4544
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
98 |
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
99 a1, a2 := a[0], a[len(a)-1] |
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
100 b1, b2 := b[0], b[len(b)-1] |
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
101 |
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
102 if a1.EpsEquals(b2) { |
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
103 c := make(octree.LineStringZ, len(a)-1+len(b)) |
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
104 copy(c, b) |
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
105 copy(c[len(b):], a[1:]) |
4545
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
106 return c |
4544
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
107 } |
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
108 |
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
109 if a2.EpsEquals(b1) { |
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
110 c := make(octree.LineStringZ, len(a)-1+len(b)) |
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
111 copy(c, a) |
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
112 copy(c[len(a):], b[1:]) |
4545
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
113 return c |
4544
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
114 } |
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
115 |
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
116 if a1.EpsEquals(b1) { |
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
117 c := make(octree.LineStringZ, len(a)-1+len(b)) |
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
118 copy(c, b) |
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
119 c[:len(b)].Reverse() |
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
120 copy(c[len(b):], a[1:]) |
4545
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
121 return c |
4544
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
122 } |
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
123 |
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
124 if a2.EpsEquals(b2) { |
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
125 c := make(octree.LineStringZ, len(a)-1+len(b)) |
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
126 copy(c, a) |
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
127 copy(c[len(a):], b[:len(b)-1]) |
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
128 c[len(a):].Reverse() |
4545
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
129 return c |
4544
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
130 } |
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
131 |
4545
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
132 return nil |
4544
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
133 } |
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
134 |
4545
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
135 func connectArcs(tri *octree.Triangulation, cuts []indexedArc, arcs *[]octree.LineStringZ) { |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
136 |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
137 origLen := int32(len(*arcs)) |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
138 |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
139 for i := range cuts { |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
140 if cuts[i].arc >= origLen { |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
141 // already has a connected arc assigned. |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
142 continue |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
143 } |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
144 |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
145 line := (*arcs)[cuts[i].arc] |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
146 |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
147 var modified []int |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
148 visited := map[int32]struct{}{} |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
149 |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
150 var recursive func(int32) |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
151 recursive = func(idx int32) { |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
152 visited[idx] = struct{}{} |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
153 |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
154 ns := neighbors(tri, idx) |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
155 for _, n := range ns { |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
156 n /= 3 |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
157 if _, already := visited[n]; already { |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
158 continue |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
159 } |
4544
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
160 |
4545
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
161 arcIdx := findArc(n, cuts) |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
162 if arcIdx == -1 { |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
163 continue |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
164 } |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
165 arc := cuts[arcIdx].arc |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
166 if arc >= origLen { |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
167 // already a new arc. |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
168 continue |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
169 } |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
170 oline := (*arcs)[arc] |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
171 |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
172 nline := glue(line, oline) |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
173 if nline == nil { |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
174 // not joinable |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
175 continue |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
176 } |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
177 line = nline |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
178 modified = append(modified, arcIdx) |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
179 recursive(cuts[arcIdx].index) |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
180 } |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
181 } |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
182 recursive(cuts[i].index) |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
183 if len(modified) > 0 { |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
184 // alloc a new line an fix the references. |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
185 nidx := int32(len(*arcs)) |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
186 *arcs = append(*arcs, line) |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
187 cuts[i].arc = nidx |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
188 for _, j := range modified { |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
189 cuts[j].arc = nidx |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
190 } |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
191 } |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
192 |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
193 } |
4544
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
194 } |
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
195 |
4543
2a707732331f
Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4542
diff
changeset
|
196 func intersectTriangles(tri *octree.Triangulation, heights []float64) [][]octree.LineStringZ { |
4532
769f723c2581
Cut triangles against class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4531
diff
changeset
|
197 |
4544
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
198 cuts := make([][]indexedArc, len(heights)) |
4532
769f723c2581
Cut triangles against class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4531
diff
changeset
|
199 |
4533
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
200 classes := make([][]int32, len(heights)+1) |
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
201 |
4544
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
202 var arcs []octree.LineStringZ |
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
203 |
4533
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
204 all: |
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
205 for i := int32(0); i < int32(len(tri.Triangles)); i += 3 { |
4532
769f723c2581
Cut triangles against class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4531
diff
changeset
|
206 ti := tri.Triangles[i : i+3] |
4540
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
207 v0 := tri.Points[ti[0]] |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
208 v1 := tri.Points[ti[1]] |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
209 v2 := tri.Points[ti[2]] |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
210 min := math.Min(v0.Z, math.Min(v1.Z, v2.Z)) |
4533
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
211 |
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
212 if min > heights[len(heights)-1] { |
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
213 classes[len(classes)-1] = append(classes[len(classes)-1], i/3) |
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
214 continue |
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
215 } |
4540
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
216 max := math.Max(v0.Z, math.Max(v1.Z, v2.Z)) |
4532
769f723c2581
Cut triangles against class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4531
diff
changeset
|
217 |
769f723c2581
Cut triangles against class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4531
diff
changeset
|
218 for j, h := range heights { |
4533
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
219 |
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
220 var l float64 |
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
221 if j > 0 { |
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
222 l = heights[j-1] |
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
223 } else { |
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
224 l = -math.MaxFloat64 |
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
225 } |
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
226 |
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
227 if l < min && max < h { |
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
228 classes[j] = append(classes[j], i/3) |
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
229 continue all |
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
230 } |
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
231 if min > h || max < h { |
4532
769f723c2581
Cut triangles against class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4531
diff
changeset
|
232 continue |
769f723c2581
Cut triangles against class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4531
diff
changeset
|
233 } |
4540
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
234 t := octree.Triangle{v0, v1, v2} |
4533
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
235 cut := t.IntersectHorizontal(h) |
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
236 if len(cut) >= 2 { |
4544
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
237 arc := int32(len(arcs)) |
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
238 arcs = append(arcs, cut) |
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
239 cuts[j] = append(cuts[j], indexedArc{arc, i / 3}) |
4532
769f723c2581
Cut triangles against class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4531
diff
changeset
|
240 } |
769f723c2581
Cut triangles against class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4531
diff
changeset
|
241 } |
769f723c2581
Cut triangles against class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4531
diff
changeset
|
242 } |
769f723c2581
Cut triangles against class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4531
diff
changeset
|
243 |
4544
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
244 // connect the arcs in a cut list to longer arcs. |
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
245 |
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
246 for _, c := range cuts { |
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
247 connectArcs(tri, c, &arcs) |
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
248 } |
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
249 |
4540
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
250 result := make([][]octree.LineStringZ, len(classes)) |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
251 |
4533
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
252 log.Println("inside classes:") |
4535
508075a5694e
Only keep the indices of the triangles of the border of the iso patches.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4534
diff
changeset
|
253 for i, c := range classes { |
4540
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
254 |
4542
56f4e8cbfab7
Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4541
diff
changeset
|
255 pb := polygonBuilder{open: list.New()} |
4535
508075a5694e
Only keep the indices of the triangles of the border of the iso patches.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4534
diff
changeset
|
256 |
4545
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
257 usedArcs := map[int32]struct{}{} |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
258 var dupes int |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
259 |
4540
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
260 var isolated, inside int |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
261 allInClass: |
4534
b7d31a449dd2
Find out how many inner triangles can be skipped because they are totally inside a class polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4533
diff
changeset
|
262 for _, idx := range c { |
4540
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
263 ns := neighbors(tri, idx) |
4542
56f4e8cbfab7
Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4541
diff
changeset
|
264 mask := where(ns, c) |
56f4e8cbfab7
Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4541
diff
changeset
|
265 switch bits.OnesCount8(mask) { |
4540
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
266 case 0: |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
267 // Totally insides do not contribute to the geometries. |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
268 inside++ |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
269 continue allInClass |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
270 case 3: |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
271 // Isolated are areas w/o connections to the rest. |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
272 isolated++ |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
273 ti := tri.Triangles[idx*3 : idx*3+3] |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
274 pb.addTriangle( |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
275 tri.Points[ti[0]], |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
276 tri.Points[ti[1]], |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
277 tri.Points[ti[2]]) |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
278 continue allInClass |
4542
56f4e8cbfab7
Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4541
diff
changeset
|
279 default: |
56f4e8cbfab7
Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4541
diff
changeset
|
280 ti := tri.Triangles[idx*3 : idx*3+3] |
56f4e8cbfab7
Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4541
diff
changeset
|
281 for j := 0; j < 3; j++ { |
56f4e8cbfab7
Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4541
diff
changeset
|
282 if mask&(1<<j) == 0 { |
56f4e8cbfab7
Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4541
diff
changeset
|
283 |
56f4e8cbfab7
Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4541
diff
changeset
|
284 // TODO: Look into cuts to see |
56f4e8cbfab7
Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4541
diff
changeset
|
285 // if there are real intersections |
4543
2a707732331f
Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4542
diff
changeset
|
286 |
2a707732331f
Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4542
diff
changeset
|
287 var curr octree.LineStringZ |
4542
56f4e8cbfab7
Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4541
diff
changeset
|
288 |
4543
2a707732331f
Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4542
diff
changeset
|
289 for l := i - 1; l <= i; l++ { |
2a707732331f
Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4542
diff
changeset
|
290 if l < 0 || l >= len(cuts) { |
2a707732331f
Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4542
diff
changeset
|
291 continue |
2a707732331f
Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4542
diff
changeset
|
292 } |
4545
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
293 arcIdx := findArc(ns[j], cuts[l]) |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
294 if arcIdx == -1 { |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
295 continue |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
296 } |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
297 aIdx := cuts[l][arcIdx].arc |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
298 if _, already := usedArcs[aIdx]; already { |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
299 dupes++ |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
300 continue |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
301 } |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
302 usedArcs[aIdx] = struct{}{} |
4544
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
303 |
4545
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
304 curr = arcs[aIdx] |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
305 break |
4543
2a707732331f
Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4542
diff
changeset
|
306 } |
2a707732331f
Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4542
diff
changeset
|
307 |
2a707732331f
Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4542
diff
changeset
|
308 if curr == nil { |
2a707732331f
Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4542
diff
changeset
|
309 k := (j + 1) % 3 |
2a707732331f
Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4542
diff
changeset
|
310 front := tri.Points[ti[j]] |
2a707732331f
Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4542
diff
changeset
|
311 back := tri.Points[ti[k]] |
2a707732331f
Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4542
diff
changeset
|
312 curr = octree.LineStringZ{front, back} |
2a707732331f
Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4542
diff
changeset
|
313 } |
4542
56f4e8cbfab7
Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4541
diff
changeset
|
314 |
56f4e8cbfab7
Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4541
diff
changeset
|
315 segment: |
56f4e8cbfab7
Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4541
diff
changeset
|
316 for e := pb.open.Front(); e != nil; e = e.Next() { |
56f4e8cbfab7
Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4541
diff
changeset
|
317 line := e.Value.(octree.LineStringZ) |
4546
a3f1d92b8597
Simplified code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4545
diff
changeset
|
318 if nline := glue(curr, line); nline != nil { |
a3f1d92b8597
Simplified code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4545
diff
changeset
|
319 curr = nline |
4542
56f4e8cbfab7
Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4541
diff
changeset
|
320 pb.open.Remove(e) |
56f4e8cbfab7
Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4541
diff
changeset
|
321 goto segment |
56f4e8cbfab7
Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4541
diff
changeset
|
322 } |
56f4e8cbfab7
Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4541
diff
changeset
|
323 } // all open |
56f4e8cbfab7
Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4541
diff
changeset
|
324 |
56f4e8cbfab7
Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4541
diff
changeset
|
325 // check if closed |
56f4e8cbfab7
Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4541
diff
changeset
|
326 if curr[0].EpsEquals(curr[len(curr)-1]) { |
56f4e8cbfab7
Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4541
diff
changeset
|
327 if !curr.CCW() { |
56f4e8cbfab7
Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4541
diff
changeset
|
328 curr.Reverse() |
56f4e8cbfab7
Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4541
diff
changeset
|
329 } |
56f4e8cbfab7
Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4541
diff
changeset
|
330 pb.polygons = append(pb.polygons, curr) |
56f4e8cbfab7
Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4541
diff
changeset
|
331 } else { |
56f4e8cbfab7
Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4541
diff
changeset
|
332 pb.open.PushFront(curr) |
56f4e8cbfab7
Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4541
diff
changeset
|
333 } |
56f4e8cbfab7
Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4541
diff
changeset
|
334 } // for all border parts |
56f4e8cbfab7
Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4541
diff
changeset
|
335 } |
4534
b7d31a449dd2
Find out how many inner triangles can be skipped because they are totally inside a class polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4533
diff
changeset
|
336 } |
b7d31a449dd2
Find out how many inner triangles can be skipped because they are totally inside a class polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4533
diff
changeset
|
337 } |
4540
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
338 |
4545
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
339 log.Printf("\t%d: inside: %d / isolated: %d open: %d closed: %d dupes: %d\n", |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
340 i, inside, isolated, pb.open.Len(), len(pb.polygons), dupes) |
4540
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
341 |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
342 result[i] = pb.polygons |
4533
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
343 } |
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
344 |
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
345 log.Println("cuts:") |
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
346 for i, c := range cuts { |
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
347 log.Printf("\t%.3f: %d\n", heights[i], len(c)) |
4532
769f723c2581
Cut triangles against class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4531
diff
changeset
|
348 } |
769f723c2581
Cut triangles against class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4531
diff
changeset
|
349 |
4540
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
350 return result |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
351 |
4532
769f723c2581
Cut triangles against class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4531
diff
changeset
|
352 // TODO: sew segments together. |
769f723c2581
Cut triangles against class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4531
diff
changeset
|
353 |
769f723c2581
Cut triangles against class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4531
diff
changeset
|
354 } |
769f723c2581
Cut triangles against class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4531
diff
changeset
|
355 |
4540
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
356 type polygonBuilder struct { |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
357 polygons []octree.LineStringZ |
4542
56f4e8cbfab7
Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4541
diff
changeset
|
358 |
56f4e8cbfab7
Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4541
diff
changeset
|
359 open *list.List |
4540
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
360 } |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
361 |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
362 func (pb *polygonBuilder) addTriangle(v0, v1, v2 octree.Vertex) { |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
363 polygon := octree.LineStringZ{v0, v1, v2, v0} |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
364 pb.polygons = append(pb.polygons, polygon) |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
365 } |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
366 |
4534
b7d31a449dd2
Find out how many inner triangles can be skipped because they are totally inside a class polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4533
diff
changeset
|
367 func neighbors(t *octree.Triangulation, idx int32) []int32 { |
b7d31a449dd2
Find out how many inner triangles can be skipped because they are totally inside a class polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4533
diff
changeset
|
368 idx *= 3 |
b7d31a449dd2
Find out how many inner triangles can be skipped because they are totally inside a class polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4533
diff
changeset
|
369 return t.Halfedges[idx : idx+3] |
b7d31a449dd2
Find out how many inner triangles can be skipped because they are totally inside a class polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4533
diff
changeset
|
370 } |
b7d31a449dd2
Find out how many inner triangles can be skipped because they are totally inside a class polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4533
diff
changeset
|
371 |
4545
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
372 func findArc(needle int32, haystack []indexedArc) int { |
4543
2a707732331f
Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4542
diff
changeset
|
373 lo, hi := 0, len(haystack)-1 |
2a707732331f
Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4542
diff
changeset
|
374 for lo <= hi { |
2a707732331f
Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4542
diff
changeset
|
375 mid := (hi-lo)/2 + lo |
2a707732331f
Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4542
diff
changeset
|
376 switch v := haystack[mid].index; { |
2a707732331f
Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4542
diff
changeset
|
377 case v < needle: |
2a707732331f
Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4542
diff
changeset
|
378 lo = mid + 1 |
2a707732331f
Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4542
diff
changeset
|
379 case v > needle: |
2a707732331f
Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4542
diff
changeset
|
380 hi = mid - 1 |
2a707732331f
Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4542
diff
changeset
|
381 default: |
4545
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
382 return mid |
4543
2a707732331f
Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4542
diff
changeset
|
383 } |
2a707732331f
Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4542
diff
changeset
|
384 } |
4544
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
385 return -1 |
4543
2a707732331f
Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4542
diff
changeset
|
386 } |
2a707732331f
Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4542
diff
changeset
|
387 |
4538
46c9a731a686
Use custom binary search in triangle indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4536
diff
changeset
|
388 func contains(needle int32, haystack []int32) bool { |
46c9a731a686
Use custom binary search in triangle indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4536
diff
changeset
|
389 lo, hi := 0, len(haystack)-1 |
46c9a731a686
Use custom binary search in triangle indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4536
diff
changeset
|
390 for lo <= hi { |
46c9a731a686
Use custom binary search in triangle indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4536
diff
changeset
|
391 mid := (hi-lo)/2 + lo |
46c9a731a686
Use custom binary search in triangle indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4536
diff
changeset
|
392 switch v := haystack[mid]; { |
46c9a731a686
Use custom binary search in triangle indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4536
diff
changeset
|
393 case v < needle: |
46c9a731a686
Use custom binary search in triangle indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4536
diff
changeset
|
394 lo = mid + 1 |
46c9a731a686
Use custom binary search in triangle indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4536
diff
changeset
|
395 case v > needle: |
46c9a731a686
Use custom binary search in triangle indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4536
diff
changeset
|
396 hi = mid - 1 |
46c9a731a686
Use custom binary search in triangle indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4536
diff
changeset
|
397 default: |
46c9a731a686
Use custom binary search in triangle indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4536
diff
changeset
|
398 return true |
46c9a731a686
Use custom binary search in triangle indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4536
diff
changeset
|
399 } |
46c9a731a686
Use custom binary search in triangle indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4536
diff
changeset
|
400 } |
46c9a731a686
Use custom binary search in triangle indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4536
diff
changeset
|
401 return false |
46c9a731a686
Use custom binary search in triangle indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4536
diff
changeset
|
402 } |
46c9a731a686
Use custom binary search in triangle indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4536
diff
changeset
|
403 |
4540
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
404 func where(neighbors, indices []int32) byte { |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
405 var mask byte |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
406 for i, n := range neighbors { |
4539
99928231b679
Code simplification.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4538
diff
changeset
|
407 if n < 0 || !contains(n/3, indices) { |
4540
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
408 mask |= 1 << i |
4534
b7d31a449dd2
Find out how many inner triangles can be skipped because they are totally inside a class polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4533
diff
changeset
|
409 } |
b7d31a449dd2
Find out how many inner triangles can be skipped because they are totally inside a class polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4533
diff
changeset
|
410 } |
4540
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
411 return mask |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
412 } |
4534
b7d31a449dd2
Find out how many inner triangles can be skipped because they are totally inside a class polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4533
diff
changeset
|
413 |
4541
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
414 func linear(x1, y1, x2, y2 float64) func(float64) float64 { |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
415 // f(x1) = y1 |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
416 // f(x2) = y2 |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
417 // y1 = x1*a + b <=> b = y1 - x1*a |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
418 // y2 = x2*a + b |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
419 |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
420 // y1 - y2 = a*(x1 - x2) |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
421 // a = (y1-y2)/(x1 - x2) for x1 != x2 |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
422 |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
423 if x1 == x2 { |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
424 return func(float64) float64 { |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
425 return 0.5 * (y1 + y2) |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
426 } |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
427 } |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
428 a := (y1 - y2) / (x1 - x2) |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
429 b := y1 - x1*a |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
430 return func(x float64) float64 { |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
431 return x*a + b |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
432 } |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
433 } |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
434 |
4540
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
435 func dumpPolygonsSVG( |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
436 w io.Writer, |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
437 min, max octree.Vertex, |
4541
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
438 classPolygons [][]octree.LineStringZ, |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
439 ) (err error) { |
4540
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
440 |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
441 ratio := (max.X - min.X) / (max.Y - min.Y) |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
442 |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
443 log.Printf("ratio: %.2f\n", ratio) |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
444 |
4541
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
445 const width = 1000 |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
446 height := int(math.Ceil(width * ratio)) |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
447 |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
448 px := linear(min.X, 0, max.X, width) |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
449 py := linear(min.Y, float64(height), max.Y, 0) |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
450 |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
451 out := bufio.NewWriter(w) |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
452 defer func() { err = out.Flush() }() |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
453 |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
454 canvas := svg.New(out) |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
455 canvas.Start(width, height) |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
456 |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
457 rnd := rand.New(rand.NewSource(42)) |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
458 |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
459 for _, polygons := range classPolygons { |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
460 |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
461 r := byte(rnd.Intn(256)) |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
462 g := byte(rnd.Intn(256)) |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
463 b := byte(rnd.Intn(256)) |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
464 style := fmt.Sprintf("fill:#%02x%02x%02x", r, g, b) |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
465 |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
466 for _, polygon := range polygons { |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
467 |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
468 x := make([]int, len(polygon)) |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
469 y := make([]int, len(polygon)) |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
470 for i, p := range polygon { |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
471 x[i] = int(math.Round(px(p.X))) |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
472 y[i] = int(math.Round(py(p.Y))) |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
473 } |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
474 |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
475 canvas.Polygon(x, y, style) |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
476 } |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
477 |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
478 } |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
479 |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
480 canvas.End() |
4540
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
481 |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
482 return nil |
4534
b7d31a449dd2
Find out how many inner triangles can be skipped because they are totally inside a class polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4533
diff
changeset
|
483 } |
b7d31a449dd2
Find out how many inner triangles can be skipped because they are totally inside a class polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4533
diff
changeset
|
484 |
4531
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
485 func main() { |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
486 |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
487 heights, err := octree.ParseClassBreaks(classBreaks) |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
488 check(err) |
4533
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
489 log.Printf("num classes: %d\n", len(heights)) |
4531
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
490 |
4533
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
491 start := time.Now() |
4531
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
492 xyz, err := loadXYZ(os.Stdin) |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
493 check(err) |
4533
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
494 log.Printf("loading took %v\n", time.Since(start)) |
4531
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
495 |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
496 log.Printf("num vertices: %d\n", len(xyz)) |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
497 |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
498 min, max := minMax(xyz) |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
499 |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
500 log.Printf("(%.2f, %.2f, %.2f) - (%.2f, %.2f, %.2f)\n", |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
501 min.X, min.Y, min.Z, |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
502 max.X, max.Y, max.Z) |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
503 |
4533
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
504 start = time.Now() |
4531
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
505 tri, err := octree.Triangulate(xyz) |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
506 check(err) |
4536
3130c005abef
Measure time of triangulation correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4535
diff
changeset
|
507 log.Printf("triangulation took %v\n", time.Since(start)) |
4531
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
508 |
4533
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
509 log.Printf("number of triangles: %d\n", len(tri.Triangles)/3) |
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
510 |
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
511 start = time.Now() |
4540
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
512 polygons := intersectTriangles(tri, heights) |
4532
769f723c2581
Cut triangles against class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4531
diff
changeset
|
513 log.Printf("intersecting triangles took %v.\n", time.Since(start)) |
4540
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
514 |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
515 check(dumpPolygonsSVG(os.Stdout, min, max, polygons)) |
4531
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
516 } |