annotate cmd/isoareas/main.go @ 4556:04eba9dc917d iso-areas

Use colors from configuration instead of random rgb values.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Tue, 01 Oct 2019 17:37:54 +0200
parents 1c5c6ffab886
children 17cba8b447a6
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
4556
04eba9dc917d Use colors from configuration instead of random rgb values.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4555
diff changeset
34 "gemma.intevation.de/gemma/pkg/models"
4531
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
35 "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
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
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
38 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
39
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
40 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
41
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
42 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
43
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
44 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
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 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
47 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
48
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
49 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
50 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
51 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
52 continue
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
53 }
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
54 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
55 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
56 continue
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
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 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
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 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
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 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
66 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
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 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
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 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
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
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
74 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
75 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
76 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
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 }
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
79
4541
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
80 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
81 // f(x1) = y1
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
82 // f(x2) = y2
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
83 // 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
84 // y2 = x2*a + b
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
85
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
86 // y1 - y2 = a*(x1 - x2)
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
87 // 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
88
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
89 if x1 == x2 {
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
90 return func(float64) float64 {
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
91 return 0.5 * (y1 + y2)
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 }
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
94 a := (y1 - y2) / (x1 - x2)
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
95 b := y1 - x1*a
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
96 return func(x float64) float64 {
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
97 return x*a + b
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 }
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
100
4552
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
101 func dumpContoursSVG(
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
102 w io.Writer,
4556
04eba9dc917d Use colors from configuration instead of random rgb values.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4555
diff changeset
103 heights []float64,
04eba9dc917d Use colors from configuration instead of random rgb values.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4555
diff changeset
104 colors models.ColorValues,
4552
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
105 contours [][]contourmap.Contour,
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
106 ) (err error) {
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
107
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
108 var (
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
109 minX = math.MaxFloat64
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
110 minY = math.MaxFloat64
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
111 maxX = -math.MaxFloat64
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
112 maxY = -math.MaxFloat64
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
113 )
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
114
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
115 for _, c := range contours {
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
116 for _, r := range c {
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
117 for _, p := range r {
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
118 if p.X < minX {
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
119 minX = p.X
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.Y < minY {
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
122 minY = p.Y
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.X > maxX {
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
125 maxX = p.X
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 if p.Y > maxY {
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
128 maxY = p.Y
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 }
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 }
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
133 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
134
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
135 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
136
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
137 const width = 50000
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
138 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
139
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
140 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
141 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
142
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
143 out := bufio.NewWriter(w)
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
144 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
145
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
146 canvas := svg.New(out)
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
147 canvas.Start(width, height)
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
148
4556
04eba9dc917d Use colors from configuration instead of random rgb values.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4555
diff changeset
149 for j, c := range contours {
4552
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
150
4556
04eba9dc917d Use colors from configuration instead of random rgb values.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4555
diff changeset
151 h := heights[j]
04eba9dc917d Use colors from configuration instead of random rgb values.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4555
diff changeset
152 col := colors.Clip(h)
04eba9dc917d Use colors from configuration instead of random rgb values.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4555
diff changeset
153
04eba9dc917d Use colors from configuration instead of random rgb values.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4555
diff changeset
154 style := fmt.Sprintf("fill:#%02x%02x%02x", col.R, col.G, col.B)
4552
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
155
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
156 for _, r := range c {
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
157 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
158 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
159 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
160 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
161 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
162 }
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
163
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
164 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
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
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
168 canvas.End()
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
169 return
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
170 }
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
171
4540
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
172 func dumpPolygonsSVG(
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
173 w io.Writer,
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
174 min, max octree.Vertex,
4541
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
175 classPolygons [][]octree.LineStringZ,
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
176 ) (err error) {
4540
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
177
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
178 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
179
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
180 log.Printf("ratio: %.2f\n", ratio)
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
181
4547
6247f5a42226 Increased resolution.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4546
diff changeset
182 const width = 50000
4541
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
183 height := int(math.Ceil(width * ratio))
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
184
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
185 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
186 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
187
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
188 out := bufio.NewWriter(w)
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
189 defer func() { err = out.Flush() }()
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
190
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
191 canvas := svg.New(out)
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
192 canvas.Start(width, height)
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
193
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
194 rnd := rand.New(rand.NewSource(42))
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
195
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
196 for _, polygons := range classPolygons {
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
197
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
198 r := byte(rnd.Intn(256))
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
199 g := byte(rnd.Intn(256))
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
200 b := byte(rnd.Intn(256))
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
201 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
202
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
203 for _, polygon := range polygons {
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
204
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
205 x := make([]int, len(polygon))
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
206 y := make([]int, len(polygon))
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
207 for i, p := range polygon {
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
208 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
209 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
210 }
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
211
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
212 canvas.Polygon(x, y, style)
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
53b55f811666 Dump generated polygons as SVG.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4540
diff changeset
217 canvas.End()
4540
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
218
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
219 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
220 }
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
221
4550
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
222 func dumpArcsSVG(
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
223 w io.Writer,
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
224 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
225 cuts [][]indexedArc,
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
226 arcs []octree.LineStringZ,
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
227 ) (err error) {
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
228
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
229 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
230
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
231 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
232
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
233 const width = 50000
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
234 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
235
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
236 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
237 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
238
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
239 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
240 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
241
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
242 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
243 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
244
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
245 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
246
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
247 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
248
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
249 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
250
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
251 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
252 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
253 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
254
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
255 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
256
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
257 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
258 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
259 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
260 continue
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
261 }
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
262 usedArcs[idx] = struct{}{}
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
263 arc := arcs[idx]
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
264 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
265 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
266 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
267 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
268 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
269 }
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
270
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
271 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
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
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
275 canvas.End()
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
276
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
277 return nil
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
278 }
aa2d0006e742 Write iso lines between classes to SVG for debugging.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4549
diff changeset
279
4531
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
280 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
281
4552
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
282 cellSize := float64(0.5)
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
283
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
284 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
285
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
286 flag.Parse()
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
287
4556
04eba9dc917d Use colors from configuration instead of random rgb values.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4555
diff changeset
288 colors, err := models.ParseColorValues(classBreaks)
4531
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
289 check(err)
4556
04eba9dc917d Use colors from configuration instead of random rgb values.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4555
diff changeset
290
04eba9dc917d Use colors from configuration instead of random rgb values.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4555
diff changeset
291 heights := colors.Heights()
04eba9dc917d Use colors from configuration instead of random rgb values.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4555
diff changeset
292
4533
3998a9ab69c6 Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4532
diff changeset
293 log.Printf("num classes: %d\n", len(heights))
3998a9ab69c6 Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4532
diff changeset
294 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
295 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
296 check(err)
4533
3998a9ab69c6 Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4532
diff changeset
297 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
298
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
299 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
300
4552
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
301 start = time.Now()
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
302 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
303 check(err)
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
304 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
305 tooLongEdge := tri.EstimateTooLong()
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
306 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
307
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
308 start = time.Now()
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
309 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
310
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
311 polygonArea := polygon.Area()
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
312 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
313 polygonArea = -polygonArea
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
314 polygon.Reverse()
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
315 }
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
316
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
317 var clippingPolygon octree.Polygon
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
318 clippingPolygon.FromLineStringZ(polygon)
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
319 clippingPolygon.Indexify()
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 tin := tri.Tin()
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
322 // tin.EPSG = epsg
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 var str octree.STRTree
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
325 str.Build(tin)
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
326
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
327 removed = str.Clip(&clippingPolygon)
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 builder := octree.NewBuilder(tin)
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
330 builder.Build(removed)
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
331
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
332 tree := builder.Tree()
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
333
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
334 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
335
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
336 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
337 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
338 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
339
4555
1c5c6ffab886 Extrapolate the class breaks to the models Z extrema.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4553
diff changeset
340 heights = octree.ExtrapolateClassBreaks(heights, min.Z, max.Z)
1c5c6ffab886 Extrapolate the class breaks to the models Z extrema.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4553
diff changeset
341
4552
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
342 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
343 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
344
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
345 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
346
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
347 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
348 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
349
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
350 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
351
4553
4c476d65d1bb Avoid the extra closing raster by directly constructing a raster with a border.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4552
diff changeset
352 // Add border for closing
4c476d65d1bb Avoid the extra closing raster by directly constructing a raster with a border.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4552
diff changeset
353 raster := make([]float64, (xcells+2)*(ycells+2))
4552
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
354
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
355 const closed = -math.MaxFloat64
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
356 for i := range raster {
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
357 raster[i] = closed
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
358 }
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
359
4533
3998a9ab69c6 Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4532
diff changeset
360 start = time.Now()
4552
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
361
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
362 var wg sync.WaitGroup
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
363
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
364 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
365
4552
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
366 rasterRow := func() {
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
367 defer wg.Done()
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
368 for i := range rows {
4553
4c476d65d1bb Avoid the extra closing raster by directly constructing a raster with a border.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4552
diff changeset
369 pos := (i+1)*(xcells+2) + 1
4552
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
370 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
371 //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
372 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
373 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
374 for j := range row {
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
375 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
376 if ok {
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
377 row[j] = v
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
378 }
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
379 px += cellSize
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
380 }
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
381 }
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
382 }
4533
3998a9ab69c6 Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4532
diff changeset
383
3998a9ab69c6 Find out which triangles are fully inside classes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4532
diff changeset
384 start = time.Now()
4552
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
385
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
386 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
387 wg.Add(1)
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
388 go rasterRow()
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
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
391 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
392 rows <- i
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 close(rows)
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
395
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
396 wg.Wait()
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
397
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
398 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
399
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
400 start = time.Now()
4553
4c476d65d1bb Avoid the extra closing raster by directly constructing a raster with a border.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4552
diff changeset
401 cm := contourmap.FromFloat64s(xcells+2, ycells+2, raster)
4552
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
402
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
403 start = time.Now()
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
404
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
405 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
406
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
407 cnts := make(chan int)
4540
e01b6e7cbe7d Detect isolated triangles as standalone areas.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4539
diff changeset
408
4552
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
409 doContours := func() {
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
410 defer wg.Done()
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
411 for i := range cnts {
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
412 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
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
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
416 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
417 wg.Add(1)
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
418 go doContours()
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
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
421 for i := range heights {
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
422 cnts <- i
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
423 }
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
424 close(cnts)
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 wg.Wait()
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
427
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
428 log.Printf("Calculating contours took %v.\n", time.Since(start))
4556
04eba9dc917d Use colors from configuration instead of random rgb values.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4555
diff changeset
429 check(dumpContoursSVG(os.Stdout, heights, colors, contours))
4552
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 /*
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
432
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
433 start = time.Now()
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
434 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
435 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
436
7ed5a4a94efc Used fogleman's contourmap as a tracing alternative.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4551
diff changeset
437 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
438 */
4531
c9b6be8d81c8 Started a branch to calculate the iso areas for a given triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
439 }