Mercurial > gemma
annotate cmd/isoareas/main.go @ 4550:aa2d0006e742 iso-areas
Write iso lines between classes to SVG for debugging.
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Mon, 30 Sep 2019 16:34:55 +0200 |
parents | 9c65cef72753 |
children | b5b23b6d76f1 |
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" |
4550
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
26 "runtime" |
4531
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
27 "strconv" |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
28 "strings" |
4550
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
29 "sync" |
4532
769f723c2581
Cut triangles against class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4531
diff
changeset
|
30 "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
|
31 |
4541
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
32 svg "github.com/ajstarks/svgo" |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
33 |
4531
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
34 "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
|
35 ) |
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 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
|
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 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
|
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 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
|
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 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
|
44 |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
45 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
|
46 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
|
47 |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
48 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
|
49 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
|
50 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
|
51 continue |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
52 } |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
53 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
|
54 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
|
55 continue |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
56 } |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
57 |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
58 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
|
59 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
|
60 } |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
61 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
|
62 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
|
63 } |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
64 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
|
65 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
|
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 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
|
68 } |
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 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
|
71 } |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
72 |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
73 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
|
74 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
|
75 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
|
76 } |
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 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
|
79 |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
80 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
|
81 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
|
82 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
|
83 } |
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 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
|
86 } |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
87 |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
88 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
|
89 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
|
90 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
|
91 } |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
92 } |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
93 |
4544
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
94 type indexedArc struct { |
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
95 arc int32 |
4543
2a707732331f
Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4542
diff
changeset
|
96 index int32 |
2a707732331f
Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4542
diff
changeset
|
97 } |
4532
769f723c2581
Cut triangles against class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4531
diff
changeset
|
98 |
4545
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
99 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
|
100 |
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
101 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
|
102 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
|
103 |
4550
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
104 if a1.EpsEquals2D(b2) { |
4544
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
105 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
|
106 copy(c, b) |
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
107 copy(c[len(b):], a[1:]) |
4545
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
108 return c |
4544
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
109 } |
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
110 |
4550
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
111 if a2.EpsEquals2D(b1) { |
4544
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
112 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
|
113 copy(c, a) |
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
114 copy(c[len(a):], b[1:]) |
4545
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
115 return c |
4544
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
116 } |
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
117 |
4550
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
118 if a1.EpsEquals2D(b1) { |
4544
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
119 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
|
120 copy(c, b) |
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
121 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
|
122 copy(c[len(b):], a[1:]) |
4545
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
123 return c |
4544
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
124 } |
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
125 |
4550
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
126 if a2.EpsEquals2D(b2) { |
4544
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
127 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
|
128 copy(c, a) |
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
129 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
|
130 c[len(a):].Reverse() |
4545
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
131 return c |
4544
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
132 } |
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
133 |
4545
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
134 return nil |
4544
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
135 } |
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
136 |
4545
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
137 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
|
138 |
4547
6247f5a42226
Increased resolution.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4546
diff
changeset
|
139 unique := map[int32]struct{}{} |
6247f5a42226
Increased resolution.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4546
diff
changeset
|
140 for i := range cuts { |
6247f5a42226
Increased resolution.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4546
diff
changeset
|
141 unique[cuts[i].arc] = struct{}{} |
6247f5a42226
Increased resolution.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4546
diff
changeset
|
142 } |
6247f5a42226
Increased resolution.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4546
diff
changeset
|
143 before := len(unique) |
6247f5a42226
Increased resolution.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4546
diff
changeset
|
144 |
4545
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
145 origLen := int32(len(*arcs)) |
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 for i := range cuts { |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
148 if cuts[i].arc >= origLen { |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
149 // already has a connected arc assigned. |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
150 continue |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
151 } |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
152 |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
153 line := (*arcs)[cuts[i].arc] |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
154 |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
155 var modified []int |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
156 visited := map[int32]struct{}{} |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
157 |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
158 var recursive func(int32) |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
159 recursive = func(idx int32) { |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
160 visited[idx] = struct{}{} |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
161 |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
162 ns := neighbors(tri, idx) |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
163 for _, n := range ns { |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
164 n /= 3 |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
165 if _, already := visited[n]; already { |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
166 continue |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
167 } |
4544
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
168 |
4545
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
169 arcIdx := findArc(n, cuts) |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
170 if arcIdx == -1 { |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
171 continue |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
172 } |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
173 arc := cuts[arcIdx].arc |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
174 if arc >= origLen { |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
175 // already a new arc. |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
176 continue |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
177 } |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
178 oline := (*arcs)[arc] |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
179 |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
180 nline := glue(line, oline) |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
181 if nline == nil { |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
182 // not joinable |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
183 continue |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
184 } |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
185 line = nline |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
186 modified = append(modified, arcIdx) |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
187 recursive(cuts[arcIdx].index) |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
188 } |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
189 } |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
190 recursive(cuts[i].index) |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
191 if len(modified) > 0 { |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
192 // 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
|
193 nidx := int32(len(*arcs)) |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
194 *arcs = append(*arcs, line) |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
195 cuts[i].arc = nidx |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
196 for _, j := range modified { |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
197 cuts[j].arc = nidx |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
198 } |
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
199 } |
4547
6247f5a42226
Increased resolution.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4546
diff
changeset
|
200 } |
4545
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
201 |
4547
6247f5a42226
Increased resolution.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4546
diff
changeset
|
202 unique = map[int32]struct{}{} |
6247f5a42226
Increased resolution.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4546
diff
changeset
|
203 for i := range cuts { |
6247f5a42226
Increased resolution.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4546
diff
changeset
|
204 unique[cuts[i].arc] = struct{}{} |
4545
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
205 } |
4547
6247f5a42226
Increased resolution.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4546
diff
changeset
|
206 log.Printf("unique arcs: before: %d after %d\n", |
6247f5a42226
Increased resolution.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4546
diff
changeset
|
207 before, len(unique)) |
4544
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
208 } |
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
209 |
4550
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
210 func intersectTriangles( |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
211 tri *octree.Triangulation, |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
212 heights []float64, |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
213 min, max octree.Vertex, |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
214 ) [][]octree.LineStringZ { |
4532
769f723c2581
Cut triangles against class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4531
diff
changeset
|
215 |
4544
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
216 cuts := make([][]indexedArc, len(heights)) |
4532
769f723c2581
Cut triangles against class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4531
diff
changeset
|
217 |
4533
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
218 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
|
219 |
4544
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
220 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
|
221 |
4533
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
222 all: |
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
223 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
|
224 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
|
225 v0 := tri.Points[ti[0]] |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
226 v1 := tri.Points[ti[1]] |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
227 v2 := tri.Points[ti[2]] |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
228 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
|
229 |
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
230 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
|
231 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
|
232 continue |
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
233 } |
4540
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
234 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
|
235 |
769f723c2581
Cut triangles against class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4531
diff
changeset
|
236 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
|
237 |
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
238 var l float64 |
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
239 if j > 0 { |
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
240 l = heights[j-1] |
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
241 } else { |
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
242 l = -math.MaxFloat64 |
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
243 } |
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
244 |
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
245 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
|
246 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
|
247 continue all |
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
248 } |
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
249 if min > h || max < h { |
4532
769f723c2581
Cut triangles against class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4531
diff
changeset
|
250 continue |
769f723c2581
Cut triangles against class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4531
diff
changeset
|
251 } |
4540
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
252 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
|
253 cut := t.IntersectHorizontal(h) |
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
254 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
|
255 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
|
256 arcs = append(arcs, cut) |
4548
befb94e3a953
More debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4547
diff
changeset
|
257 cuts[j] = append(cuts[j], indexedArc{arc: arc, index: i / 3}) |
4532
769f723c2581
Cut triangles against class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4531
diff
changeset
|
258 } |
769f723c2581
Cut triangles against class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4531
diff
changeset
|
259 } |
769f723c2581
Cut triangles against class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4531
diff
changeset
|
260 } |
769f723c2581
Cut triangles against class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4531
diff
changeset
|
261 |
4544
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
262 // 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
|
263 |
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
264 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
|
265 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
|
266 } |
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
267 |
4550
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
268 func() { |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
269 out, err := os.Create("arcs.svg") |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
270 if err != nil { |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
271 log.Printf("err: %v\n", err) |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
272 return |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
273 } |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
274 defer func() { |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
275 out.Close() |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
276 log.Println("writing arcs done") |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
277 }() |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
278 |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
279 buf := bufio.NewWriter(out) |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
280 |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
281 dumpArcsSVG( |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
282 buf, |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
283 min, max, |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
284 cuts, |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
285 arcs) |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
286 buf.Flush() |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
287 }() |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
288 |
4540
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
289 result := make([][]octree.LineStringZ, len(classes)) |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
290 |
4550
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
291 jobs := make(chan int) |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
292 |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
293 var wg sync.WaitGroup |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
294 |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
295 worker := func() { |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
296 defer wg.Done() |
4540
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
297 |
4542
56f4e8cbfab7
Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4541
diff
changeset
|
298 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
|
299 |
4550
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
300 for i := range jobs { |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
301 usedArcs := map[int32]struct{}{} |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
302 var dupes int |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
303 var isolated, inside, found int |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
304 c := classes[i] |
4545
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
305 |
4550
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
306 allInClass: |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
307 for _, idx := range c { |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
308 ns := neighbors(tri, idx) |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
309 mask := where(ns, c) |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
310 switch bits.OnesCount8(mask) { |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
311 case 3: |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
312 // Totally insides do not contribute to the geometries. |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
313 inside++ |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
314 continue allInClass |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
315 case 0: |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
316 // Isolated are areas w/o connections to the rest. |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
317 isolated++ |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
318 ti := tri.Triangles[idx*3 : idx*3+3] |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
319 pb.addTriangle( |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
320 tri.Points[ti[0]], |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
321 tri.Points[ti[1]], |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
322 tri.Points[ti[2]]) |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
323 continue allInClass |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
324 default: |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
325 ti := tri.Triangles[idx*3 : idx*3+3] |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
326 for j := 0; j < 3; j++ { |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
327 if (mask & (1 << j)) == 0 { |
4543
2a707732331f
Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4542
diff
changeset
|
328 |
4550
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
329 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
|
330 |
4550
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
331 for l := i - 1; l <= i; l++ { |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
332 if l < 0 || l >= len(cuts) { |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
333 continue |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
334 } |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
335 arcIdx := findArc(ns[j]/3, cuts[l]) |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
336 if arcIdx == -1 { |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
337 continue |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
338 } |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
339 found++ |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
340 aIdx := cuts[l][arcIdx].arc |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
341 if _, already := usedArcs[aIdx]; already { |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
342 dupes++ |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
343 continue |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
344 } |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
345 usedArcs[aIdx] = struct{}{} |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
346 |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
347 curr = arcs[aIdx] |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
348 break |
4545
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
349 } |
4550
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
350 |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
351 if curr == nil { |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
352 k := (j + 1) % 3 |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
353 front := tri.Points[ti[j]] |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
354 back := tri.Points[ti[k]] |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
355 curr = octree.LineStringZ{front, back} |
4545
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
356 } |
4542
56f4e8cbfab7
Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4541
diff
changeset
|
357 |
4550
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
358 segment: |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
359 for e := pb.open.Front(); e != nil; e = e.Next() { |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
360 line := e.Value.(octree.LineStringZ) |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
361 if nline := glue(curr, line); nline != nil { |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
362 curr = nline |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
363 pb.open.Remove(e) |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
364 goto segment |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
365 } |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
366 } // all open |
4542
56f4e8cbfab7
Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4541
diff
changeset
|
367 |
4550
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
368 // check if closed |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
369 if curr[0].EpsEquals2D(curr[len(curr)-1]) { |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
370 if !curr.CCW() { |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
371 curr.Reverse() |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
372 } |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
373 pb.polygons = append(pb.polygons, curr) |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
374 } else { |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
375 pb.open.PushFront(curr) |
4542
56f4e8cbfab7
Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4541
diff
changeset
|
376 } |
4550
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
377 } // for all border parts |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
378 } |
4542
56f4e8cbfab7
Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4541
diff
changeset
|
379 } |
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
|
380 } |
4540
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
381 |
4550
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
382 log.Printf("\t%d: inside: %d / isolated: %d open: %d closed: %d dupes: %d found: %d\n", |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
383 i, inside, isolated, pb.open.Len(), len(pb.polygons), dupes, found) |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
384 /* |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
385 for e := pb.open.Front(); e != nil; e = e.Next() { |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
386 line := e.Value.(octree.LineStringZ) |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
387 if !line.CCW() { |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
388 line.Reverse() |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
389 } |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
390 pb.polygons = append(pb.polygons, line) |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
391 } |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
392 */ |
4548
befb94e3a953
More debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4547
diff
changeset
|
393 |
4550
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
394 result[i] = pb.polygons |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
395 pb.reset() |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
396 } |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
397 } |
4540
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
398 |
4550
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
399 for n := runtime.NumCPU(); n >= 0; n-- { |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
400 wg.Add(1) |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
401 go worker() |
4533
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
402 } |
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
403 |
4550
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
404 log.Println("inside classes:") |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
405 for i := range classes { |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
406 jobs <- i |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
407 } |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
408 close(jobs) |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
409 |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
410 wg.Wait() |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
411 |
4533
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
412 log.Println("cuts:") |
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
413 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
|
414 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
|
415 } |
769f723c2581
Cut triangles against class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4531
diff
changeset
|
416 |
4540
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
417 return result |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
418 |
4532
769f723c2581
Cut triangles against class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4531
diff
changeset
|
419 // TODO: sew segments together. |
769f723c2581
Cut triangles against class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4531
diff
changeset
|
420 |
769f723c2581
Cut triangles against class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4531
diff
changeset
|
421 } |
769f723c2581
Cut triangles against class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4531
diff
changeset
|
422 |
4540
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
423 type polygonBuilder struct { |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
424 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
|
425 |
56f4e8cbfab7
Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4541
diff
changeset
|
426 open *list.List |
4540
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
427 } |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
428 |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
429 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
|
430 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
|
431 pb.polygons = append(pb.polygons, polygon) |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
432 } |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
433 |
4550
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
434 func (pb *polygonBuilder) reset() { |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
435 pb.polygons = pb.polygons[:0] |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
436 pb.open.Init() |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
437 } |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
438 |
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
|
439 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
|
440 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
|
441 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
|
442 } |
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
|
443 |
4545
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
444 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
|
445 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
|
446 for lo <= hi { |
2a707732331f
Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4542
diff
changeset
|
447 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
|
448 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
|
449 case v < needle: |
2a707732331f
Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4542
diff
changeset
|
450 lo = mid + 1 |
2a707732331f
Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4542
diff
changeset
|
451 case v > needle: |
2a707732331f
Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4542
diff
changeset
|
452 hi = mid - 1 |
2a707732331f
Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4542
diff
changeset
|
453 default: |
4545
e7970d84cb4f
Stitch together arcs on cuts.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4544
diff
changeset
|
454 return mid |
4543
2a707732331f
Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4542
diff
changeset
|
455 } |
2a707732331f
Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4542
diff
changeset
|
456 } |
4544
e5ae16f6d846
Lay foundation to join cut segments to longer arcs.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4543
diff
changeset
|
457 return -1 |
4543
2a707732331f
Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4542
diff
changeset
|
458 } |
2a707732331f
Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4542
diff
changeset
|
459 |
4538
46c9a731a686
Use custom binary search in triangle indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4536
diff
changeset
|
460 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
|
461 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
|
462 for lo <= hi { |
46c9a731a686
Use custom binary search in triangle indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4536
diff
changeset
|
463 mid := (hi-lo)/2 + lo |
46c9a731a686
Use custom binary search in triangle indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4536
diff
changeset
|
464 switch v := haystack[mid]; { |
46c9a731a686
Use custom binary search in triangle indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4536
diff
changeset
|
465 case v < needle: |
46c9a731a686
Use custom binary search in triangle indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4536
diff
changeset
|
466 lo = mid + 1 |
46c9a731a686
Use custom binary search in triangle indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4536
diff
changeset
|
467 case v > needle: |
46c9a731a686
Use custom binary search in triangle indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4536
diff
changeset
|
468 hi = mid - 1 |
46c9a731a686
Use custom binary search in triangle indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4536
diff
changeset
|
469 default: |
46c9a731a686
Use custom binary search in triangle indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4536
diff
changeset
|
470 return true |
46c9a731a686
Use custom binary search in triangle indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4536
diff
changeset
|
471 } |
46c9a731a686
Use custom binary search in triangle indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4536
diff
changeset
|
472 } |
46c9a731a686
Use custom binary search in triangle indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4536
diff
changeset
|
473 return false |
46c9a731a686
Use custom binary search in triangle indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4536
diff
changeset
|
474 } |
46c9a731a686
Use custom binary search in triangle indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4536
diff
changeset
|
475 |
4540
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
476 func where(neighbors, indices []int32) byte { |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
477 var mask byte |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
478 for i, n := range neighbors { |
4549
9c65cef72753
Fixed bit mask usage.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4548
diff
changeset
|
479 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
|
480 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
|
481 } |
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
|
482 } |
4540
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
483 return mask |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
484 } |
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
|
485 |
4541
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
486 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
|
487 // f(x1) = y1 |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
488 // f(x2) = y2 |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
489 // 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
|
490 // y2 = x2*a + b |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
491 |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
492 // y1 - y2 = a*(x1 - x2) |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
493 // 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
|
494 |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
495 if x1 == x2 { |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
496 return func(float64) float64 { |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
497 return 0.5 * (y1 + y2) |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
498 } |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
499 } |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
500 a := (y1 - y2) / (x1 - x2) |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
501 b := y1 - x1*a |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
502 return func(x float64) float64 { |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
503 return x*a + b |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
504 } |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
505 } |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
506 |
4540
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
507 func dumpPolygonsSVG( |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
508 w io.Writer, |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
509 min, max octree.Vertex, |
4541
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
510 classPolygons [][]octree.LineStringZ, |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
511 ) (err error) { |
4540
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
512 |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
513 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
|
514 |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
515 log.Printf("ratio: %.2f\n", ratio) |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
516 |
4547
6247f5a42226
Increased resolution.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4546
diff
changeset
|
517 const width = 50000 |
4541
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
518 height := int(math.Ceil(width * ratio)) |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
519 |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
520 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
|
521 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
|
522 |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
523 out := bufio.NewWriter(w) |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
524 defer func() { err = out.Flush() }() |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
525 |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
526 canvas := svg.New(out) |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
527 canvas.Start(width, height) |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
528 |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
529 rnd := rand.New(rand.NewSource(42)) |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
530 |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
531 for _, polygons := range classPolygons { |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
532 |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
533 r := byte(rnd.Intn(256)) |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
534 g := byte(rnd.Intn(256)) |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
535 b := byte(rnd.Intn(256)) |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
536 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
|
537 |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
538 for _, polygon := range polygons { |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
539 |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
540 x := make([]int, len(polygon)) |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
541 y := make([]int, len(polygon)) |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
542 for i, p := range polygon { |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
543 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
|
544 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
|
545 } |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
546 |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
547 canvas.Polygon(x, y, style) |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
548 } |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
549 |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
550 } |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
551 |
53b55f811666
Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4540
diff
changeset
|
552 canvas.End() |
4540
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
553 |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
554 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
|
555 } |
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
|
556 |
4550
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
557 func dumpArcsSVG( |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
558 w io.Writer, |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
559 min, max octree.Vertex, |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
560 cuts [][]indexedArc, |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
561 arcs []octree.LineStringZ, |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
562 ) (err error) { |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
563 |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
564 ratio := (max.X - min.X) / (max.Y - min.Y) |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
565 |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
566 log.Printf("ratio: %.2f\n", ratio) |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
567 |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
568 const width = 50000 |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
569 height := int(math.Ceil(width * ratio)) |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
570 |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
571 px := linear(min.X, 0, max.X, width) |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
572 py := linear(min.Y, float64(height), max.Y, 0) |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
573 |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
574 out := bufio.NewWriter(w) |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
575 defer func() { err = out.Flush() }() |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
576 |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
577 canvas := svg.New(out) |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
578 canvas.Start(width, height) |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
579 |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
580 rnd := rand.New(rand.NewSource(42)) |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
581 |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
582 for _, cut := range cuts { |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
583 |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
584 usedArcs := map[int32]struct{}{} |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
585 |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
586 r := byte(rnd.Intn(256)) |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
587 g := byte(rnd.Intn(256)) |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
588 b := byte(rnd.Intn(256)) |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
589 |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
590 style := fmt.Sprintf("fill:none;stroke:#%02x%02x%02x", r, g, b) |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
591 |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
592 for i := range cut { |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
593 idx := cut[i].arc |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
594 if _, already := usedArcs[idx]; already { |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
595 continue |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
596 } |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
597 usedArcs[idx] = struct{}{} |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
598 arc := arcs[idx] |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
599 x := make([]int, len(arc)) |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
600 y := make([]int, len(arc)) |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
601 for i, p := range arc { |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
602 x[i] = int(math.Round(px(p.X))) |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
603 y[i] = int(math.Round(py(p.Y))) |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
604 } |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
605 |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
606 canvas.Polyline(x, y, style) |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
607 } |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
608 } |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
609 |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
610 canvas.End() |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
611 |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
612 return nil |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
613 } |
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
614 |
4531
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
615 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
|
616 |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
617 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
|
618 check(err) |
4533
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
619 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
|
620 |
4533
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
621 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
|
622 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
|
623 check(err) |
4533
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
624 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
|
625 |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
626 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
|
627 |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
628 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
|
629 |
c9b6be8d81c8
Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
630 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
|
631 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
|
632 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
|
633 |
4533
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
634 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
|
635 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
|
636 check(err) |
4536
3130c005abef
Measure time of triangulation correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4535
diff
changeset
|
637 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
|
638 |
4533
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
639 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
|
640 |
3998a9ab69c6
Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4532
diff
changeset
|
641 start = time.Now() |
4550
aa2d0006e742
Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4549
diff
changeset
|
642 polygons := intersectTriangles(tri, heights, min, max) |
4532
769f723c2581
Cut triangles against class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4531
diff
changeset
|
643 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
|
644 |
e01b6e7cbe7d
Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4539
diff
changeset
|
645 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
|
646 } |