annotate pkg/octree/triangulation.go @ 3632:943c454d5633 single-beam

Merged default into single-beam branch.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Tue, 11 Jun 2019 14:46:14 +0200
parents 1973fa69b2bb
children cfb4e01f2b7f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2483
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1 // Copyright (C) 2018 Michael Fogleman
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
2 //
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
3 // Permission is hereby granted, free of charge, to any person obtaining
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
4 // a copy of this software and associated documentation files (the "Software"),
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
5 // to deal in the Software without restriction, including without limitation
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
6 // the rights to use, copy, modify, merge, publish, distribute, sublicense,
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
7 // and/or sell copies of the Software, and to permit persons to whom the
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
8 // Software is furnished to do so, subject to the following conditions:
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
9 //
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
10 // The above copyright notice and this permission notice shall be included
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
11 // in all copies or substantial portions of the Software.
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
12 //
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
13 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
14 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
15 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
16 // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
17 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
18 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
19
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
20 package octree
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
21
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
22 import (
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
23 "fmt"
3604
6248a4bc10c7 Moved triangle elimination to triangulation code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2484
diff changeset
24 "log"
2483
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
25 "math"
3621
2893ee8ce06f concave hulls for single beam scans ... WIP.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3609
diff changeset
26 "os"
2893ee8ce06f concave hulls for single beam scans ... WIP.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3609
diff changeset
27
2893ee8ce06f concave hulls for single beam scans ... WIP.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3609
diff changeset
28 svg "github.com/ajstarks/svgo"
2483
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
29 )
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
30
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
31 type Triangulation struct {
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
32 Points []Vertex
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
33 ConvexHull []Vertex
2484
4fa92d468164 Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2483
diff changeset
34 Triangles []int32
4fa92d468164 Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2483
diff changeset
35 Halfedges []int32
2483
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
36 }
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
37
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
38 // Triangulate returns a Delaunay triangulation of the provided points.
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
39 func Triangulate(points []Vertex) (*Triangulation, error) {
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
40 t := newTriangulator(points)
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
41 err := t.triangulate()
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
42 return &Triangulation{points, t.convexHull(), t.triangles, t.halfedges}, err
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
43 }
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
44
3609
e1021fd60190 Removed statistics from elimination of triangles.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3604
diff changeset
45 func (t *Triangulation) ConcaveHull(tooLong float64) []int32 {
3623
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
46 var (
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
47 minX float64 = math.MaxFloat64
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
48 minY float64 = math.MaxFloat64
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
49 maxX float64 = -math.MaxFloat64
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
50 maxY float64 = -math.MaxFloat64
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
51 )
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
52
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
53 linear := func(x1, y1, x2, y2 float64) func(float64) float64 {
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
54 // y1 = x1*m + b
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
55 // y2 = x2*m + b
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
56 // b = y1 - x1*m
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
57 // y1-y2 = (x1-x2)*m
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
58 // m = (y1-y2)/(x1-x2) for x1 != x2
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
59
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
60 if x1 == x2 {
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
61 return func(float64) float64 { return (y1 + y2) * 0.5 }
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
62 }
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
63
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
64 m := (y1 - y2) / (x1 - x2)
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
65 b := y1 - x1*m
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
66
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
67 return func(x float64) float64 { return m*x + b }
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
68 }
3604
6248a4bc10c7 Moved triangle elimination to triangulation code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2484
diff changeset
69
3609
e1021fd60190 Removed statistics from elimination of triangles.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3604
diff changeset
70 tooLong *= tooLong
3604
6248a4bc10c7 Moved triangle elimination to triangulation code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2484
diff changeset
71
3621
2893ee8ce06f concave hulls for single beam scans ... WIP.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3609
diff changeset
72 var candidates []int32
3609
e1021fd60190 Removed statistics from elimination of triangles.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3604
diff changeset
73
e1021fd60190 Removed statistics from elimination of triangles.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3604
diff changeset
74 for i, num := 0, len(t.Triangles)/3; i < num; i++ {
3604
6248a4bc10c7 Moved triangle elimination to triangulation code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2484
diff changeset
75 idx := i * 3
6248a4bc10c7 Moved triangle elimination to triangulation code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2484
diff changeset
76 var max float64
6248a4bc10c7 Moved triangle elimination to triangulation code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2484
diff changeset
77 vs := t.Triangles[idx : idx+3]
6248a4bc10c7 Moved triangle elimination to triangulation code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2484
diff changeset
78 for j, vj := range vs {
6248a4bc10c7 Moved triangle elimination to triangulation code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2484
diff changeset
79 k := (j + 1) % 3
6248a4bc10c7 Moved triangle elimination to triangulation code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2484
diff changeset
80 if l := t.Points[vj].SquaredDistance2D(t.Points[vs[k]]); l > max {
6248a4bc10c7 Moved triangle elimination to triangulation code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2484
diff changeset
81 max = l
6248a4bc10c7 Moved triangle elimination to triangulation code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2484
diff changeset
82 }
6248a4bc10c7 Moved triangle elimination to triangulation code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2484
diff changeset
83 }
3609
e1021fd60190 Removed statistics from elimination of triangles.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3604
diff changeset
84 if max > tooLong {
3621
2893ee8ce06f concave hulls for single beam scans ... WIP.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3609
diff changeset
85 candidates = append(candidates, int32(i))
3609
e1021fd60190 Removed statistics from elimination of triangles.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3604
diff changeset
86 }
3604
6248a4bc10c7 Moved triangle elimination to triangulation code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2484
diff changeset
87 }
6248a4bc10c7 Moved triangle elimination to triangulation code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2484
diff changeset
88
6248a4bc10c7 Moved triangle elimination to triangulation code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2484
diff changeset
89 removed := map[int32]bool{}
6248a4bc10c7 Moved triangle elimination to triangulation code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2484
diff changeset
90
6248a4bc10c7 Moved triangle elimination to triangulation code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2484
diff changeset
91 isBorder := func(n int32) bool {
6248a4bc10c7 Moved triangle elimination to triangulation code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2484
diff changeset
92 n *= 3
6248a4bc10c7 Moved triangle elimination to triangulation code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2484
diff changeset
93 for i := int32(0); i < 3; i++ {
6248a4bc10c7 Moved triangle elimination to triangulation code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2484
diff changeset
94 e := n + i
3621
2893ee8ce06f concave hulls for single beam scans ... WIP.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3609
diff changeset
95 if o := t.Halfedges[e]; o < 0 || removed[o/3] {
3604
6248a4bc10c7 Moved triangle elimination to triangulation code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2484
diff changeset
96 return true
6248a4bc10c7 Moved triangle elimination to triangulation code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2484
diff changeset
97 }
6248a4bc10c7 Moved triangle elimination to triangulation code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2484
diff changeset
98 }
6248a4bc10c7 Moved triangle elimination to triangulation code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2484
diff changeset
99 return false
6248a4bc10c7 Moved triangle elimination to triangulation code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2484
diff changeset
100 }
6248a4bc10c7 Moved triangle elimination to triangulation code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2484
diff changeset
101
3623
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
102 for _, i := range candidates {
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
103 vs := t.Triangles[i*3 : i*3+3]
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
104 for _, vj := range vs {
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
105 p := t.Points[vj]
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
106 minX = math.Min(p.X, minX)
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
107 maxX = math.Max(p.X, maxX)
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
108 minY = math.Min(p.Y, minY)
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
109 maxY = math.Max(p.Y, maxY)
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
110 }
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
111 }
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
112
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
113 xf := linear(minX, 0, maxX, 1500)
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
114 yf := linear(minY, 1500, maxY, 0)
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
115
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
116 f, err := os.Create("/tmp/prehull.svg")
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
117 if err == nil {
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
118 canvas := svg.New(f)
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
119 canvas.Start(1500, 1500)
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
120
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
121 for _, i := range candidates {
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
122 var style string
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
123 if isBorder(i) {
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
124 style = "stroke:red"
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
125 } else {
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
126 style = "stroke:black"
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
127 }
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
128 vs := t.Triangles[i*3 : i*3+3]
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
129 for j, vj := range vs {
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
130 p0 := t.Points[vj]
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
131 p1 := t.Points[vs[(j+1)%3]]
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
132
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
133 x1 := int(math.Floor(xf(p0.X)))
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
134 y1 := int(math.Floor(yf(p0.Y)))
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
135 x2 := int(math.Floor(xf(p1.X)))
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
136 y2 := int(math.Floor(yf(p1.Y)))
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
137 canvas.Line(x1, y1, x2, y2, style)
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
138 }
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
139
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
140 }
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
141 canvas.End()
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
142 f.Close()
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
143 }
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
144
3604
6248a4bc10c7 Moved triangle elimination to triangulation code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2484
diff changeset
145 var newCandidates []int32
6248a4bc10c7 Moved triangle elimination to triangulation code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2484
diff changeset
146
3623
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
147 log.Printf("info: candidates: %d\n", len(candidates))
3621
2893ee8ce06f concave hulls for single beam scans ... WIP.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3609
diff changeset
148 for len(candidates) > 0 {
3604
6248a4bc10c7 Moved triangle elimination to triangulation code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2484
diff changeset
149
6248a4bc10c7 Moved triangle elimination to triangulation code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2484
diff changeset
150 oldRemoved := len(removed)
6248a4bc10c7 Moved triangle elimination to triangulation code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2484
diff changeset
151
3621
2893ee8ce06f concave hulls for single beam scans ... WIP.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3609
diff changeset
152 for _, i := range candidates {
3604
6248a4bc10c7 Moved triangle elimination to triangulation code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2484
diff changeset
153
6248a4bc10c7 Moved triangle elimination to triangulation code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2484
diff changeset
154 if isBorder(i) {
6248a4bc10c7 Moved triangle elimination to triangulation code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2484
diff changeset
155 removed[i] = true
6248a4bc10c7 Moved triangle elimination to triangulation code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2484
diff changeset
156 } else {
6248a4bc10c7 Moved triangle elimination to triangulation code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2484
diff changeset
157 newCandidates = append(newCandidates, i)
6248a4bc10c7 Moved triangle elimination to triangulation code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2484
diff changeset
158 }
6248a4bc10c7 Moved triangle elimination to triangulation code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2484
diff changeset
159 }
6248a4bc10c7 Moved triangle elimination to triangulation code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2484
diff changeset
160
6248a4bc10c7 Moved triangle elimination to triangulation code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2484
diff changeset
161 if oldRemoved == len(removed) {
6248a4bc10c7 Moved triangle elimination to triangulation code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2484
diff changeset
162 break
6248a4bc10c7 Moved triangle elimination to triangulation code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2484
diff changeset
163 }
6248a4bc10c7 Moved triangle elimination to triangulation code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2484
diff changeset
164
3621
2893ee8ce06f concave hulls for single beam scans ... WIP.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3609
diff changeset
165 candidates = newCandidates
3604
6248a4bc10c7 Moved triangle elimination to triangulation code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2484
diff changeset
166 newCandidates = newCandidates[:0]
6248a4bc10c7 Moved triangle elimination to triangulation code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2484
diff changeset
167 }
6248a4bc10c7 Moved triangle elimination to triangulation code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2484
diff changeset
168
3621
2893ee8ce06f concave hulls for single beam scans ... WIP.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3609
diff changeset
169 log.Printf("info: candidates left: %d\n", len(candidates))
2893ee8ce06f concave hulls for single beam scans ... WIP.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3609
diff changeset
170 log.Printf("info: triangles: %d\n", len(t.Triangles)/3)
3604
6248a4bc10c7 Moved triangle elimination to triangulation code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2484
diff changeset
171 log.Printf("info: triangles to remove: %d\n", len(removed))
6248a4bc10c7 Moved triangle elimination to triangulation code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2484
diff changeset
172
3621
2893ee8ce06f concave hulls for single beam scans ... WIP.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3609
diff changeset
173 var edges [][2]int32
2893ee8ce06f concave hulls for single beam scans ... WIP.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3609
diff changeset
174
2893ee8ce06f concave hulls for single beam scans ... WIP.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3609
diff changeset
175 for i, num := int32(0), int32(len(t.Triangles)/3); i < num; i++ {
2893ee8ce06f concave hulls for single beam scans ... WIP.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3609
diff changeset
176 if removed[i] {
2893ee8ce06f concave hulls for single beam scans ... WIP.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3609
diff changeset
177 continue
2893ee8ce06f concave hulls for single beam scans ... WIP.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3609
diff changeset
178 }
2893ee8ce06f concave hulls for single beam scans ... WIP.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3609
diff changeset
179 n := i * 3
2893ee8ce06f concave hulls for single beam scans ... WIP.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3609
diff changeset
180 for j := int32(0); j < 3; j++ {
2893ee8ce06f concave hulls for single beam scans ... WIP.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3609
diff changeset
181 e := n + j
2893ee8ce06f concave hulls for single beam scans ... WIP.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3609
diff changeset
182 if t.Halfedges[e] < 0 || removed[e/3] {
3623
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
183 //if t.Halfedges[e] < 0 {
3621
2893ee8ce06f concave hulls for single beam scans ... WIP.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3609
diff changeset
184 edges = append(edges, [2]int32{
2893ee8ce06f concave hulls for single beam scans ... WIP.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3609
diff changeset
185 t.Triangles[e],
2893ee8ce06f concave hulls for single beam scans ... WIP.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3609
diff changeset
186 t.Triangles[n+(j+1)%3],
2893ee8ce06f concave hulls for single beam scans ... WIP.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3609
diff changeset
187 })
2893ee8ce06f concave hulls for single beam scans ... WIP.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3609
diff changeset
188 }
2893ee8ce06f concave hulls for single beam scans ... WIP.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3609
diff changeset
189 }
2893ee8ce06f concave hulls for single beam scans ... WIP.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3609
diff changeset
190 }
2893ee8ce06f concave hulls for single beam scans ... WIP.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3609
diff changeset
191
2893ee8ce06f concave hulls for single beam scans ... WIP.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3609
diff changeset
192 for i := range edges {
2893ee8ce06f concave hulls for single beam scans ... WIP.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3609
diff changeset
193 fmt.Printf("%d - %d\n", edges[i][0], edges[i][1])
2893ee8ce06f concave hulls for single beam scans ... WIP.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3609
diff changeset
194 }
2893ee8ce06f concave hulls for single beam scans ... WIP.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3609
diff changeset
195
3623
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
196 log.Printf("num vertices: %d\n", len(t.Points))
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
197
3621
2893ee8ce06f concave hulls for single beam scans ... WIP.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3609
diff changeset
198 log.Printf("num of border triangles: %d\n", len(edges))
2893ee8ce06f concave hulls for single beam scans ... WIP.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3609
diff changeset
199 log.Printf("len convex hull: %d\n", len(t.ConvexHull))
2893ee8ce06f concave hulls for single beam scans ... WIP.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3609
diff changeset
200
3623
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
201 f, err = os.Create("/tmp/hull.svg")
3621
2893ee8ce06f concave hulls for single beam scans ... WIP.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3609
diff changeset
202 if err == nil {
2893ee8ce06f concave hulls for single beam scans ... WIP.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3609
diff changeset
203
2893ee8ce06f concave hulls for single beam scans ... WIP.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3609
diff changeset
204 canvas := svg.New(f)
2893ee8ce06f concave hulls for single beam scans ... WIP.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3609
diff changeset
205 canvas.Start(1500, 1500)
2893ee8ce06f concave hulls for single beam scans ... WIP.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3609
diff changeset
206
2893ee8ce06f concave hulls for single beam scans ... WIP.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3609
diff changeset
207 for i := range edges {
2893ee8ce06f concave hulls for single beam scans ... WIP.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3609
diff changeset
208 p0 := t.Points[edges[i][0]]
2893ee8ce06f concave hulls for single beam scans ... WIP.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3609
diff changeset
209 p1 := t.Points[edges[i][1]]
2893ee8ce06f concave hulls for single beam scans ... WIP.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3609
diff changeset
210 x1 := int(math.Floor(xf(p0.X)))
2893ee8ce06f concave hulls for single beam scans ... WIP.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3609
diff changeset
211 y1 := int(math.Floor(yf(p0.Y)))
2893ee8ce06f concave hulls for single beam scans ... WIP.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3609
diff changeset
212 x2 := int(math.Floor(xf(p1.X)))
2893ee8ce06f concave hulls for single beam scans ... WIP.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3609
diff changeset
213 y2 := int(math.Floor(yf(p1.Y)))
2893ee8ce06f concave hulls for single beam scans ... WIP.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3609
diff changeset
214 canvas.Line(x1, y1, x2, y2, "stroke:black")
2893ee8ce06f concave hulls for single beam scans ... WIP.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3609
diff changeset
215 }
2893ee8ce06f concave hulls for single beam scans ... WIP.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3609
diff changeset
216
2893ee8ce06f concave hulls for single beam scans ... WIP.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3609
diff changeset
217 canvas.End()
2893ee8ce06f concave hulls for single beam scans ... WIP.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3609
diff changeset
218 f.Close()
2893ee8ce06f concave hulls for single beam scans ... WIP.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3609
diff changeset
219 }
3623
1973fa69b2bb More SVG debug output.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3621
diff changeset
220 log.Println("after draw")
3604
6248a4bc10c7 Moved triangle elimination to triangulation code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2484
diff changeset
221 return nil
6248a4bc10c7 Moved triangle elimination to triangulation code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2484
diff changeset
222 }
6248a4bc10c7 Moved triangle elimination to triangulation code.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2484
diff changeset
223
2484
4fa92d468164 Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2483
diff changeset
224 func (t *Triangulation) TriangleSlices() [][]int32 {
4fa92d468164 Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2483
diff changeset
225 sl := make([][]int32, len(t.Triangles)/3)
4fa92d468164 Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2483
diff changeset
226 var j int
4fa92d468164 Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2483
diff changeset
227 for i := range sl {
4fa92d468164 Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2483
diff changeset
228 sl[i] = t.Triangles[j : j+3]
4fa92d468164 Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2483
diff changeset
229 j += 3
4fa92d468164 Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2483
diff changeset
230 }
4fa92d468164 Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2483
diff changeset
231 return sl
4fa92d468164 Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2483
diff changeset
232 }
4fa92d468164 Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2483
diff changeset
233
4fa92d468164 Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2483
diff changeset
234 func (t *Triangulation) Tin() *Tin {
4fa92d468164 Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2483
diff changeset
235
4fa92d468164 Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2483
diff changeset
236 min := Vertex{math.MaxFloat64, math.MaxFloat64, math.MaxFloat64}
4fa92d468164 Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2483
diff changeset
237 max := Vertex{-math.MaxFloat64, -math.MaxFloat64, -math.MaxFloat64}
4fa92d468164 Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2483
diff changeset
238
4fa92d468164 Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2483
diff changeset
239 vertices := t.Points
4fa92d468164 Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2483
diff changeset
240
4fa92d468164 Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2483
diff changeset
241 for _, v := range vertices {
4fa92d468164 Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2483
diff changeset
242 min.Minimize(v)
4fa92d468164 Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2483
diff changeset
243 max.Maximize(v)
4fa92d468164 Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2483
diff changeset
244 }
4fa92d468164 Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2483
diff changeset
245
4fa92d468164 Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2483
diff changeset
246 return &Tin{
4fa92d468164 Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2483
diff changeset
247 Vertices: vertices,
4fa92d468164 Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2483
diff changeset
248 Triangles: t.TriangleSlices(),
4fa92d468164 Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2483
diff changeset
249 Min: min,
4fa92d468164 Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2483
diff changeset
250 Max: max,
4fa92d468164 Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2483
diff changeset
251 }
4fa92d468164 Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2483
diff changeset
252 }
4fa92d468164 Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2483
diff changeset
253
2483
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
254 func (t *Triangulation) area() float64 {
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
255 var result float64
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
256 points := t.Points
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
257 ts := t.Triangles
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
258 for i := 0; i < len(ts); i += 3 {
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
259 p0 := points[ts[i+0]]
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
260 p1 := points[ts[i+1]]
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
261 p2 := points[ts[i+2]]
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
262 result += area(p0, p1, p2)
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
263 }
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
264 return result / 2
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
265 }
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
266
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
267 // Validate performs several sanity checks on the Triangulation to check for
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
268 // potential errors. Returns nil if no issues were found. You normally
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
269 // shouldn't need to call this function but it can be useful for debugging.
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
270 func (t *Triangulation) Validate() error {
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
271 // verify halfedges
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
272 for i1, i2 := range t.Halfedges {
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
273 if i1 != -1 && t.Halfedges[i1] != i2 {
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
274 return fmt.Errorf("invalid halfedge connection")
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
275 }
2484
4fa92d468164 Use fogleman's triangulation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2483
diff changeset
276 if i2 != -1 && t.Halfedges[i2] != int32(i1) {
2483
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
277 return fmt.Errorf("invalid halfedge connection")
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
278 }
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
279 }
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
280
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
281 // verify convex hull area vs sum of triangle areas
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
282 hull1 := t.ConvexHull
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
283 hull2 := ConvexHull(t.Points)
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
284 area1 := polygonArea(hull1)
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
285 area2 := polygonArea(hull2)
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
286 area3 := t.area()
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
287 if math.Abs(area1-area2) > 1e-9 || math.Abs(area1-area3) > 1e-9 {
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
288 return fmt.Errorf("hull areas disagree: %f, %f, %f", area1, area2, area3)
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
289 }
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
290
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
291 // verify convex hull perimeter
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
292 perimeter1 := polygonPerimeter(hull1)
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
293 perimeter2 := polygonPerimeter(hull2)
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
294 if math.Abs(perimeter1-perimeter2) > 1e-9 {
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
295 return fmt.Errorf("hull perimeters disagree: %f, %f", perimeter1, perimeter2)
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
296 }
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
297
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
298 return nil
620038ade708 Incorporated fogleman's fast Delaunay triangulation adjuted to our vertex model.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
299 }