annotate cmd/isoareas/main.go @ 4546:a3f1d92b8597 iso-areas

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