annotate cmd/isoareas/main.go @ 4547:6247f5a42226 iso-areas

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