annotate cmd/isoareas/main.go @ 4543:2a707732331f iso-areas

Look into cuts for finding real class borders.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Thu, 26 Sep 2019 18:34:54 +0200
parents 56f4e8cbfab7
children e5ae16f6d846
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
4543
2a707732331f Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4542
diff changeset
92 type indexedCut struct {
2a707732331f Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4542
diff changeset
93 cut octree.LineStringZ
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
4543
2a707732331f Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4542
diff changeset
97 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
98
769f723c2581 Cut triangles against class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4531
diff changeset
99 cuts := make([][]indexedCut, len(heights))
769f723c2581 Cut triangles against class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4531
diff changeset
100
4533
3998a9ab69c6 Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4532
diff changeset
101 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
102
3998a9ab69c6 Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4532
diff changeset
103 all:
3998a9ab69c6 Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4532
diff changeset
104 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
105 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
106 v0 := tri.Points[ti[0]]
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
107 v1 := tri.Points[ti[1]]
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
108 v2 := tri.Points[ti[2]]
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
109 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
110
3998a9ab69c6 Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4532
diff changeset
111 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
112 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
113 continue
3998a9ab69c6 Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4532
diff changeset
114 }
4540
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
115 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
116
769f723c2581 Cut triangles against class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4531
diff changeset
117 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
118
3998a9ab69c6 Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4532
diff changeset
119 var l float64
3998a9ab69c6 Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4532
diff changeset
120 if j > 0 {
3998a9ab69c6 Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4532
diff changeset
121 l = heights[j-1]
3998a9ab69c6 Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4532
diff changeset
122 } else {
3998a9ab69c6 Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4532
diff changeset
123 l = -math.MaxFloat64
3998a9ab69c6 Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4532
diff changeset
124 }
3998a9ab69c6 Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4532
diff changeset
125
3998a9ab69c6 Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4532
diff changeset
126 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
127 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
128 continue all
3998a9ab69c6 Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4532
diff changeset
129 }
3998a9ab69c6 Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4532
diff changeset
130 if min > h || max < h {
4532
769f723c2581 Cut triangles against class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4531
diff changeset
131 continue
769f723c2581 Cut triangles against class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4531
diff changeset
132 }
4540
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
133 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
134 cut := t.IntersectHorizontal(h)
3998a9ab69c6 Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4532
diff changeset
135 if len(cut) >= 2 {
3998a9ab69c6 Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4532
diff changeset
136 cuts[j] = append(cuts[j], indexedCut{cut, i / 3})
4532
769f723c2581 Cut triangles against class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4531
diff changeset
137 }
769f723c2581 Cut triangles against class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4531
diff changeset
138 }
769f723c2581 Cut triangles against class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4531
diff changeset
139 }
769f723c2581 Cut triangles against class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4531
diff changeset
140
4540
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
141 result := make([][]octree.LineStringZ, len(classes))
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
142
4533
3998a9ab69c6 Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4532
diff changeset
143 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
144 for i, c := range classes {
4540
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
145
4542
56f4e8cbfab7 Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4541
diff changeset
146 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
147
4540
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
148 var isolated, inside int
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
149 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
150 for _, idx := range c {
4540
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
151 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
152 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
153 switch bits.OnesCount8(mask) {
4540
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
154 case 0:
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
155 // 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
156 inside++
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
157 continue allInClass
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
158 case 3:
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
159 // 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
160 isolated++
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
161 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
162 pb.addTriangle(
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
163 tri.Points[ti[0]],
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
164 tri.Points[ti[1]],
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
165 tri.Points[ti[2]])
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
166 continue allInClass
4542
56f4e8cbfab7 Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4541
diff changeset
167 default:
56f4e8cbfab7 Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4541
diff changeset
168 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
169 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
170 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
171
56f4e8cbfab7 Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4541
diff changeset
172 // 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
173 // 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
174
2a707732331f Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4542
diff changeset
175 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
176
4543
2a707732331f Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4542
diff changeset
177 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
178 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
179 continue
2a707732331f Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4542
diff changeset
180 }
2a707732331f Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4542
diff changeset
181 if curr = findCut(ns[j], cuts[l]); curr != nil {
2a707732331f Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4542
diff changeset
182 break
2a707732331f Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4542
diff changeset
183 }
2a707732331f Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4542
diff changeset
184 }
2a707732331f Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4542
diff changeset
185
2a707732331f Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4542
diff changeset
186 if curr == nil {
2a707732331f Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4542
diff changeset
187 k := (j + 1) % 3
2a707732331f Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4542
diff changeset
188 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
189 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
190 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
191 }
4542
56f4e8cbfab7 Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4541
diff changeset
192
56f4e8cbfab7 Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4541
diff changeset
193 segment:
56f4e8cbfab7 Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4541
diff changeset
194 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
195 line := e.Value.(octree.LineStringZ)
56f4e8cbfab7 Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4541
diff changeset
196 first, last := line[0], line[len(line)-1]
56f4e8cbfab7 Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4541
diff changeset
197
4543
2a707732331f Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4542
diff changeset
198 front, back := curr[0], curr[len(curr)-1]
2a707732331f Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4542
diff changeset
199
4542
56f4e8cbfab7 Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4541
diff changeset
200 if back.EpsEquals(first) {
56f4e8cbfab7 Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4541
diff changeset
201 curr = append(curr, line[1:]...)
56f4e8cbfab7 Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4541
diff changeset
202 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
203 goto segment
56f4e8cbfab7 Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4541
diff changeset
204 }
56f4e8cbfab7 Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4541
diff changeset
205
56f4e8cbfab7 Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4541
diff changeset
206 if back.EpsEquals(last) {
56f4e8cbfab7 Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4541
diff changeset
207 line.Reverse()
56f4e8cbfab7 Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4541
diff changeset
208 curr = append(curr, line[1:]...)
56f4e8cbfab7 Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4541
diff changeset
209 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
210 goto segment
56f4e8cbfab7 Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4541
diff changeset
211 }
56f4e8cbfab7 Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4541
diff changeset
212
56f4e8cbfab7 Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4541
diff changeset
213 if front.EpsEquals(last) {
56f4e8cbfab7 Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4541
diff changeset
214 curr = append(line, curr[1:]...)
56f4e8cbfab7 Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4541
diff changeset
215 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
216 goto segment
56f4e8cbfab7 Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4541
diff changeset
217 }
56f4e8cbfab7 Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4541
diff changeset
218
56f4e8cbfab7 Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4541
diff changeset
219 if front.EpsEquals(first) {
56f4e8cbfab7 Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4541
diff changeset
220 line.Reverse()
56f4e8cbfab7 Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4541
diff changeset
221 curr = append(line, curr[1:]...)
56f4e8cbfab7 Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4541
diff changeset
222 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
223 goto segment
56f4e8cbfab7 Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4541
diff changeset
224 }
56f4e8cbfab7 Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4541
diff changeset
225 } // all open
56f4e8cbfab7 Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4541
diff changeset
226
56f4e8cbfab7 Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4541
diff changeset
227 // check if closed
56f4e8cbfab7 Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4541
diff changeset
228 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
229 if !curr.CCW() {
56f4e8cbfab7 Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4541
diff changeset
230 curr.Reverse()
56f4e8cbfab7 Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4541
diff changeset
231 }
56f4e8cbfab7 Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4541
diff changeset
232 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
233 } else {
56f4e8cbfab7 Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4541
diff changeset
234 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
235 }
56f4e8cbfab7 Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4541
diff changeset
236 } // 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
237 }
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
238 }
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
239 }
4540
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
240
4542
56f4e8cbfab7 Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4541
diff changeset
241 log.Printf("\t%d: inside: %d / isolated: %d open: %d closed: %d\n",
56f4e8cbfab7 Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4541
diff changeset
242 i, inside, isolated, pb.open.Len(), len(pb.polygons))
4540
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
243
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
244 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
245 }
3998a9ab69c6 Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4532
diff changeset
246
3998a9ab69c6 Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4532
diff changeset
247 log.Println("cuts:")
3998a9ab69c6 Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4532
diff changeset
248 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
249 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
250 }
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 return result
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
253
4532
769f723c2581 Cut triangles against class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4531
diff changeset
254 // TODO: sew segments together.
769f723c2581 Cut triangles against class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4531
diff changeset
255
769f723c2581 Cut triangles against class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4531
diff changeset
256 }
769f723c2581 Cut triangles against class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4531
diff changeset
257
4540
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
258 type polygonBuilder struct {
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
259 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
260
56f4e8cbfab7 Sew together triangles that totally inside a single class.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4541
diff changeset
261 open *list.List
4540
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
262 }
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
263
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
264 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
265 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
266 pb.polygons = append(pb.polygons, polygon)
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
267 }
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
268
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
269 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
270 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
271 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
272 }
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
273
4543
2a707732331f Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4542
diff changeset
274 func findCut(needle int32, haystack []indexedCut) octree.LineStringZ {
2a707732331f Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4542
diff changeset
275 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
276 for lo <= hi {
2a707732331f Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4542
diff changeset
277 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
278 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
279 case v < needle:
2a707732331f Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4542
diff changeset
280 lo = mid + 1
2a707732331f Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4542
diff changeset
281 case v > needle:
2a707732331f Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4542
diff changeset
282 hi = mid - 1
2a707732331f Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4542
diff changeset
283 default:
2a707732331f Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4542
diff changeset
284 return haystack[mid].cut
2a707732331f Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4542
diff changeset
285 }
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 return nil
2a707732331f Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4542
diff changeset
288 }
2a707732331f Look into cuts for finding real class borders.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4542
diff changeset
289
4538
46c9a731a686 Use custom binary search in triangle indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4536
diff changeset
290 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
291 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
292 for lo <= hi {
46c9a731a686 Use custom binary search in triangle indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4536
diff changeset
293 mid := (hi-lo)/2 + lo
46c9a731a686 Use custom binary search in triangle indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4536
diff changeset
294 switch v := haystack[mid]; {
46c9a731a686 Use custom binary search in triangle indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4536
diff changeset
295 case v < needle:
46c9a731a686 Use custom binary search in triangle indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4536
diff changeset
296 lo = mid + 1
46c9a731a686 Use custom binary search in triangle indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4536
diff changeset
297 case v > needle:
46c9a731a686 Use custom binary search in triangle indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4536
diff changeset
298 hi = mid - 1
46c9a731a686 Use custom binary search in triangle indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4536
diff changeset
299 default:
46c9a731a686 Use custom binary search in triangle indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4536
diff changeset
300 return true
46c9a731a686 Use custom binary search in triangle indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4536
diff changeset
301 }
46c9a731a686 Use custom binary search in triangle indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4536
diff changeset
302 }
46c9a731a686 Use custom binary search in triangle indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4536
diff changeset
303 return false
46c9a731a686 Use custom binary search in triangle indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4536
diff changeset
304 }
46c9a731a686 Use custom binary search in triangle indices.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4536
diff changeset
305
4540
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
306 func where(neighbors, indices []int32) byte {
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
307 var mask byte
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
308 for i, n := range neighbors {
4539
99928231b679 Code simplification.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4538
diff changeset
309 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
310 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
311 }
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
312 }
4540
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
313 return mask
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
314 }
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
315
4541
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
316 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
317 // f(x1) = y1
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
318 // f(x2) = y2
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
319 // 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
320 // y2 = x2*a + b
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
321
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
322 // y1 - y2 = a*(x1 - x2)
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
323 // 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
324
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
325 if x1 == x2 {
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
326 return func(float64) float64 {
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
327 return 0.5 * (y1 + y2)
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
328 }
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
329 }
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
330 a := (y1 - y2) / (x1 - x2)
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
331 b := y1 - x1*a
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
332 return func(x float64) float64 {
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
333 return x*a + b
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
334 }
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
335 }
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
336
4540
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
337 func dumpPolygonsSVG(
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
338 w io.Writer,
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
339 min, max octree.Vertex,
4541
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
340 classPolygons [][]octree.LineStringZ,
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
341 ) (err error) {
4540
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
342
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
343 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
344
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
345 log.Printf("ratio: %.2f\n", ratio)
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
346
4541
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
347 const width = 1000
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
348 height := int(math.Ceil(width * ratio))
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
349
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
350 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
351 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
352
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
353 out := bufio.NewWriter(w)
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
354 defer func() { err = out.Flush() }()
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
355
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
356 canvas := svg.New(out)
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
357 canvas.Start(width, height)
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
358
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
359 rnd := rand.New(rand.NewSource(42))
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
360
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
361 for _, polygons := range classPolygons {
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
362
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
363 r := byte(rnd.Intn(256))
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
364 g := byte(rnd.Intn(256))
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
365 b := byte(rnd.Intn(256))
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
366 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
367
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
368 for _, polygon := range polygons {
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
369
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
370 x := make([]int, len(polygon))
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
371 y := make([]int, len(polygon))
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
372 for i, p := range polygon {
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
373 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
374 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
375 }
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
376
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
377 canvas.Polygon(x, y, style)
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
378 }
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
379
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
380 }
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
381
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
382 canvas.End()
4540
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
383
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
384 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
385 }
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
386
4531
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
387 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
388
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
389 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
390 check(err)
4533
3998a9ab69c6 Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4532
diff changeset
391 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
392
4533
3998a9ab69c6 Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4532
diff changeset
393 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
394 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
395 check(err)
4533
3998a9ab69c6 Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4532
diff changeset
396 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
397
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
398 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
399
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
400 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
401
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
402 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
403 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
404 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
405
4533
3998a9ab69c6 Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4532
diff changeset
406 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
407 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
408 check(err)
4536
3130c005abef Measure time of triangulation correctly.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4535
diff changeset
409 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
410
4533
3998a9ab69c6 Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4532
diff changeset
411 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
412
3998a9ab69c6 Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4532
diff changeset
413 start = time.Now()
4540
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
414 polygons := intersectTriangles(tri, heights)
4532
769f723c2581 Cut triangles against class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4531
diff changeset
415 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
416
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
417 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
418 }