annotate cmd/isoareas/main.go @ 4552:7ed5a4a94efc iso-areas

Used fogleman's contourmap as a tracing alternative.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Tue, 01 Oct 2019 13:18:16 +0200
parents b5b23b6d76f1
children 4c476d65d1bb
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"
4552
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
18 "flag"
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"
4541
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
23 "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
24 "os"
4552
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
25 "runtime"
4531
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
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"
4552
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
28 "sync"
4532
769f723c2581 Cut triangles against class breaks.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4531
diff changeset
29 "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
30
4541
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
31 svg "github.com/ajstarks/svgo"
4552
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
32 "github.com/fogleman/contourmap"
4541
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
33
4531
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
34 "gemma.intevation.de/gemma/pkg/octree"
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
35 )
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
36
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
37 const classBreaks = `1:#ff00dd,1.5,1.7,1.9,2.1,2.3,2.5:#f25f20,2.7,2.9,3.1:#f7e40e,3.3,3.5,4:#8ad51a,4.5,5,5.5,6,6.5,7:#1414ff`
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
38
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
39 func loadXYZ(r io.Reader) (octree.MultiPointZ, error) {
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
40
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
41 scanner := bufio.NewScanner(r)
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
42
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
43 points := make(octree.MultiPointZ, 0, 2000000)
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
44
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
45 var x, y, z float64
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
46 var err error
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
47
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
48 for scanner.Scan() {
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
49 line := strings.TrimSpace(scanner.Text())
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
50 if len(line) == 0 || strings.HasPrefix(line, "#") {
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
51 continue
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
52 }
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
53 parts := strings.SplitN(line, " ", 3)
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
54 if len(parts) != 3 {
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
55 continue
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
56 }
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
57
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
58 if x, err = strconv.ParseFloat(parts[0], 64); err != nil {
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
59 return nil, err
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
60 }
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
61 if y, err = strconv.ParseFloat(parts[1], 64); err != nil {
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
62 return nil, err
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
63 }
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
64 if z, err = strconv.ParseFloat(parts[2], 64); err != nil {
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
65 return nil, err
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
66 }
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
67 points = append(points, octree.Vertex{X: x, Y: y, Z: z})
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
68 }
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
69
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
70 return points, nil
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
71 }
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
72
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
73 func 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
74 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
75 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
76 }
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
77 }
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
78
4541
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
79 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
80 // f(x1) = y1
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
81 // f(x2) = y2
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
82 // 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
83 // y2 = x2*a + b
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
84
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
85 // y1 - y2 = a*(x1 - x2)
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
86 // 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
87
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
88 if x1 == x2 {
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
89 return func(float64) float64 {
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
90 return 0.5 * (y1 + y2)
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
91 }
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
92 }
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
93 a := (y1 - y2) / (x1 - x2)
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
94 b := y1 - x1*a
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
95 return func(x float64) float64 {
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
96 return x*a + b
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
97 }
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
98 }
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
99
4552
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
100 func dumpContoursSVG(
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
101 w io.Writer,
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
102 contours [][]contourmap.Contour,
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
103 ) (err error) {
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
104
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
105 var (
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
106 minX = math.MaxFloat64
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
107 minY = math.MaxFloat64
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
108 maxX = -math.MaxFloat64
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
109 maxY = -math.MaxFloat64
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
110 )
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
111
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
112 for _, c := range contours {
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
113 for _, r := range c {
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
114 for _, p := range r {
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
115 if p.X < minX {
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
116 minX = p.X
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
117 }
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
118 if p.Y < minY {
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
119 minY = p.Y
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
120 }
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
121 if p.X > maxX {
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
122 maxX = p.X
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
123 }
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
124 if p.Y > maxY {
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
125 maxY = p.Y
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
126 }
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
127 }
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
128 }
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
129 }
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
130 ratio := (maxX - minX) / (maxY - minY)
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
131
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
132 log.Printf("ratio: %.2f\n", ratio)
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
133
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
134 const width = 50000
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
135 height := int(math.Ceil(width * ratio))
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
136
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
137 px := linear(minX, 0, maxX, width)
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
138 py := linear(minY, float64(height), maxY, 0)
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
139
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
140 out := bufio.NewWriter(w)
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
141 defer func() { err = out.Flush() }()
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
142
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
143 canvas := svg.New(out)
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
144 canvas.Start(width, height)
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
145
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
146 rnd := rand.New(rand.NewSource(42))
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
147
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
148 for _, c := range contours {
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
149
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
150 r := byte(rnd.Intn(256))
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
151 g := byte(rnd.Intn(256))
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
152 b := byte(rnd.Intn(256))
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
153 style := fmt.Sprintf("fill:#%02x%02x%02x", r, g, b)
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
154
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
155 for _, r := range c {
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
156 x := make([]int, len(r))
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
157 y := make([]int, len(r))
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
158 for i, p := range r {
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
159 x[i] = int(math.Round(px(p.X)))
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
160 y[i] = int(math.Round(py(p.Y)))
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
161 }
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
162
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
163 canvas.Polygon(x, y, style)
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
164 }
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
165 }
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
166
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
167 canvas.End()
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
168 return
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
169 }
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
170
4540
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
171 func dumpPolygonsSVG(
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
172 w io.Writer,
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
173 min, max octree.Vertex,
4541
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
174 classPolygons [][]octree.LineStringZ,
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
175 ) (err error) {
4540
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
176
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
177 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
178
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
179 log.Printf("ratio: %.2f\n", ratio)
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
180
4547
6247f5a42226 Increased resolution.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4546
diff changeset
181 const width = 50000
4541
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
182 height := int(math.Ceil(width * ratio))
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
183
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
184 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
185 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
186
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
187 out := bufio.NewWriter(w)
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
188 defer func() { err = out.Flush() }()
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
189
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
190 canvas := svg.New(out)
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
191 canvas.Start(width, height)
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
192
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
193 rnd := rand.New(rand.NewSource(42))
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
194
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
195 for _, polygons := range classPolygons {
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
196
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
197 r := byte(rnd.Intn(256))
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
198 g := byte(rnd.Intn(256))
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
199 b := byte(rnd.Intn(256))
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
200 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
201
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
202 for _, polygon := range polygons {
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
203
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
204 x := make([]int, len(polygon))
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
205 y := make([]int, len(polygon))
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
206 for i, p := range polygon {
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
207 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
208 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
209 }
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
210
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
211 canvas.Polygon(x, y, style)
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
212 }
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
213
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
214 }
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
215
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
216 canvas.End()
4540
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
217
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
218 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
219 }
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
220
4550
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
221 func dumpArcsSVG(
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
222 w io.Writer,
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
223 min, max octree.Vertex,
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
224 cuts [][]indexedArc,
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
225 arcs []octree.LineStringZ,
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
226 ) (err error) {
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
227
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
228 ratio := (max.X - min.X) / (max.Y - min.Y)
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
229
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
230 log.Printf("ratio: %.2f\n", ratio)
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
231
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
232 const width = 50000
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
233 height := int(math.Ceil(width * ratio))
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
234
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
235 px := linear(min.X, 0, max.X, width)
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
236 py := linear(min.Y, float64(height), max.Y, 0)
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
237
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
238 out := bufio.NewWriter(w)
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
239 defer func() { err = out.Flush() }()
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
240
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
241 canvas := svg.New(out)
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
242 canvas.Start(width, height)
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
243
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
244 rnd := rand.New(rand.NewSource(42))
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
245
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
246 for _, cut := range cuts {
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
247
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
248 usedArcs := map[int32]struct{}{}
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
249
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
250 r := byte(rnd.Intn(256))
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
251 g := byte(rnd.Intn(256))
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
252 b := byte(rnd.Intn(256))
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
253
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
254 style := fmt.Sprintf("fill:none;stroke:#%02x%02x%02x", r, g, b)
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
255
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
256 for i := range cut {
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
257 idx := cut[i].arc
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
258 if _, already := usedArcs[idx]; already {
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
259 continue
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
260 }
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
261 usedArcs[idx] = struct{}{}
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
262 arc := arcs[idx]
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
263 x := make([]int, len(arc))
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
264 y := make([]int, len(arc))
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
265 for i, p := range arc {
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
266 x[i] = int(math.Round(px(p.X)))
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
267 y[i] = int(math.Round(py(p.Y)))
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
268 }
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
269
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
270 canvas.Polyline(x, y, style)
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
271 }
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
272 }
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
273
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
274 canvas.End()
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
275
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
276 return nil
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
277 }
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
278
4531
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
279 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
280
4552
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
281 cellSize := float64(0.5)
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
282
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
283 flag.Float64Var(&cellSize, "cellsize", 0.5, "width/height of raster cell [m]")
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
284
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
285 flag.Parse()
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
286
4531
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
287 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
288 check(err)
4533
3998a9ab69c6 Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4532
diff changeset
289 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
290
4533
3998a9ab69c6 Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4532
diff changeset
291 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
292 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
293 check(err)
4533
3998a9ab69c6 Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4532
diff changeset
294 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
295
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
296 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
297
4552
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
298 start = time.Now()
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
299 tri, err := octree.Triangulate(xyz)
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
300 check(err)
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
301 log.Printf("triangulation took %v\n", time.Since(start))
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
302 tooLongEdge := tri.EstimateTooLong()
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
303 log.Printf("Eliminate triangles with edges longer than %.2f meters.", tooLongEdge)
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
304
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
305 start = time.Now()
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
306 polygon, removed := tri.ConcaveHull(tooLongEdge)
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
307
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
308 polygonArea := polygon.Area()
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
309 if polygonArea < 0.0 { // counter clockwise
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
310 polygonArea = -polygonArea
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
311 polygon.Reverse()
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
312 }
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
313
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
314 var clippingPolygon octree.Polygon
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
315 clippingPolygon.FromLineStringZ(polygon)
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
316 clippingPolygon.Indexify()
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
317
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
318 tin := tri.Tin()
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
319 // tin.EPSG = epsg
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
320
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
321 var str octree.STRTree
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
322 str.Build(tin)
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
323
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
324 removed = str.Clip(&clippingPolygon)
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
325
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
326 builder := octree.NewBuilder(tin)
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
327 builder.Build(removed)
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
328
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
329 tree := builder.Tree()
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
330
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
331 min, max := tin.Min, tin.Max
4531
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
332
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
333 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
334 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
335 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
336
4552
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
337 width := max.X - min.X
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
338 height := max.Y - min.Y
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
339
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
340 log.Printf("width/height: %.2f / %.2f\n", width, height)
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
341
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
342 xcells := int(math.Ceil(width / cellSize))
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
343 ycells := int(math.Ceil(height / cellSize))
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
344
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
345 log.Printf("raster size: (%d, %d)\n", xcells, ycells)
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
346
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
347 raster := make([]float64, xcells*ycells)
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
348
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
349 const closed = -math.MaxFloat64
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
350 for i := range raster {
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
351 raster[i] = closed
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
352 }
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
353
4533
3998a9ab69c6 Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4532
diff changeset
354 start = time.Now()
4552
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
355
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
356 var wg sync.WaitGroup
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
357
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
358 rows := make(chan int)
4531
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
359
4552
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
360 rasterRow := func() {
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
361 defer wg.Done()
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
362 for i := range rows {
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
363 pos := i * xcells
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
364 row := raster[pos : pos+xcells]
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
365 //log.Printf("len: %d\n", len(row))
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
366 py := min.Y + float64(i)*cellSize + cellSize/2
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
367 px := min.X + cellSize/2
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
368 for j := range row {
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
369 v, ok := tree.Value(px, py)
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
370 if ok {
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
371 row[j] = v
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
372 }
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
373 px += cellSize
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
374 }
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
375 }
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
376 }
4533
3998a9ab69c6 Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4532
diff changeset
377
3998a9ab69c6 Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4532
diff changeset
378 start = time.Now()
4552
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
379
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
380 for n := runtime.NumCPU(); n >= 1; n-- {
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
381 wg.Add(1)
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
382 go rasterRow()
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
383 }
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
384
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
385 for i := 0; i < ycells; i++ {
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
386 rows <- i
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
387 }
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
388 close(rows)
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
389
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
390 wg.Wait()
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
391
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
392 log.Printf("Rasterizing took %v.\n", time.Since(start))
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
393
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
394 start = time.Now()
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
395 cm := contourmap.FromFloat64s(xcells, ycells, raster).Closed()
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
396
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
397 start = time.Now()
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
398
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
399 contours := make([][]contourmap.Contour, len(heights))
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
400
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
401 cnts := make(chan int)
4540
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
402
4552
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
403 doContours := func() {
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
404 defer wg.Done()
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
405 for i := range cnts {
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
406 contours[i] = cm.Contours(heights[i])
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
407 }
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
408 }
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
409
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
410 for n := runtime.NumCPU(); n >= 1; n-- {
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
411 wg.Add(1)
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
412 go doContours()
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
413 }
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
414
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
415 for i := range heights {
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
416 cnts <- i
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
417 }
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
418 close(cnts)
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
419
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
420 wg.Wait()
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
421
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
422 log.Printf("Calculating contours took %v.\n", time.Since(start))
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
423 check(dumpContoursSVG(os.Stdout, contours))
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
424
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
425 /*
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
426
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
427 start = time.Now()
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
428 polygons := intersectTriangles(tri, heights, min, max)
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
429 log.Printf("intersecting triangles took %v.\n", time.Since(start))
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
430
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
431 check(dumpPolygonsSVG(os.Stdout, min, max, polygons))
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
432 */
4531
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
433 }