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
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"
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 }