Mercurial > gemma
annotate pkg/octree/vertex.go @ 968:a4fe07a21ba7
Moved octree builder into octree package to be reusable by the sounding result import job.
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Wed, 17 Oct 2018 16:00:49 +0200 |
parents | 6ab012d0f0c2 |
children | 7dfd3db94e6d |
rev | line source |
---|---|
727
41c8dc61f38f
Moved octree loading stuff to octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
726
diff
changeset
|
1 package octree |
674
120a82bd9953
octree: Added loading frame for contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
2 |
726
5af9ab39e715
Renamed a few types to uppercase names to prepare the move to the octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
718
diff
changeset
|
3 import ( |
727
41c8dc61f38f
Moved octree loading stuff to octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
726
diff
changeset
|
4 "bytes" |
726
5af9ab39e715
Renamed a few types to uppercase names to prepare the move to the octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
718
diff
changeset
|
5 "encoding/binary" |
5af9ab39e715
Renamed a few types to uppercase names to prepare the move to the octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
718
diff
changeset
|
6 "io" |
795
bd5f38eb6153
Vertical Triangle intersection: Fixed function to determine where intersection point
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
792
diff
changeset
|
7 "log" |
726
5af9ab39e715
Renamed a few types to uppercase names to prepare the move to the octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
718
diff
changeset
|
8 "math" |
768
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
9 "sort" |
726
5af9ab39e715
Renamed a few types to uppercase names to prepare the move to the octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
718
diff
changeset
|
10 ) |
674
120a82bd9953
octree: Added loading frame for contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
11 |
726
5af9ab39e715
Renamed a few types to uppercase names to prepare the move to the octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
718
diff
changeset
|
12 type ( |
5af9ab39e715
Renamed a few types to uppercase names to prepare the move to the octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
718
diff
changeset
|
13 Vertex struct { |
727
41c8dc61f38f
Moved octree loading stuff to octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
726
diff
changeset
|
14 X float64 |
41c8dc61f38f
Moved octree loading stuff to octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
726
diff
changeset
|
15 Y float64 |
41c8dc61f38f
Moved octree loading stuff to octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
726
diff
changeset
|
16 Z float64 |
726
5af9ab39e715
Renamed a few types to uppercase names to prepare the move to the octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
718
diff
changeset
|
17 } |
5af9ab39e715
Renamed a few types to uppercase names to prepare the move to the octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
718
diff
changeset
|
18 |
5af9ab39e715
Renamed a few types to uppercase names to prepare the move to the octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
718
diff
changeset
|
19 Triangle [3]Vertex |
5af9ab39e715
Renamed a few types to uppercase names to prepare the move to the octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
718
diff
changeset
|
20 |
5af9ab39e715
Renamed a few types to uppercase names to prepare the move to the octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
718
diff
changeset
|
21 Line [2]Vertex |
5af9ab39e715
Renamed a few types to uppercase names to prepare the move to the octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
718
diff
changeset
|
22 |
959
6ab012d0f0c2
Started with writing an importer job for sounding results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
940
diff
changeset
|
23 MultiPointZ []Vertex |
726
5af9ab39e715
Renamed a few types to uppercase names to prepare the move to the octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
718
diff
changeset
|
24 LineStringZ []Vertex |
5af9ab39e715
Renamed a few types to uppercase names to prepare the move to the octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
718
diff
changeset
|
25 MultiLineStringZ []LineStringZ |
774
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
26 |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
27 Box2D struct { |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
28 X1 float64 |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
29 Y1 float64 |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
30 X2 float64 |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
31 Y2 float64 |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
32 } |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
33 |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
34 Plane2D struct { |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
35 A float64 |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
36 B float64 |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
37 C float64 |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
38 } |
726
5af9ab39e715
Renamed a few types to uppercase names to prepare the move to the octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
718
diff
changeset
|
39 ) |
5af9ab39e715
Renamed a few types to uppercase names to prepare the move to the octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
718
diff
changeset
|
40 |
5af9ab39e715
Renamed a few types to uppercase names to prepare the move to the octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
718
diff
changeset
|
41 func (v *Vertex) Minimize(w Vertex) { |
727
41c8dc61f38f
Moved octree loading stuff to octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
726
diff
changeset
|
42 if w.X < v.X { |
41c8dc61f38f
Moved octree loading stuff to octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
726
diff
changeset
|
43 v.X = w.X |
674
120a82bd9953
octree: Added loading frame for contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
44 } |
727
41c8dc61f38f
Moved octree loading stuff to octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
726
diff
changeset
|
45 if w.Y < v.Y { |
41c8dc61f38f
Moved octree loading stuff to octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
726
diff
changeset
|
46 v.Y = w.Y |
674
120a82bd9953
octree: Added loading frame for contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
47 } |
727
41c8dc61f38f
Moved octree loading stuff to octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
726
diff
changeset
|
48 if w.Z < v.Z { |
41c8dc61f38f
Moved octree loading stuff to octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
726
diff
changeset
|
49 v.Z = w.Z |
674
120a82bd9953
octree: Added loading frame for contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
50 } |
120a82bd9953
octree: Added loading frame for contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
51 } |
120a82bd9953
octree: Added loading frame for contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
52 |
726
5af9ab39e715
Renamed a few types to uppercase names to prepare the move to the octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
718
diff
changeset
|
53 func (v *Vertex) Maximize(w Vertex) { |
727
41c8dc61f38f
Moved octree loading stuff to octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
726
diff
changeset
|
54 if w.X > v.X { |
41c8dc61f38f
Moved octree loading stuff to octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
726
diff
changeset
|
55 v.X = w.X |
674
120a82bd9953
octree: Added loading frame for contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
56 } |
727
41c8dc61f38f
Moved octree loading stuff to octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
726
diff
changeset
|
57 if w.Y > v.Y { |
41c8dc61f38f
Moved octree loading stuff to octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
726
diff
changeset
|
58 v.Y = w.Y |
674
120a82bd9953
octree: Added loading frame for contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
59 } |
727
41c8dc61f38f
Moved octree loading stuff to octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
726
diff
changeset
|
60 if w.Z > v.Z { |
41c8dc61f38f
Moved octree loading stuff to octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
726
diff
changeset
|
61 v.Z = w.Z |
674
120a82bd9953
octree: Added loading frame for contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
62 } |
120a82bd9953
octree: Added loading frame for contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
63 } |
120a82bd9953
octree: Added loading frame for contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
64 |
726
5af9ab39e715
Renamed a few types to uppercase names to prepare the move to the octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
718
diff
changeset
|
65 func (v Vertex) Sub(w Vertex) Vertex { |
5af9ab39e715
Renamed a few types to uppercase names to prepare the move to the octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
718
diff
changeset
|
66 return Vertex{ |
727
41c8dc61f38f
Moved octree loading stuff to octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
726
diff
changeset
|
67 v.X - w.X, |
41c8dc61f38f
Moved octree loading stuff to octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
726
diff
changeset
|
68 v.Y - w.Y, |
41c8dc61f38f
Moved octree loading stuff to octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
726
diff
changeset
|
69 v.Z - w.Z, |
674
120a82bd9953
octree: Added loading frame for contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
70 } |
120a82bd9953
octree: Added loading frame for contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
71 } |
120a82bd9953
octree: Added loading frame for contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
72 |
726
5af9ab39e715
Renamed a few types to uppercase names to prepare the move to the octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
718
diff
changeset
|
73 func (v Vertex) Add(w Vertex) Vertex { |
5af9ab39e715
Renamed a few types to uppercase names to prepare the move to the octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
718
diff
changeset
|
74 return Vertex{ |
727
41c8dc61f38f
Moved octree loading stuff to octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
726
diff
changeset
|
75 v.X + w.X, |
41c8dc61f38f
Moved octree loading stuff to octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
726
diff
changeset
|
76 v.Y + w.Y, |
41c8dc61f38f
Moved octree loading stuff to octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
726
diff
changeset
|
77 v.Z + w.Z, |
687
be90ab542aa7
octree: contouring: Do the math to calculate the intersection points of the triangles and the planes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
674
diff
changeset
|
78 } |
be90ab542aa7
octree: contouring: Do the math to calculate the intersection points of the triangles and the planes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
674
diff
changeset
|
79 } |
be90ab542aa7
octree: contouring: Do the math to calculate the intersection points of the triangles and the planes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
674
diff
changeset
|
80 |
730
4c05bdbf8e4b
Renamed scale in Vertex to uppercase to make it public.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
729
diff
changeset
|
81 func (v Vertex) Scale(s float64) Vertex { |
726
5af9ab39e715
Renamed a few types to uppercase names to prepare the move to the octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
718
diff
changeset
|
82 return Vertex{ |
727
41c8dc61f38f
Moved octree loading stuff to octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
726
diff
changeset
|
83 s * v.X, |
41c8dc61f38f
Moved octree loading stuff to octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
726
diff
changeset
|
84 s * v.Y, |
41c8dc61f38f
Moved octree loading stuff to octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
726
diff
changeset
|
85 s * v.Z, |
687
be90ab542aa7
octree: contouring: Do the math to calculate the intersection points of the triangles and the planes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
674
diff
changeset
|
86 } |
be90ab542aa7
octree: contouring: Do the math to calculate the intersection points of the triangles and the planes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
674
diff
changeset
|
87 } |
be90ab542aa7
octree: contouring: Do the math to calculate the intersection points of the triangles and the planes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
674
diff
changeset
|
88 |
726
5af9ab39e715
Renamed a few types to uppercase names to prepare the move to the octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
718
diff
changeset
|
89 func Interpolate(v1, v2 Vertex) func(Vertex) Vertex { |
5af9ab39e715
Renamed a few types to uppercase names to prepare the move to the octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
718
diff
changeset
|
90 v2 = v2.Sub(v1) |
5af9ab39e715
Renamed a few types to uppercase names to prepare the move to the octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
718
diff
changeset
|
91 return func(s Vertex) Vertex { |
5af9ab39e715
Renamed a few types to uppercase names to prepare the move to the octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
718
diff
changeset
|
92 return Vertex{ |
727
41c8dc61f38f
Moved octree loading stuff to octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
726
diff
changeset
|
93 v2.X*s.X + v1.X, |
41c8dc61f38f
Moved octree loading stuff to octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
726
diff
changeset
|
94 v2.Y*s.Y + v1.Y, |
41c8dc61f38f
Moved octree loading stuff to octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
726
diff
changeset
|
95 v2.Z*s.Z + v1.Z, |
674
120a82bd9953
octree: Added loading frame for contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
96 } |
120a82bd9953
octree: Added loading frame for contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
97 } |
120a82bd9953
octree: Added loading frame for contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
98 } |
120a82bd9953
octree: Added loading frame for contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
99 |
726
5af9ab39e715
Renamed a few types to uppercase names to prepare the move to the octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
718
diff
changeset
|
100 func (a Vertex) Less(b Vertex) bool { |
727
41c8dc61f38f
Moved octree loading stuff to octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
726
diff
changeset
|
101 return a.X < b.X || a.Y < b.Y || a.Z < b.Z |
674
120a82bd9953
octree: Added loading frame for contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
102 } |
687
be90ab542aa7
octree: contouring: Do the math to calculate the intersection points of the triangles and the planes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
674
diff
changeset
|
103 |
726
5af9ab39e715
Renamed a few types to uppercase names to prepare the move to the octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
718
diff
changeset
|
104 func NewLine(p1, p2 Vertex) Line { |
5af9ab39e715
Renamed a few types to uppercase names to prepare the move to the octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
718
diff
changeset
|
105 return Line{ |
5af9ab39e715
Renamed a few types to uppercase names to prepare the move to the octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
718
diff
changeset
|
106 p2.Sub(p1), |
687
be90ab542aa7
octree: contouring: Do the math to calculate the intersection points of the triangles and the planes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
674
diff
changeset
|
107 p1, |
be90ab542aa7
octree: contouring: Do the math to calculate the intersection points of the triangles and the planes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
674
diff
changeset
|
108 } |
be90ab542aa7
octree: contouring: Do the math to calculate the intersection points of the triangles and the planes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
674
diff
changeset
|
109 } |
be90ab542aa7
octree: contouring: Do the math to calculate the intersection points of the triangles and the planes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
674
diff
changeset
|
110 |
726
5af9ab39e715
Renamed a few types to uppercase names to prepare the move to the octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
718
diff
changeset
|
111 func (l Line) Eval(t float64) Vertex { |
730
4c05bdbf8e4b
Renamed scale in Vertex to uppercase to make it public.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
729
diff
changeset
|
112 return l[0].Scale(t).Add(l[1]) |
687
be90ab542aa7
octree: contouring: Do the math to calculate the intersection points of the triangles and the planes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
674
diff
changeset
|
113 } |
be90ab542aa7
octree: contouring: Do the math to calculate the intersection points of the triangles and the planes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
674
diff
changeset
|
114 |
726
5af9ab39e715
Renamed a few types to uppercase names to prepare the move to the octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
718
diff
changeset
|
115 func (l Line) IntersectHorizontal(h float64) Vertex { |
727
41c8dc61f38f
Moved octree loading stuff to octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
726
diff
changeset
|
116 t := (h - l[1].Z) / l[0].Z |
726
5af9ab39e715
Renamed a few types to uppercase names to prepare the move to the octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
718
diff
changeset
|
117 return l.Eval(t) |
687
be90ab542aa7
octree: contouring: Do the math to calculate the intersection points of the triangles and the planes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
674
diff
changeset
|
118 } |
be90ab542aa7
octree: contouring: Do the math to calculate the intersection points of the triangles and the planes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
674
diff
changeset
|
119 |
be90ab542aa7
octree: contouring: Do the math to calculate the intersection points of the triangles and the planes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
674
diff
changeset
|
120 func side(z, h float64) int { |
be90ab542aa7
octree: contouring: Do the math to calculate the intersection points of the triangles and the planes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
674
diff
changeset
|
121 switch { |
be90ab542aa7
octree: contouring: Do the math to calculate the intersection points of the triangles and the planes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
674
diff
changeset
|
122 case z < h: |
be90ab542aa7
octree: contouring: Do the math to calculate the intersection points of the triangles and the planes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
674
diff
changeset
|
123 return -1 |
be90ab542aa7
octree: contouring: Do the math to calculate the intersection points of the triangles and the planes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
674
diff
changeset
|
124 case z > h: |
be90ab542aa7
octree: contouring: Do the math to calculate the intersection points of the triangles and the planes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
674
diff
changeset
|
125 return +1 |
be90ab542aa7
octree: contouring: Do the math to calculate the intersection points of the triangles and the planes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
674
diff
changeset
|
126 } |
be90ab542aa7
octree: contouring: Do the math to calculate the intersection points of the triangles and the planes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
674
diff
changeset
|
127 return 0 |
be90ab542aa7
octree: contouring: Do the math to calculate the intersection points of the triangles and the planes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
674
diff
changeset
|
128 } |
be90ab542aa7
octree: contouring: Do the math to calculate the intersection points of the triangles and the planes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
674
diff
changeset
|
129 |
726
5af9ab39e715
Renamed a few types to uppercase names to prepare the move to the octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
718
diff
changeset
|
130 func (t *Triangle) IntersectHorizontal(h float64) LineStringZ { |
687
be90ab542aa7
octree: contouring: Do the math to calculate the intersection points of the triangles and the planes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
674
diff
changeset
|
131 sides := [3]int{ |
727
41c8dc61f38f
Moved octree loading stuff to octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
726
diff
changeset
|
132 side(t[0].Z, h), |
41c8dc61f38f
Moved octree loading stuff to octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
726
diff
changeset
|
133 side(t[1].Z, h), |
41c8dc61f38f
Moved octree loading stuff to octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
726
diff
changeset
|
134 side(t[2].Z, h), |
687
be90ab542aa7
octree: contouring: Do the math to calculate the intersection points of the triangles and the planes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
674
diff
changeset
|
135 } |
be90ab542aa7
octree: contouring: Do the math to calculate the intersection points of the triangles and the planes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
674
diff
changeset
|
136 |
726
5af9ab39e715
Renamed a few types to uppercase names to prepare the move to the octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
718
diff
changeset
|
137 var points LineStringZ |
689
614135d69823
octree: prepare storing the lines to file in contouring tool.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
687
diff
changeset
|
138 |
687
be90ab542aa7
octree: contouring: Do the math to calculate the intersection points of the triangles and the planes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
674
diff
changeset
|
139 for i := 0; i < 3; i++ { |
be90ab542aa7
octree: contouring: Do the math to calculate the intersection points of the triangles and the planes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
674
diff
changeset
|
140 j := (i + 1) % 3 |
be90ab542aa7
octree: contouring: Do the math to calculate the intersection points of the triangles and the planes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
674
diff
changeset
|
141 si := sides[i] |
be90ab542aa7
octree: contouring: Do the math to calculate the intersection points of the triangles and the planes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
674
diff
changeset
|
142 sj := sides[j] |
be90ab542aa7
octree: contouring: Do the math to calculate the intersection points of the triangles and the planes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
674
diff
changeset
|
143 |
be90ab542aa7
octree: contouring: Do the math to calculate the intersection points of the triangles and the planes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
674
diff
changeset
|
144 switch { |
be90ab542aa7
octree: contouring: Do the math to calculate the intersection points of the triangles and the planes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
674
diff
changeset
|
145 case si == 0 && sj == 0: |
be90ab542aa7
octree: contouring: Do the math to calculate the intersection points of the triangles and the planes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
674
diff
changeset
|
146 // both on plane |
be90ab542aa7
octree: contouring: Do the math to calculate the intersection points of the triangles and the planes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
674
diff
changeset
|
147 points = append(points, t[i], t[j]) |
be90ab542aa7
octree: contouring: Do the math to calculate the intersection points of the triangles and the planes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
674
diff
changeset
|
148 case si == 0 && sj != 0: |
be90ab542aa7
octree: contouring: Do the math to calculate the intersection points of the triangles and the planes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
674
diff
changeset
|
149 // first on plane |
be90ab542aa7
octree: contouring: Do the math to calculate the intersection points of the triangles and the planes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
674
diff
changeset
|
150 points = append(points, t[i]) |
be90ab542aa7
octree: contouring: Do the math to calculate the intersection points of the triangles and the planes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
674
diff
changeset
|
151 case si != 0 && sj == 0: |
be90ab542aa7
octree: contouring: Do the math to calculate the intersection points of the triangles and the planes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
674
diff
changeset
|
152 // second on plane |
be90ab542aa7
octree: contouring: Do the math to calculate the intersection points of the triangles and the planes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
674
diff
changeset
|
153 points = append(points, t[j]) |
be90ab542aa7
octree: contouring: Do the math to calculate the intersection points of the triangles and the planes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
674
diff
changeset
|
154 case si == sj: |
be90ab542aa7
octree: contouring: Do the math to calculate the intersection points of the triangles and the planes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
674
diff
changeset
|
155 // both on same side |
be90ab542aa7
octree: contouring: Do the math to calculate the intersection points of the triangles and the planes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
674
diff
changeset
|
156 default: |
be90ab542aa7
octree: contouring: Do the math to calculate the intersection points of the triangles and the planes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
674
diff
changeset
|
157 // real intersection |
726
5af9ab39e715
Renamed a few types to uppercase names to prepare the move to the octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
718
diff
changeset
|
158 v := NewLine(t[i], t[j]).IntersectHorizontal(h) |
687
be90ab542aa7
octree: contouring: Do the math to calculate the intersection points of the triangles and the planes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
674
diff
changeset
|
159 points = append(points, v) |
be90ab542aa7
octree: contouring: Do the math to calculate the intersection points of the triangles and the planes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
674
diff
changeset
|
160 } |
be90ab542aa7
octree: contouring: Do the math to calculate the intersection points of the triangles and the planes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
674
diff
changeset
|
161 } |
be90ab542aa7
octree: contouring: Do the math to calculate the intersection points of the triangles and the planes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
674
diff
changeset
|
162 |
be90ab542aa7
octree: contouring: Do the math to calculate the intersection points of the triangles and the planes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
674
diff
changeset
|
163 return points |
be90ab542aa7
octree: contouring: Do the math to calculate the intersection points of the triangles and the planes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
674
diff
changeset
|
164 } |
726
5af9ab39e715
Renamed a few types to uppercase names to prepare the move to the octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
718
diff
changeset
|
165 |
768
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
166 func linearScale(x1, y1, x2, y2 float64) func(Vertex) float64 { |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
167 dx := x2 - x1 |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
168 dy := y2 - y1 |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
169 |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
170 switch { |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
171 case dx != 0: |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
172 return func(v Vertex) float64 { |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
173 return (v.X - x1) / dx |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
174 } |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
175 case dy != 0: |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
176 return func(v Vertex) float64 { |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
177 return (v.Y - y1) / dy |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
178 } |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
179 default: |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
180 return func(Vertex) float64 { |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
181 return 0 |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
182 } |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
183 } |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
184 } |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
185 |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
186 func (ls LineStringZ) order(position func(Vertex) float64) { |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
187 type posVertex struct { |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
188 pos float64 |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
189 v Vertex |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
190 } |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
191 positions := make([]posVertex, len(ls)) |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
192 for i, v := range ls { |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
193 positions[i] = posVertex{position(v), v} |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
194 } |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
195 sort.Slice(positions, func(i, j int) bool { |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
196 return positions[i].pos < positions[j].pos |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
197 }) |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
198 for i := range positions { |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
199 ls[i] = positions[i].v |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
200 } |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
201 } |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
202 |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
203 func (v Vertex) EpsEquals(w Vertex) bool { |
769
ba2007b746ef
Fixed nasty typo.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
768
diff
changeset
|
204 const eps = 1e-5 |
768
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
205 return math.Abs(v.X-w.X) < eps && |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
206 math.Abs(v.Y-w.Y) < eps && math.Abs(v.Z-w.Z) < eps |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
207 } |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
208 |
763
d05bc3e34338
More infrastructure for the octree driven cross section endpoint.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
730
diff
changeset
|
209 func (mls MultiLineStringZ) JoinOnLine(x1, y1, x2, y2 float64) MultiLineStringZ { |
768
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
210 |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
211 position := linearScale(x1, y1, x2, y2) |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
212 |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
213 type posLineString struct { |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
214 pos float64 |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
215 line LineStringZ |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
216 } |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
217 |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
218 positions := make([]posLineString, 0, len(mls)) |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
219 |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
220 for _, ls := range mls { |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
221 if len(ls) == 0 { |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
222 continue |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
223 } |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
224 // order the atoms first |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
225 ls.order(position) |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
226 positions = append(positions, posLineString{position(ls[0]), ls}) |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
227 } |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
228 |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
229 sort.Slice(positions, func(i, j int) bool { |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
230 return positions[i].pos < positions[j].pos |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
231 }) |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
232 |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
233 out := make(MultiLineStringZ, 0, len(positions)) |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
234 |
796
0cc97135717c
More fixes to vertical triangle intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
795
diff
changeset
|
235 var ignored int |
0cc97135717c
More fixes to vertical triangle intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
795
diff
changeset
|
236 |
768
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
237 for i := range positions { |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
238 curr := positions[i].line |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
239 if l := len(out); l > 0 { |
796
0cc97135717c
More fixes to vertical triangle intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
795
diff
changeset
|
240 last := out[l-1] |
0cc97135717c
More fixes to vertical triangle intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
795
diff
changeset
|
241 |
0cc97135717c
More fixes to vertical triangle intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
795
diff
changeset
|
242 if last[len(last)-1].EpsEquals(curr[0]) { |
768
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
243 out[l-1] = append(last[:len(last)-1], curr...) |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
244 continue |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
245 } |
796
0cc97135717c
More fixes to vertical triangle intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
795
diff
changeset
|
246 if position(last[len(last)-1]) > position(curr[0]) { |
0cc97135717c
More fixes to vertical triangle intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
795
diff
changeset
|
247 ignored++ |
0cc97135717c
More fixes to vertical triangle intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
795
diff
changeset
|
248 continue |
0cc97135717c
More fixes to vertical triangle intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
795
diff
changeset
|
249 } |
768
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
250 } |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
251 out = append(out, curr) |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
252 } |
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
253 |
796
0cc97135717c
More fixes to vertical triangle intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
795
diff
changeset
|
254 log.Printf("ignored parts: %d\n", ignored) |
0cc97135717c
More fixes to vertical triangle intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
795
diff
changeset
|
255 |
768
3219e7e34953
Join neighbored linestring segments in octree cross sections and sort them along the input line.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
763
diff
changeset
|
256 return out |
763
d05bc3e34338
More infrastructure for the octree driven cross section endpoint.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
730
diff
changeset
|
257 } |
d05bc3e34338
More infrastructure for the octree driven cross section endpoint.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
730
diff
changeset
|
258 |
729
b0bd242ff821
Removed vertex duplicate.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
727
diff
changeset
|
259 func (v *Vertex) Write(w io.Writer) error { |
b0bd242ff821
Removed vertex duplicate.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
727
diff
changeset
|
260 if err := binary.Write( |
b0bd242ff821
Removed vertex duplicate.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
727
diff
changeset
|
261 w, binary.LittleEndian, math.Float64bits(v.X)); err != nil { |
b0bd242ff821
Removed vertex duplicate.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
727
diff
changeset
|
262 return err |
b0bd242ff821
Removed vertex duplicate.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
727
diff
changeset
|
263 } |
b0bd242ff821
Removed vertex duplicate.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
727
diff
changeset
|
264 if err := binary.Write( |
b0bd242ff821
Removed vertex duplicate.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
727
diff
changeset
|
265 w, binary.LittleEndian, math.Float64bits(v.Y)); err != nil { |
b0bd242ff821
Removed vertex duplicate.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
727
diff
changeset
|
266 return err |
b0bd242ff821
Removed vertex duplicate.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
727
diff
changeset
|
267 } |
b0bd242ff821
Removed vertex duplicate.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
727
diff
changeset
|
268 return binary.Write( |
b0bd242ff821
Removed vertex duplicate.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
727
diff
changeset
|
269 w, binary.LittleEndian, math.Float64bits(v.Z)) |
b0bd242ff821
Removed vertex duplicate.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
727
diff
changeset
|
270 } |
b0bd242ff821
Removed vertex duplicate.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
727
diff
changeset
|
271 |
b0bd242ff821
Removed vertex duplicate.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
727
diff
changeset
|
272 func (v *Vertex) Read(r io.Reader) error { |
726
5af9ab39e715
Renamed a few types to uppercase names to prepare the move to the octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
718
diff
changeset
|
273 var buf [8]byte |
5af9ab39e715
Renamed a few types to uppercase names to prepare the move to the octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
718
diff
changeset
|
274 b := buf[:] |
5af9ab39e715
Renamed a few types to uppercase names to prepare the move to the octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
718
diff
changeset
|
275 if _, err := io.ReadFull(r, b); err != nil { |
5af9ab39e715
Renamed a few types to uppercase names to prepare the move to the octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
718
diff
changeset
|
276 return nil |
5af9ab39e715
Renamed a few types to uppercase names to prepare the move to the octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
718
diff
changeset
|
277 } |
727
41c8dc61f38f
Moved octree loading stuff to octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
726
diff
changeset
|
278 v.X = math.Float64frombits(binary.LittleEndian.Uint64(b)) |
41c8dc61f38f
Moved octree loading stuff to octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
726
diff
changeset
|
279 if _, err := io.ReadFull(r, b); err != nil { |
41c8dc61f38f
Moved octree loading stuff to octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
726
diff
changeset
|
280 return nil |
41c8dc61f38f
Moved octree loading stuff to octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
726
diff
changeset
|
281 } |
41c8dc61f38f
Moved octree loading stuff to octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
726
diff
changeset
|
282 v.Y = math.Float64frombits(binary.LittleEndian.Uint64(b)) |
726
5af9ab39e715
Renamed a few types to uppercase names to prepare the move to the octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
718
diff
changeset
|
283 if _, err := io.ReadFull(r, b); err != nil { |
5af9ab39e715
Renamed a few types to uppercase names to prepare the move to the octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
718
diff
changeset
|
284 return nil |
5af9ab39e715
Renamed a few types to uppercase names to prepare the move to the octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
718
diff
changeset
|
285 } |
727
41c8dc61f38f
Moved octree loading stuff to octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
726
diff
changeset
|
286 v.Z = math.Float64frombits(binary.LittleEndian.Uint64(b)) |
726
5af9ab39e715
Renamed a few types to uppercase names to prepare the move to the octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
718
diff
changeset
|
287 return nil |
5af9ab39e715
Renamed a few types to uppercase names to prepare the move to the octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
718
diff
changeset
|
288 } |
727
41c8dc61f38f
Moved octree loading stuff to octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
726
diff
changeset
|
289 |
41c8dc61f38f
Moved octree loading stuff to octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
726
diff
changeset
|
290 func (mls MultiLineStringZ) AsWKB() []byte { |
41c8dc61f38f
Moved octree loading stuff to octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
726
diff
changeset
|
291 |
924
c8146132059e
Precalculate WKB size for MultiLineStringZ to avoid reallocations.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
824
diff
changeset
|
292 // pre-calculate size to avoid reallocations. |
c8146132059e
Precalculate WKB size for MultiLineStringZ to avoid reallocations.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
824
diff
changeset
|
293 size := 1 + 4 + 4 |
c8146132059e
Precalculate WKB size for MultiLineStringZ to avoid reallocations.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
824
diff
changeset
|
294 for _, ml := range mls { |
c8146132059e
Precalculate WKB size for MultiLineStringZ to avoid reallocations.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
824
diff
changeset
|
295 size += 1 + 4 + 4 + len(ml)*3*8 |
c8146132059e
Precalculate WKB size for MultiLineStringZ to avoid reallocations.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
824
diff
changeset
|
296 } |
727
41c8dc61f38f
Moved octree loading stuff to octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
726
diff
changeset
|
297 |
924
c8146132059e
Precalculate WKB size for MultiLineStringZ to avoid reallocations.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
824
diff
changeset
|
298 buf := bytes.NewBuffer(make([]byte, 0, size)) |
c8146132059e
Precalculate WKB size for MultiLineStringZ to avoid reallocations.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
824
diff
changeset
|
299 |
c8146132059e
Precalculate WKB size for MultiLineStringZ to avoid reallocations.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
824
diff
changeset
|
300 binary.Write(buf, binary.LittleEndian, wkbNDR) |
c8146132059e
Precalculate WKB size for MultiLineStringZ to avoid reallocations.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
824
diff
changeset
|
301 binary.Write(buf, binary.LittleEndian, wkbMultiLineStringZ) |
c8146132059e
Precalculate WKB size for MultiLineStringZ to avoid reallocations.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
824
diff
changeset
|
302 binary.Write(buf, binary.LittleEndian, uint32(len(mls))) |
727
41c8dc61f38f
Moved octree loading stuff to octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
726
diff
changeset
|
303 |
41c8dc61f38f
Moved octree loading stuff to octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
726
diff
changeset
|
304 for _, ml := range mls { |
924
c8146132059e
Precalculate WKB size for MultiLineStringZ to avoid reallocations.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
824
diff
changeset
|
305 binary.Write(buf, binary.LittleEndian, wkbNDR) |
c8146132059e
Precalculate WKB size for MultiLineStringZ to avoid reallocations.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
824
diff
changeset
|
306 binary.Write(buf, binary.LittleEndian, wkbLineStringZ) |
c8146132059e
Precalculate WKB size for MultiLineStringZ to avoid reallocations.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
824
diff
changeset
|
307 binary.Write(buf, binary.LittleEndian, uint32(len(ml))) |
727
41c8dc61f38f
Moved octree loading stuff to octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
726
diff
changeset
|
308 for _, p := range ml { |
924
c8146132059e
Precalculate WKB size for MultiLineStringZ to avoid reallocations.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
824
diff
changeset
|
309 binary.Write(buf, binary.LittleEndian, math.Float64bits(p.X)) |
c8146132059e
Precalculate WKB size for MultiLineStringZ to avoid reallocations.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
824
diff
changeset
|
310 binary.Write(buf, binary.LittleEndian, math.Float64bits(p.Y)) |
c8146132059e
Precalculate WKB size for MultiLineStringZ to avoid reallocations.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
824
diff
changeset
|
311 binary.Write(buf, binary.LittleEndian, math.Float64bits(p.Z)) |
727
41c8dc61f38f
Moved octree loading stuff to octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
726
diff
changeset
|
312 } |
41c8dc61f38f
Moved octree loading stuff to octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
726
diff
changeset
|
313 } |
41c8dc61f38f
Moved octree loading stuff to octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
726
diff
changeset
|
314 |
41c8dc61f38f
Moved octree loading stuff to octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
726
diff
changeset
|
315 return buf.Bytes() |
41c8dc61f38f
Moved octree loading stuff to octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
726
diff
changeset
|
316 } |
774
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
317 |
925
15bf101e1522
Send 2D X/Y vertices to the database directly instead of sending 3D data and dropping the Z value afterwards.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
924
diff
changeset
|
318 func (mls MultiLineStringZ) AsWKB2D() []byte { |
15bf101e1522
Send 2D X/Y vertices to the database directly instead of sending 3D data and dropping the Z value afterwards.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
924
diff
changeset
|
319 |
15bf101e1522
Send 2D X/Y vertices to the database directly instead of sending 3D data and dropping the Z value afterwards.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
924
diff
changeset
|
320 // pre-calculate size to avoid reallocations. |
15bf101e1522
Send 2D X/Y vertices to the database directly instead of sending 3D data and dropping the Z value afterwards.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
924
diff
changeset
|
321 size := 1 + 4 + 4 |
15bf101e1522
Send 2D X/Y vertices to the database directly instead of sending 3D data and dropping the Z value afterwards.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
924
diff
changeset
|
322 for _, ml := range mls { |
15bf101e1522
Send 2D X/Y vertices to the database directly instead of sending 3D data and dropping the Z value afterwards.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
924
diff
changeset
|
323 size += 1 + 4 + 4 + len(ml)*2*8 |
15bf101e1522
Send 2D X/Y vertices to the database directly instead of sending 3D data and dropping the Z value afterwards.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
924
diff
changeset
|
324 } |
15bf101e1522
Send 2D X/Y vertices to the database directly instead of sending 3D data and dropping the Z value afterwards.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
924
diff
changeset
|
325 |
15bf101e1522
Send 2D X/Y vertices to the database directly instead of sending 3D data and dropping the Z value afterwards.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
924
diff
changeset
|
326 buf := bytes.NewBuffer(make([]byte, 0, size)) |
15bf101e1522
Send 2D X/Y vertices to the database directly instead of sending 3D data and dropping the Z value afterwards.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
924
diff
changeset
|
327 |
15bf101e1522
Send 2D X/Y vertices to the database directly instead of sending 3D data and dropping the Z value afterwards.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
924
diff
changeset
|
328 binary.Write(buf, binary.LittleEndian, wkbNDR) |
15bf101e1522
Send 2D X/Y vertices to the database directly instead of sending 3D data and dropping the Z value afterwards.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
924
diff
changeset
|
329 binary.Write(buf, binary.LittleEndian, wkbMultiLineString) |
15bf101e1522
Send 2D X/Y vertices to the database directly instead of sending 3D data and dropping the Z value afterwards.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
924
diff
changeset
|
330 binary.Write(buf, binary.LittleEndian, uint32(len(mls))) |
15bf101e1522
Send 2D X/Y vertices to the database directly instead of sending 3D data and dropping the Z value afterwards.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
924
diff
changeset
|
331 |
15bf101e1522
Send 2D X/Y vertices to the database directly instead of sending 3D data and dropping the Z value afterwards.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
924
diff
changeset
|
332 for _, ml := range mls { |
15bf101e1522
Send 2D X/Y vertices to the database directly instead of sending 3D data and dropping the Z value afterwards.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
924
diff
changeset
|
333 binary.Write(buf, binary.LittleEndian, wkbNDR) |
15bf101e1522
Send 2D X/Y vertices to the database directly instead of sending 3D data and dropping the Z value afterwards.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
924
diff
changeset
|
334 binary.Write(buf, binary.LittleEndian, wkbLineString) |
15bf101e1522
Send 2D X/Y vertices to the database directly instead of sending 3D data and dropping the Z value afterwards.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
924
diff
changeset
|
335 binary.Write(buf, binary.LittleEndian, uint32(len(ml))) |
15bf101e1522
Send 2D X/Y vertices to the database directly instead of sending 3D data and dropping the Z value afterwards.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
924
diff
changeset
|
336 for _, p := range ml { |
15bf101e1522
Send 2D X/Y vertices to the database directly instead of sending 3D data and dropping the Z value afterwards.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
924
diff
changeset
|
337 binary.Write(buf, binary.LittleEndian, math.Float64bits(p.X)) |
15bf101e1522
Send 2D X/Y vertices to the database directly instead of sending 3D data and dropping the Z value afterwards.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
924
diff
changeset
|
338 binary.Write(buf, binary.LittleEndian, math.Float64bits(p.Y)) |
15bf101e1522
Send 2D X/Y vertices to the database directly instead of sending 3D data and dropping the Z value afterwards.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
924
diff
changeset
|
339 } |
15bf101e1522
Send 2D X/Y vertices to the database directly instead of sending 3D data and dropping the Z value afterwards.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
924
diff
changeset
|
340 } |
15bf101e1522
Send 2D X/Y vertices to the database directly instead of sending 3D data and dropping the Z value afterwards.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
924
diff
changeset
|
341 |
15bf101e1522
Send 2D X/Y vertices to the database directly instead of sending 3D data and dropping the Z value afterwards.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
924
diff
changeset
|
342 return buf.Bytes() |
15bf101e1522
Send 2D X/Y vertices to the database directly instead of sending 3D data and dropping the Z value afterwards.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
924
diff
changeset
|
343 } |
15bf101e1522
Send 2D X/Y vertices to the database directly instead of sending 3D data and dropping the Z value afterwards.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
924
diff
changeset
|
344 |
928
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
345 // Join joins two lines leaving the first of the secoung out. |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
346 func (ls LineStringZ) Join(other LineStringZ) LineStringZ { |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
347 nline := make(LineStringZ, len(ls)+len(other)-1) |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
348 copy(nline, ls) |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
349 copy(nline[len(ls):], other[1:]) |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
350 return nline |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
351 } |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
352 |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
353 func (mls MultiLineStringZ) Merge() MultiLineStringZ { |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
354 |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
355 var out MultiLineStringZ |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
356 |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
357 min := Vertex{math.MaxFloat64, math.MaxFloat64, math.MaxFloat64} |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
358 |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
359 for _, line := range mls { |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
360 for _, v := range line { |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
361 min.Minimize(v) |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
362 } |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
363 } |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
364 |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
365 type point struct { |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
366 x int64 |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
367 y int64 |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
368 } |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
369 |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
370 const precision = 1e7 |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
371 |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
372 quant := func(v Vertex) point { |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
373 return point{ |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
374 x: int64(math.Round((v.X - min.X) * precision)), |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
375 y: int64(math.Round((v.Y - min.Y) * precision)), |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
376 } |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
377 } |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
378 |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
379 heads := make(map[point]*[]LineStringZ) |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
380 |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
381 for _, line := range mls { |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
382 if len(line) < 2 { |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
383 out = append(out, line) |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
384 continue |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
385 } |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
386 head := quant(line[0]) |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
387 tail := quant(line[len(line)-1]) |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
388 if head == tail { // its already a ring |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
389 out = append(out, line) |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
390 continue |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
391 } |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
392 |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
393 if hs := heads[tail]; hs != nil { |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
394 l := len(*hs) |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
395 last := (*hs)[l-1] |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
396 if l == 1 { |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
397 delete(heads, tail) |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
398 } else { |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
399 (*hs)[l-1] = nil |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
400 *hs = (*hs)[:l-1] |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
401 } |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
402 line = line.Join(last) |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
403 |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
404 if head == quant(line[len(line)-1]) { // its a ring |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
405 out = append(out, line) |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
406 continue |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
407 } |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
408 } |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
409 |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
410 if hs := heads[head]; hs != nil { |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
411 *hs = append(*hs, line) |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
412 } else { |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
413 heads[head] = &[]LineStringZ{line} |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
414 } |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
415 } |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
416 |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
417 again: |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
418 for head, lines := range heads { |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
419 for i, line := range *lines { |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
420 tail := quant(line[len(line)-1]) |
940
be7b83638ec8
Simplified line merging in generating contour lines.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
928
diff
changeset
|
421 for hs := heads[tail]; hs != nil && len(*hs) > 0; hs = heads[tail] { |
928
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
422 l := len(*hs) |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
423 last := (*hs)[l-1] |
940
be7b83638ec8
Simplified line merging in generating contour lines.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
928
diff
changeset
|
424 (*hs)[l-1] = nil |
be7b83638ec8
Simplified line merging in generating contour lines.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
928
diff
changeset
|
425 *hs = (*hs)[:l-1] |
928
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
426 line = line.Join(last) |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
427 |
940
be7b83638ec8
Simplified line merging in generating contour lines.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
928
diff
changeset
|
428 if tail = quant(line[len(line)-1]); head == tail { // its a ring |
928
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
429 out = append(out, line) |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
430 // remove from current lines |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
431 copy((*lines)[i:], (*lines)[i+1:]) |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
432 (*lines)[len(*lines)-1] = nil |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
433 *lines = (*lines)[:len(*lines)-1] |
940
be7b83638ec8
Simplified line merging in generating contour lines.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
928
diff
changeset
|
434 goto again |
928
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
435 } |
940
be7b83638ec8
Simplified line merging in generating contour lines.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
928
diff
changeset
|
436 // overwrite in current lines |
be7b83638ec8
Simplified line merging in generating contour lines.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
928
diff
changeset
|
437 (*lines)[i] = line |
928
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
438 } |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
439 } |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
440 } |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
441 |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
442 rings := len(out) |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
443 |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
444 // The rest are open line strings. |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
445 for _, lines := range heads { |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
446 for _, line := range *lines { |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
447 out = append(out, line) |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
448 } |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
449 } |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
450 |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
451 log.Printf("segments before/after merge: %d/%d (%d rings)\n", |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
452 len(mls), len(out), rings) |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
453 |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
454 return out |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
455 } |
0a0013fbda4a
octree2contour: Merge multi linestrings in user land before sending them to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
925
diff
changeset
|
456 |
774
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
457 func (a Box2D) Intersects(b Box2D) bool { |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
458 return !(a.X2 < a.X1 || a.X2 < b.X1 || |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
459 a.Y2 < a.Y1 || a.Y2 < b.Y1) |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
460 } |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
461 |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
462 func (a Box2D) Mid() (float64, float64) { |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
463 return (a.X2-a.X1)*0.5 + a.X1, (a.Y2-a.Y1)*0.5 + a.Y1 |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
464 } |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
465 |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
466 func (a Box2D) Xi(i int) float64 { |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
467 if i == 0 { |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
468 return a.X1 |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
469 } |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
470 return a.X2 |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
471 } |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
472 |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
473 func (a Box2D) Yi(i int) float64 { |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
474 if i == 0 { |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
475 return a.Y1 |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
476 } |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
477 return a.Y2 |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
478 } |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
479 |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
480 func NewPlane2D(x1, y1, x2, y2 float64) Plane2D { |
778
9be20bd0f131
Fixed a bug with 2d planes (lines) found while working on line intersections.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
774
diff
changeset
|
481 b := x2 - x1 |
9be20bd0f131
Fixed a bug with 2d planes (lines) found while working on line intersections.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
774
diff
changeset
|
482 a := -(y2 - y1) |
774
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
483 |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
484 l := math.Sqrt(a*a + b*b) |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
485 a /= l |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
486 b /= l |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
487 |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
488 // a*x1 + b*y1 + c = 0 |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
489 c := -(a*x1 + b*y1) |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
490 return Plane2D{a, b, c} |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
491 } |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
492 |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
493 func (p Plane2D) Eval(x, y float64) float64 { |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
494 return p.A*x + p.B*y + p.C |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
495 } |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
496 |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
497 const epsPlane = 1e-5 |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
498 |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
499 func sides(s int, x float64) int { |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
500 if math.Signbit(x) { |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
501 return s | 2 |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
502 } |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
503 return s | 1 |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
504 } |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
505 |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
506 func (a Box2D) IntersectsPlane(p Plane2D) bool { |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
507 var s int |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
508 for i := 0; i < 2; i++ { |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
509 x := a.Xi(i) |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
510 for j := 0; j < 2; j++ { |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
511 y := a.Yi(j) |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
512 v := p.Eval(x, y) |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
513 if math.Abs(v) < epsPlane { |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
514 //log.Printf("on line") |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
515 return true |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
516 } |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
517 if s = sides(s, v); s == 3 { |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
518 //log.Printf("... on both sides (djt)") |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
519 return true |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
520 } |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
521 } |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
522 } |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
523 //log.Printf("side: %d\n", s) |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
524 return false |
c55771b7c502
Moved Box2D and Plane2D into vertex.go and made to API public.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
769
diff
changeset
|
525 } |
778
9be20bd0f131
Fixed a bug with 2d planes (lines) found while working on line intersections.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
774
diff
changeset
|
526 |
9be20bd0f131
Fixed a bug with 2d planes (lines) found while working on line intersections.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
774
diff
changeset
|
527 func (a Vertex) Cross(b Vertex) Vertex { |
9be20bd0f131
Fixed a bug with 2d planes (lines) found while working on line intersections.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
774
diff
changeset
|
528 return Vertex{ |
9be20bd0f131
Fixed a bug with 2d planes (lines) found while working on line intersections.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
774
diff
changeset
|
529 a.Y*b.Z - a.Z*b.Y, |
9be20bd0f131
Fixed a bug with 2d planes (lines) found while working on line intersections.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
774
diff
changeset
|
530 a.Z*b.X - a.X*b.Z, |
9be20bd0f131
Fixed a bug with 2d planes (lines) found while working on line intersections.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
774
diff
changeset
|
531 a.X*b.Y - a.Y*b.X, |
9be20bd0f131
Fixed a bug with 2d planes (lines) found while working on line intersections.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
774
diff
changeset
|
532 } |
9be20bd0f131
Fixed a bug with 2d planes (lines) found while working on line intersections.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
774
diff
changeset
|
533 } |
9be20bd0f131
Fixed a bug with 2d planes (lines) found while working on line intersections.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
774
diff
changeset
|
534 |
9be20bd0f131
Fixed a bug with 2d planes (lines) found while working on line intersections.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
774
diff
changeset
|
535 func (p1 Plane2D) Intersection(p2 Plane2D) (float64, float64, bool) { |
9be20bd0f131
Fixed a bug with 2d planes (lines) found while working on line intersections.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
774
diff
changeset
|
536 |
9be20bd0f131
Fixed a bug with 2d planes (lines) found while working on line intersections.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
774
diff
changeset
|
537 u1 := Vertex{p1.A, p1.B, p1.C} |
9be20bd0f131
Fixed a bug with 2d planes (lines) found while working on line intersections.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
774
diff
changeset
|
538 u2 := Vertex{p2.A, p2.B, p2.C} |
9be20bd0f131
Fixed a bug with 2d planes (lines) found while working on line intersections.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
774
diff
changeset
|
539 |
9be20bd0f131
Fixed a bug with 2d planes (lines) found while working on line intersections.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
774
diff
changeset
|
540 p := u1.Cross(u2) |
9be20bd0f131
Fixed a bug with 2d planes (lines) found while working on line intersections.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
774
diff
changeset
|
541 |
9be20bd0f131
Fixed a bug with 2d planes (lines) found while working on line intersections.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
774
diff
changeset
|
542 if p.Z == 0 { |
9be20bd0f131
Fixed a bug with 2d planes (lines) found while working on line intersections.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
774
diff
changeset
|
543 return 0, 0, false |
9be20bd0f131
Fixed a bug with 2d planes (lines) found while working on line intersections.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
774
diff
changeset
|
544 } |
9be20bd0f131
Fixed a bug with 2d planes (lines) found while working on line intersections.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
774
diff
changeset
|
545 |
9be20bd0f131
Fixed a bug with 2d planes (lines) found while working on line intersections.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
774
diff
changeset
|
546 return p.X / p.Z, p.Y / p.Z, true |
9be20bd0f131
Fixed a bug with 2d planes (lines) found while working on line intersections.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
774
diff
changeset
|
547 } |
787
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
548 |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
549 type VerticalLine struct { |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
550 x1 float64 |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
551 y1 float64 |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
552 x2 float64 |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
553 y2 float64 |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
554 |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
555 line Plane2D |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
556 } |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
557 |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
558 func NewVerticalLine(x1, y1, x2, y2 float64) *VerticalLine { |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
559 return &VerticalLine{ |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
560 x1: x1, |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
561 y1: y1, |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
562 x2: x2, |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
563 y2: y2, |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
564 line: NewPlane2D(x1, y1, x2, y2), |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
565 } |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
566 } |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
567 |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
568 func onPlane(x float64) bool { return math.Abs(x) < epsPlane } |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
569 |
788
9f3a4a60dc04
Cleaned up interpolation mess in vertical triangle intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
787
diff
changeset
|
570 func relative(v1, v2 Vertex) func(x, y float64) float64 { |
795
bd5f38eb6153
Vertical Triangle intersection: Fixed function to determine where intersection point
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
792
diff
changeset
|
571 ls := linearScale(v1.X, v1.Y, v2.X, v2.Y) |
787
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
572 return func(x, y float64) float64 { |
795
bd5f38eb6153
Vertical Triangle intersection: Fixed function to determine where intersection point
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
792
diff
changeset
|
573 return ls(Vertex{x, y, 0}) |
787
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
574 } |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
575 } |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
576 |
788
9f3a4a60dc04
Cleaned up interpolation mess in vertical triangle intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
787
diff
changeset
|
577 func interpolate(a, b float64) func(float64) float64 { |
9f3a4a60dc04
Cleaned up interpolation mess in vertical triangle intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
787
diff
changeset
|
578 return func(x float64) float64 { |
9f3a4a60dc04
Cleaned up interpolation mess in vertical triangle intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
787
diff
changeset
|
579 return (b-a)*x + a |
9f3a4a60dc04
Cleaned up interpolation mess in vertical triangle intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
787
diff
changeset
|
580 } |
9f3a4a60dc04
Cleaned up interpolation mess in vertical triangle intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
787
diff
changeset
|
581 } |
9f3a4a60dc04
Cleaned up interpolation mess in vertical triangle intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
787
diff
changeset
|
582 |
787
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
583 func linear(v1, v2 Vertex) func(t float64) Vertex { |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
584 return func(t float64) Vertex { |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
585 return Vertex{ |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
586 (v2.X-v1.X)*t + v1.X, |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
587 (v2.Y-v1.Y)*t + v1.Y, |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
588 (v2.Z-v1.Z)*t + v1.Z, |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
589 } |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
590 } |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
591 } |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
592 |
788
9f3a4a60dc04
Cleaned up interpolation mess in vertical triangle intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
787
diff
changeset
|
593 func inRange(a float64) bool { return 0 <= a && a <= 1 } |
787
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
594 |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
595 func (vl *VerticalLine) Intersection(t *Triangle) LineStringZ { |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
596 |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
597 var out LineStringZ |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
598 |
815
01019d4c8359
Cross section: Made triangle intersection less spammy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
813
diff
changeset
|
599 //defer func() { log.Printf("length out: %d\n", len(out)) }() |
796
0cc97135717c
More fixes to vertical triangle intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
795
diff
changeset
|
600 |
787
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
601 edges: |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
602 for i := 0; i < 3 && len(out) < 2; i++ { |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
603 j := (i + 1) % 3 |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
604 edge := NewPlane2D(t[i].X, t[i].Y, t[j].X, t[j].Y) |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
605 |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
606 s1 := edge.Eval(vl.x1, vl.y1) |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
607 s2 := edge.Eval(vl.x2, vl.y2) |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
608 |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
609 o1 := onPlane(s1) |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
610 o2 := onPlane(s2) |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
611 |
815
01019d4c8359
Cross section: Made triangle intersection less spammy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
813
diff
changeset
|
612 // log.Printf("s1, s2: %t %t (%f %f)\n", o1, o2, s1, s2) |
795
bd5f38eb6153
Vertical Triangle intersection: Fixed function to determine where intersection point
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
792
diff
changeset
|
613 |
787
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
614 switch { |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
615 case o1 && o2: |
788
9f3a4a60dc04
Cleaned up interpolation mess in vertical triangle intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
787
diff
changeset
|
616 pos := relative(t[i], t[j]) |
787
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
617 t1 := pos(vl.x1, vl.y1) |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
618 t2 := pos(vl.x2, vl.y2) |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
619 |
788
9f3a4a60dc04
Cleaned up interpolation mess in vertical triangle intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
787
diff
changeset
|
620 r1 := inRange(t1) |
9f3a4a60dc04
Cleaned up interpolation mess in vertical triangle intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
787
diff
changeset
|
621 r2 := inRange(t2) |
787
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
622 |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
623 switch { |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
624 case r1 && r2: |
788
9f3a4a60dc04
Cleaned up interpolation mess in vertical triangle intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
787
diff
changeset
|
625 lin := linear(t[i], t[j]) |
9f3a4a60dc04
Cleaned up interpolation mess in vertical triangle intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
787
diff
changeset
|
626 out = append(out, lin(t1), lin(t2)) |
787
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
627 return out |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
628 |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
629 case !r1 && !r2: // the hole edge |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
630 out = append(out, t[i], t[j]) |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
631 return out |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
632 case !r1: |
789
d43e61044ad8
Fill in last remaining corner cases in vertical triangle interpolation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
788
diff
changeset
|
633 if t1 < 0 { |
d43e61044ad8
Fill in last remaining corner cases in vertical triangle interpolation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
788
diff
changeset
|
634 // below first -> clip by first |
d43e61044ad8
Fill in last remaining corner cases in vertical triangle interpolation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
788
diff
changeset
|
635 lin := linear(t[i], t[j]) |
d43e61044ad8
Fill in last remaining corner cases in vertical triangle interpolation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
788
diff
changeset
|
636 out = append(out, t[i], lin(t2)) |
d43e61044ad8
Fill in last remaining corner cases in vertical triangle interpolation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
788
diff
changeset
|
637 } else { |
d43e61044ad8
Fill in last remaining corner cases in vertical triangle interpolation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
788
diff
changeset
|
638 // above second -> clip by second |
d43e61044ad8
Fill in last remaining corner cases in vertical triangle interpolation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
788
diff
changeset
|
639 lin := linear(t[i], t[j]) |
d43e61044ad8
Fill in last remaining corner cases in vertical triangle interpolation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
788
diff
changeset
|
640 out = append(out, lin(t2), t[j]) |
d43e61044ad8
Fill in last remaining corner cases in vertical triangle interpolation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
788
diff
changeset
|
641 } |
d43e61044ad8
Fill in last remaining corner cases in vertical triangle interpolation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
788
diff
changeset
|
642 return out |
787
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
643 case !r2: |
789
d43e61044ad8
Fill in last remaining corner cases in vertical triangle interpolation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
788
diff
changeset
|
644 if t2 < 0 { |
d43e61044ad8
Fill in last remaining corner cases in vertical triangle interpolation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
788
diff
changeset
|
645 // below first -> clip by first |
d43e61044ad8
Fill in last remaining corner cases in vertical triangle interpolation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
788
diff
changeset
|
646 lin := linear(t[i], t[j]) |
d43e61044ad8
Fill in last remaining corner cases in vertical triangle interpolation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
788
diff
changeset
|
647 out = append(out, t[i], lin(t1)) |
d43e61044ad8
Fill in last remaining corner cases in vertical triangle interpolation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
788
diff
changeset
|
648 } else { |
d43e61044ad8
Fill in last remaining corner cases in vertical triangle interpolation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
788
diff
changeset
|
649 // above second -> clip by second |
d43e61044ad8
Fill in last remaining corner cases in vertical triangle interpolation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
788
diff
changeset
|
650 lin := linear(t[i], t[j]) |
d43e61044ad8
Fill in last remaining corner cases in vertical triangle interpolation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
788
diff
changeset
|
651 out = append(out, lin(t1), t[j]) |
d43e61044ad8
Fill in last remaining corner cases in vertical triangle interpolation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
788
diff
changeset
|
652 } |
d43e61044ad8
Fill in last remaining corner cases in vertical triangle interpolation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
788
diff
changeset
|
653 return out |
787
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
654 } |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
655 |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
656 case o1: |
788
9f3a4a60dc04
Cleaned up interpolation mess in vertical triangle intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
787
diff
changeset
|
657 t1 := relative(t[i], t[j])(vl.x1, vl.y1) |
9f3a4a60dc04
Cleaned up interpolation mess in vertical triangle intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
787
diff
changeset
|
658 if !inRange(t1) { |
787
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
659 continue edges |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
660 } |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
661 out = append(out, linear(t[i], t[j])(t1)) |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
662 |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
663 case o2: |
788
9f3a4a60dc04
Cleaned up interpolation mess in vertical triangle intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
787
diff
changeset
|
664 t2 := relative(t[i], t[j])(vl.x2, vl.y2) |
9f3a4a60dc04
Cleaned up interpolation mess in vertical triangle intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
787
diff
changeset
|
665 if !inRange(t2) { |
787
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
666 continue edges |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
667 } |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
668 out = append(out, linear(t[i], t[j])(t2)) |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
669 |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
670 default: |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
671 x, y, intersects := vl.line.Intersection(edge) |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
672 if !intersects { |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
673 continue edges |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
674 } |
795
bd5f38eb6153
Vertical Triangle intersection: Fixed function to determine where intersection point
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
792
diff
changeset
|
675 |
815
01019d4c8359
Cross section: Made triangle intersection less spammy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
813
diff
changeset
|
676 // log.Println("Intersection -----------------------------") |
788
9f3a4a60dc04
Cleaned up interpolation mess in vertical triangle intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
787
diff
changeset
|
677 t1 := relative(t[i], t[j])(x, y) |
815
01019d4c8359
Cross section: Made triangle intersection less spammy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
813
diff
changeset
|
678 // log.Printf("relative pos: %f\n", t1) |
788
9f3a4a60dc04
Cleaned up interpolation mess in vertical triangle intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
787
diff
changeset
|
679 if !inRange(t1) { |
787
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
680 continue edges |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
681 } |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
682 |
815
01019d4c8359
Cross section: Made triangle intersection less spammy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
813
diff
changeset
|
683 // log.Println("valid ***************") |
795
bd5f38eb6153
Vertical Triangle intersection: Fixed function to determine where intersection point
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
792
diff
changeset
|
684 |
788
9f3a4a60dc04
Cleaned up interpolation mess in vertical triangle intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
787
diff
changeset
|
685 z := interpolate(t[j].Z, t[i].Z)(t1) |
787
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
686 n := Vertex{x, y, z} |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
687 |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
688 if math.Signbit(s1) != math.Signbit(s2) { |
815
01019d4c8359
Cross section: Made triangle intersection less spammy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
813
diff
changeset
|
689 // log.Println("\ton different sides") |
787
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
690 // different sides -> vertex on edge. |
788
9f3a4a60dc04
Cleaned up interpolation mess in vertical triangle intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
787
diff
changeset
|
691 out = append(out, n) |
787
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
692 } else { // same side -> inside. Find peer |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
693 if len(out) > 0 { // we already have our peer |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
694 out = append(out, n) |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
695 return out |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
696 } |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
697 |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
698 for k := 0; k < 3; k++ { |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
699 if k == i { |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
700 continue |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
701 } |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
702 l := (k + 1) % 3 |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
703 other := NewPlane2D(t[k].X, t[k].Y, t[l].X, t[l].Y) |
813
1a808929c2c5
Cross sections: Fixed problem that certain inputs don't deliver data.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
796
diff
changeset
|
704 xo, yo, intersects := vl.line.Intersection(other) |
787
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
705 if !intersects { |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
706 continue |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
707 } |
813
1a808929c2c5
Cross sections: Fixed problem that certain inputs don't deliver data.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
796
diff
changeset
|
708 t2 := relative(t[k], t[l])(xo, yo) |
788
9f3a4a60dc04
Cleaned up interpolation mess in vertical triangle intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
787
diff
changeset
|
709 if !inRange(t2) { |
787
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
710 continue |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
711 } |
813
1a808929c2c5
Cross sections: Fixed problem that certain inputs don't deliver data.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
796
diff
changeset
|
712 zo := interpolate(t[k].Z, t[l].Z)(t2) |
788
9f3a4a60dc04
Cleaned up interpolation mess in vertical triangle intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
787
diff
changeset
|
713 |
787
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
714 m := Vertex{xo, yo, zo} |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
715 |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
716 var xn, yn, xf, yf float64 |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
717 |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
718 // Which is nearer to current edge? |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
719 if math.Abs(s1) < math.Abs(s2) { |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
720 xn, yn = vl.x1, vl.y1 |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
721 xf, yf = vl.x2, vl.y2 |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
722 } else { |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
723 xn, yn = vl.x2, vl.y2 |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
724 xf, yf = vl.x1, vl.y1 |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
725 } |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
726 |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
727 if onPlane(other.Eval(xn, yn)) { |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
728 // triangle intersect in only point |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
729 // treat as no intersection |
788
9f3a4a60dc04
Cleaned up interpolation mess in vertical triangle intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
787
diff
changeset
|
730 break edges |
787
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
731 } |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
732 |
788
9f3a4a60dc04
Cleaned up interpolation mess in vertical triangle intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
787
diff
changeset
|
733 pos := relative(n, m) |
787
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
734 |
788
9f3a4a60dc04
Cleaned up interpolation mess in vertical triangle intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
787
diff
changeset
|
735 tzn := pos(xn, yn) |
9f3a4a60dc04
Cleaned up interpolation mess in vertical triangle intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
787
diff
changeset
|
736 tzf := pos(xf, yf) |
787
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
737 |
788
9f3a4a60dc04
Cleaned up interpolation mess in vertical triangle intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
787
diff
changeset
|
738 if !inRange(tzn) { |
787
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
739 // if near is out of range far is, too. |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
740 return out |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
741 } |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
742 |
788
9f3a4a60dc04
Cleaned up interpolation mess in vertical triangle intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
787
diff
changeset
|
743 lin := interpolate(n.Z, m.Z) |
9f3a4a60dc04
Cleaned up interpolation mess in vertical triangle intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
787
diff
changeset
|
744 |
9f3a4a60dc04
Cleaned up interpolation mess in vertical triangle intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
787
diff
changeset
|
745 if inRange(tzf) { |
787
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
746 m.X = xf |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
747 m.Y = yf |
788
9f3a4a60dc04
Cleaned up interpolation mess in vertical triangle intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
787
diff
changeset
|
748 m.Z = lin(tzf) |
787
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
749 } // else m is clipping |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
750 |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
751 n.X = xn |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
752 n.Y = yn |
788
9f3a4a60dc04
Cleaned up interpolation mess in vertical triangle intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
787
diff
changeset
|
753 n.Z = lin(tzn) |
787
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
754 |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
755 out = append(out, n, m) |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
756 return out |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
757 } |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
758 } |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
759 } |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
760 } |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
761 |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
762 // supress single point touches. |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
763 if len(out) == 1 { |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
764 out = out[:0] |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
765 } |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
766 |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
767 return out |
3d927e06b92c
Triangle intersection. WIP. Currently interpolation is messed up.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
778
diff
changeset
|
768 } |
959
6ab012d0f0c2
Started with writing an importer job for sounding results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
940
diff
changeset
|
769 |
6ab012d0f0c2
Started with writing an importer job for sounding results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
940
diff
changeset
|
770 func (mpz MultiPointZ) AsWKB() []byte { |
6ab012d0f0c2
Started with writing an importer job for sounding results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
940
diff
changeset
|
771 size := 1 + 4 + 4 + len(mpz)*(1+4+3*8) |
6ab012d0f0c2
Started with writing an importer job for sounding results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
940
diff
changeset
|
772 |
6ab012d0f0c2
Started with writing an importer job for sounding results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
940
diff
changeset
|
773 buf := bytes.NewBuffer(make([]byte, 0, size)) |
6ab012d0f0c2
Started with writing an importer job for sounding results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
940
diff
changeset
|
774 |
6ab012d0f0c2
Started with writing an importer job for sounding results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
940
diff
changeset
|
775 binary.Write(buf, binary.LittleEndian, wkbNDR) |
6ab012d0f0c2
Started with writing an importer job for sounding results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
940
diff
changeset
|
776 binary.Write(buf, binary.LittleEndian, wkbMultiPointZ) |
6ab012d0f0c2
Started with writing an importer job for sounding results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
940
diff
changeset
|
777 binary.Write(buf, binary.LittleEndian, uint32(len(mpz))) |
6ab012d0f0c2
Started with writing an importer job for sounding results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
940
diff
changeset
|
778 |
6ab012d0f0c2
Started with writing an importer job for sounding results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
940
diff
changeset
|
779 for _, p := range mpz { |
6ab012d0f0c2
Started with writing an importer job for sounding results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
940
diff
changeset
|
780 binary.Write(buf, binary.LittleEndian, wkbNDR) |
6ab012d0f0c2
Started with writing an importer job for sounding results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
940
diff
changeset
|
781 binary.Write(buf, binary.LittleEndian, wkbPointZ) |
6ab012d0f0c2
Started with writing an importer job for sounding results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
940
diff
changeset
|
782 binary.Write(buf, binary.LittleEndian, math.Float64bits(p.X)) |
6ab012d0f0c2
Started with writing an importer job for sounding results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
940
diff
changeset
|
783 binary.Write(buf, binary.LittleEndian, math.Float64bits(p.Y)) |
6ab012d0f0c2
Started with writing an importer job for sounding results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
940
diff
changeset
|
784 binary.Write(buf, binary.LittleEndian, math.Float64bits(p.Z)) |
6ab012d0f0c2
Started with writing an importer job for sounding results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
940
diff
changeset
|
785 } |
6ab012d0f0c2
Started with writing an importer job for sounding results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
940
diff
changeset
|
786 |
6ab012d0f0c2
Started with writing an importer job for sounding results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
940
diff
changeset
|
787 return buf.Bytes() |
6ab012d0f0c2
Started with writing an importer job for sounding results.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
940
diff
changeset
|
788 } |