Mercurial > gemma
comparison cmd/isoareas/main.go @ 4531:c9b6be8d81c8 iso-areas
Started a branch to calculate the iso areas for a given triangulation.
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Tue, 24 Sep 2019 17:19:52 +0200 |
parents | |
children | 769f723c2581 |
comparison
equal
deleted
inserted
replaced
4475:b74d98fc82a5 | 4531:c9b6be8d81c8 |
---|---|
1 // This is Free Software under GNU Affero General Public License v >= 3.0 | |
2 // without warranty, see README.md and license for details. | |
3 // | |
4 // SPDX-License-Identifier: AGPL-3.0-or-later | |
5 // License-Filename: LICENSES/AGPL-3.0.txt | |
6 // | |
7 // Copyright (C) 2019 by via donau | |
8 // – Österreichische Wasserstraßen-Gesellschaft mbH | |
9 // Software engineering by Intevation GmbH | |
10 // | |
11 // Author(s): | |
12 // * Sascha L. Teichmann <sascha.teichmann@intevation.de> | |
13 | |
14 package main | |
15 | |
16 import ( | |
17 "bufio" | |
18 "io" | |
19 "log" | |
20 "os" | |
21 "strconv" | |
22 "strings" | |
23 | |
24 "gemma.intevation.de/gemma/pkg/octree" | |
25 ) | |
26 | |
27 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` | |
28 | |
29 func loadXYZ(r io.Reader) (octree.MultiPointZ, error) { | |
30 | |
31 scanner := bufio.NewScanner(r) | |
32 | |
33 points := make(octree.MultiPointZ, 0, 2000000) | |
34 | |
35 var x, y, z float64 | |
36 var err error | |
37 | |
38 for scanner.Scan() { | |
39 line := strings.TrimSpace(scanner.Text()) | |
40 if len(line) == 0 || strings.HasPrefix(line, "#") { | |
41 continue | |
42 } | |
43 parts := strings.SplitN(line, " ", 3) | |
44 if len(parts) != 3 { | |
45 continue | |
46 } | |
47 | |
48 if x, err = strconv.ParseFloat(parts[0], 64); err != nil { | |
49 return nil, err | |
50 } | |
51 if y, err = strconv.ParseFloat(parts[1], 64); err != nil { | |
52 return nil, err | |
53 } | |
54 if z, err = strconv.ParseFloat(parts[2], 64); err != nil { | |
55 return nil, err | |
56 } | |
57 points = append(points, octree.Vertex{X: x, Y: y, Z: z}) | |
58 } | |
59 | |
60 return points, nil | |
61 } | |
62 | |
63 func minMax(points []octree.Vertex) (octree.Vertex, octree.Vertex) { | |
64 if len(points) == 0 { | |
65 return octree.Vertex{}, octree.Vertex{} | |
66 } | |
67 | |
68 min, max := points[0], points[0] | |
69 | |
70 for _, v := range points { | |
71 min.Minimize(v) | |
72 max.Maximize(v) | |
73 } | |
74 | |
75 return min, max | |
76 } | |
77 | |
78 func check(err error) { | |
79 if err != nil { | |
80 log.Fatalf("error: %v\n", err) | |
81 } | |
82 } | |
83 | |
84 func main() { | |
85 | |
86 heights, err := octree.ParseClassBreaks(classBreaks) | |
87 check(err) | |
88 | |
89 xyz, err := loadXYZ(os.Stdin) | |
90 check(err) | |
91 | |
92 log.Printf("num vertices: %d\n", len(xyz)) | |
93 | |
94 min, max := minMax(xyz) | |
95 | |
96 log.Printf("(%.2f, %.2f, %.2f) - (%.2f, %.2f, %.2f)\n", | |
97 min.X, min.Y, min.Z, | |
98 max.X, max.Y, max.Z) | |
99 | |
100 heights = octree.ExtrapolateClassBreaks(heights, min.Z, max.Z) | |
101 | |
102 log.Println("classes:") | |
103 for i, v := range heights { | |
104 log.Printf("\t%d: %.3f\n", i+1, v) | |
105 } | |
106 | |
107 tri, err := octree.Triangulate(xyz) | |
108 check(err) | |
109 | |
110 _ = tri | |
111 } |