Mercurial > gemma
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 |
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 } |