Mercurial > gemma
annotate pkg/octree/polygon.go @ 3746:433bad131e5c
Added check trigger to sounding results to ensure they intersect the bn-area.
author | Sascha Wilde <wilde@intevation.de> |
---|---|
date | Mon, 24 Jun 2019 16:13:05 +0200 |
parents | 1c3df921361d |
children | a38d846d9fd5 |
rev | line source |
---|---|
2488
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
1 // This is Free Software under GNU Affero General Public License v >= 3.0 |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
2 // without warranty, see README.md and license for details. |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
3 // |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
4 // SPDX-License-Identifier: AGPL-3.0-or-later |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
5 // License-Filename: LICENSES/AGPL-3.0.txt |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
6 // |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
7 // Copyright (C) 2018 by via donau |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
8 // – Österreichische Wasserstraßen-Gesellschaft mbH |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
9 // Software engineering by Intevation GmbH |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
10 // |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
11 // Author(s): |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
12 // * Sascha L. Teichmann <sascha.teichmann@intevation.de> |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
13 |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
14 package octree |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
15 |
2489
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
16 import ( |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
17 "bytes" |
2574
2833ff156cb2
Morphological differences: Moved loading of clipping polygon into octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2498
diff
changeset
|
18 "context" |
2833ff156cb2
Morphological differences: Moved loading of clipping polygon into octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2498
diff
changeset
|
19 "database/sql" |
2489
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
20 "encoding/binary" |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
21 "fmt" |
2498
843f39b9327e
Handle hole more precisely.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2495
diff
changeset
|
22 "log" |
2489
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
23 "math" |
2574
2833ff156cb2
Morphological differences: Moved loading of clipping polygon into octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2498
diff
changeset
|
24 "time" |
2489
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
25 |
2492
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
26 "github.com/tidwall/rtree" |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
27 |
2489
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
28 "gemma.intevation.de/gemma/pkg/wkb" |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
29 ) |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
30 |
2492
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
31 type ( |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
32 ring []float64 |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
33 |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
34 Polygon struct { |
2574
2833ff156cb2
Morphological differences: Moved loading of clipping polygon into octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2498
diff
changeset
|
35 rings []ring |
2492
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
36 indices []*rtree.RTree |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
37 } |
2488
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
38 |
2492
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
39 IntersectionType byte |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
40 |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
41 lineSegment []float64 |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
42 ) |
2488
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
43 |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
44 const ( |
2574
2833ff156cb2
Morphological differences: Moved loading of clipping polygon into octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2498
diff
changeset
|
45 clippingPolygonSQL = ` |
2833ff156cb2
Morphological differences: Moved loading of clipping polygon into octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2498
diff
changeset
|
46 WITH joined AS ( |
2833ff156cb2
Morphological differences: Moved loading of clipping polygon into octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2498
diff
changeset
|
47 SELECT |
2833ff156cb2
Morphological differences: Moved loading of clipping polygon into octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2498
diff
changeset
|
48 sr.area AS area, |
2833ff156cb2
Morphological differences: Moved loading of clipping polygon into octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2498
diff
changeset
|
49 sr.date_info AS date_info |
2587
857bb070b9f1
Morphological differences: Bottleneck_id is an integer represented as a string.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2574
diff
changeset
|
50 FROM waterway.sounding_results sr |
857bb070b9f1
Morphological differences: Bottleneck_id is an integer represented as a string.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2574
diff
changeset
|
51 WHERE sr.bottleneck_id = $1 |
2574
2833ff156cb2
Morphological differences: Moved loading of clipping polygon into octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2498
diff
changeset
|
52 ) |
2833ff156cb2
Morphological differences: Moved loading of clipping polygon into octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2498
diff
changeset
|
53 SELECT ST_AsBinary( |
2833ff156cb2
Morphological differences: Moved loading of clipping polygon into octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2498
diff
changeset
|
54 ST_intersection( |
2833ff156cb2
Morphological differences: Moved loading of clipping polygon into octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2498
diff
changeset
|
55 (SELECT ST_Transform(area::geometry, $2::int) FROM joined WHERE date_info = $3::date), |
2833ff156cb2
Morphological differences: Moved loading of clipping polygon into octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2498
diff
changeset
|
56 (SELECT ST_Transform(area::geometry, $2::int) FROM joined WHERE date_info = $4::date) |
2833ff156cb2
Morphological differences: Moved loading of clipping polygon into octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2498
diff
changeset
|
57 ) |
2833ff156cb2
Morphological differences: Moved loading of clipping polygon into octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2498
diff
changeset
|
58 ) AS area |
2833ff156cb2
Morphological differences: Moved loading of clipping polygon into octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2498
diff
changeset
|
59 ` |
2833ff156cb2
Morphological differences: Moved loading of clipping polygon into octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2498
diff
changeset
|
60 ) |
2833ff156cb2
Morphological differences: Moved loading of clipping polygon into octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2498
diff
changeset
|
61 |
2833ff156cb2
Morphological differences: Moved loading of clipping polygon into octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2498
diff
changeset
|
62 const ( |
2488
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
63 IntersectionInside IntersectionType = iota |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
64 IntersectionOutSide |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
65 IntersectionOverlaps |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
66 ) |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
67 |
2574
2833ff156cb2
Morphological differences: Moved loading of clipping polygon into octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2498
diff
changeset
|
68 func LoadClippingPolygon( |
2833ff156cb2
Morphological differences: Moved loading of clipping polygon into octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2498
diff
changeset
|
69 ctx context.Context, |
2833ff156cb2
Morphological differences: Moved loading of clipping polygon into octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2498
diff
changeset
|
70 conn *sql.Conn, |
2833ff156cb2
Morphological differences: Moved loading of clipping polygon into octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2498
diff
changeset
|
71 epsg uint32, |
2833ff156cb2
Morphological differences: Moved loading of clipping polygon into octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2498
diff
changeset
|
72 bottleneck string, |
2833ff156cb2
Morphological differences: Moved loading of clipping polygon into octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2498
diff
changeset
|
73 first, second time.Time, |
2833ff156cb2
Morphological differences: Moved loading of clipping polygon into octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2498
diff
changeset
|
74 ) (*Polygon, error) { |
2833ff156cb2
Morphological differences: Moved loading of clipping polygon into octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2498
diff
changeset
|
75 |
2833ff156cb2
Morphological differences: Moved loading of clipping polygon into octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2498
diff
changeset
|
76 var clip []byte |
2833ff156cb2
Morphological differences: Moved loading of clipping polygon into octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2498
diff
changeset
|
77 |
2833ff156cb2
Morphological differences: Moved loading of clipping polygon into octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2498
diff
changeset
|
78 if err := conn.QueryRowContext( |
2833ff156cb2
Morphological differences: Moved loading of clipping polygon into octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2498
diff
changeset
|
79 ctx, clippingPolygonSQL, |
2833ff156cb2
Morphological differences: Moved loading of clipping polygon into octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2498
diff
changeset
|
80 bottleneck, |
2833ff156cb2
Morphological differences: Moved loading of clipping polygon into octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2498
diff
changeset
|
81 epsg, |
2833ff156cb2
Morphological differences: Moved loading of clipping polygon into octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2498
diff
changeset
|
82 first, second, |
2833ff156cb2
Morphological differences: Moved loading of clipping polygon into octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2498
diff
changeset
|
83 ).Scan(&clip); err != nil { |
2833ff156cb2
Morphological differences: Moved loading of clipping polygon into octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2498
diff
changeset
|
84 return nil, err |
2833ff156cb2
Morphological differences: Moved loading of clipping polygon into octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2498
diff
changeset
|
85 } |
2833ff156cb2
Morphological differences: Moved loading of clipping polygon into octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2498
diff
changeset
|
86 |
2833ff156cb2
Morphological differences: Moved loading of clipping polygon into octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2498
diff
changeset
|
87 var polygon Polygon |
2833ff156cb2
Morphological differences: Moved loading of clipping polygon into octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2498
diff
changeset
|
88 if err := polygon.FromWKB(clip); err != nil { |
2833ff156cb2
Morphological differences: Moved loading of clipping polygon into octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2498
diff
changeset
|
89 return nil, err |
2833ff156cb2
Morphological differences: Moved loading of clipping polygon into octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2498
diff
changeset
|
90 } |
2833ff156cb2
Morphological differences: Moved loading of clipping polygon into octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2498
diff
changeset
|
91 polygon.Indexify() |
2833ff156cb2
Morphological differences: Moved loading of clipping polygon into octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2498
diff
changeset
|
92 return &polygon, nil |
2833ff156cb2
Morphological differences: Moved loading of clipping polygon into octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2498
diff
changeset
|
93 } |
2833ff156cb2
Morphological differences: Moved loading of clipping polygon into octree package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2498
diff
changeset
|
94 |
2492
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
95 func (ls lineSegment) Rect(interface{}) ([]float64, []float64) { |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
96 |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
97 var min, max [2]float64 |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
98 |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
99 if ls[0] < ls[2] { |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
100 min[0] = ls[0] |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
101 max[0] = ls[2] |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
102 } else { |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
103 min[0] = ls[2] |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
104 max[0] = ls[0] |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
105 } |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
106 |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
107 if ls[1] < ls[3] { |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
108 min[1] = ls[1] |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
109 max[1] = ls[3] |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
110 } else { |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
111 min[1] = ls[3] |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
112 max[1] = ls[1] |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
113 } |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
114 |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
115 return min[:], max[:] |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
116 } |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
117 |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
118 func (p *Polygon) Indexify() { |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
119 indices := make([]*rtree.RTree, len(p.rings)) |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
120 |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
121 for i := range indices { |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
122 index := rtree.New(nil) |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
123 indices[i] = index |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
124 |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
125 rng := p.rings[i] |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
126 |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
127 for i := 0; i < len(rng); i += 2 { |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
128 var ls lineSegment |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
129 if i+4 <= len(rng) { |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
130 ls = lineSegment(rng[i : i+4]) |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
131 } else { |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
132 ls = []float64{rng[i], rng[i+1], rng[0], rng[1]} |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
133 } |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
134 index.Insert(ls) |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
135 } |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
136 } |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
137 |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
138 p.indices = indices |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
139 } |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
140 |
2494
a727e0426240
More on triangle/clipping polygon intersection. TODO: line segment / line segment intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2492
diff
changeset
|
141 func (ls lineSegment) intersects(a Box2D) bool { |
2492
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
142 p1x := ls[0] |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
143 p1y := ls[1] |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
144 p2x := ls[2] |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
145 p2y := ls[3] |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
146 |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
147 left := a.X1 |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
148 right := a.X2 |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
149 top := a.Y1 |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
150 bottom := a.Y2 |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
151 |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
152 // The direction of the ray |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
153 dx := p2x - p1x |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
154 dy := p2y - p1y |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
155 |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
156 min, max := 0.0, 1.0 |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
157 |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
158 var t0, t1 float64 |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
159 |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
160 // Left and right sides. |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
161 // - If the line is parallel to the y axis. |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
162 if dx == 0 { |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
163 if p1x < left || p1x > right { |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
164 return false |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
165 } |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
166 } else { |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
167 // - Make sure t0 holds the smaller value by checking the direction of the line. |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
168 if dx > 0 { |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
169 t0 = (left - p1x) / dx |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
170 t1 = (right - p1x) / dx |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
171 } else { |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
172 t1 = (left - p1x) / dx |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
173 t0 = (right - p1x) / dx |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
174 } |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
175 |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
176 if t0 > min { |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
177 min = t0 |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
178 } |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
179 if t1 < max { |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
180 max = t1 |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
181 } |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
182 if min > max || max < 0 { |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
183 return false |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
184 } |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
185 } |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
186 |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
187 // The top and bottom side. |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
188 // - If the line is parallel to the x axis. |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
189 if dy == 0 { |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
190 if p1y < top || p1y > bottom { |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
191 return false |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
192 } |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
193 } else { |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
194 // - Make sure t0 holds the smaller value by checking the direction of the line. |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
195 if dy > 0 { |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
196 t0 = (top - p1y) / dy |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
197 t1 = (bottom - p1y) / dy |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
198 } else { |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
199 t1 = (top - p1y) / dy |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
200 t0 = (bottom - p1y) / dy |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
201 } |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
202 |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
203 if t0 > min { |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
204 min = t0 |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
205 } |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
206 if t1 < max { |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
207 max = t1 |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
208 } |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
209 if min > max || max < 0 { |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
210 return false |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
211 } |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
212 } |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
213 |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
214 // The point of intersection |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
215 // ix = p1x + dx*min |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
216 // iy = p1y + dy*min |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
217 return true |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
218 } |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
219 |
2494
a727e0426240
More on triangle/clipping polygon intersection. TODO: line segment / line segment intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2492
diff
changeset
|
220 func (ls lineSegment) intersectsLineSegment(o lineSegment) bool { |
2495
98bc023750cf
Impelemented line segment / line segment intersection test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2494
diff
changeset
|
221 |
98bc023750cf
Impelemented line segment / line segment intersection test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2494
diff
changeset
|
222 p0 := ls[:2] |
98bc023750cf
Impelemented line segment / line segment intersection test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2494
diff
changeset
|
223 p1 := ls[2:4] |
98bc023750cf
Impelemented line segment / line segment intersection test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2494
diff
changeset
|
224 p2 := o[:2] |
98bc023750cf
Impelemented line segment / line segment intersection test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2494
diff
changeset
|
225 p3 := o[2:4] |
98bc023750cf
Impelemented line segment / line segment intersection test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2494
diff
changeset
|
226 |
98bc023750cf
Impelemented line segment / line segment intersection test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2494
diff
changeset
|
227 s10x := p1[0] - p0[0] |
98bc023750cf
Impelemented line segment / line segment intersection test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2494
diff
changeset
|
228 s10y := p1[1] - p0[1] |
98bc023750cf
Impelemented line segment / line segment intersection test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2494
diff
changeset
|
229 s32x := p3[0] - p2[0] |
98bc023750cf
Impelemented line segment / line segment intersection test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2494
diff
changeset
|
230 s32y := p3[1] - p2[1] |
98bc023750cf
Impelemented line segment / line segment intersection test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2494
diff
changeset
|
231 |
98bc023750cf
Impelemented line segment / line segment intersection test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2494
diff
changeset
|
232 den := s10x*s32y - s32x*s10y |
98bc023750cf
Impelemented line segment / line segment intersection test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2494
diff
changeset
|
233 |
98bc023750cf
Impelemented line segment / line segment intersection test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2494
diff
changeset
|
234 if den == 0 { |
98bc023750cf
Impelemented line segment / line segment intersection test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2494
diff
changeset
|
235 return false |
98bc023750cf
Impelemented line segment / line segment intersection test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2494
diff
changeset
|
236 } |
98bc023750cf
Impelemented line segment / line segment intersection test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2494
diff
changeset
|
237 |
98bc023750cf
Impelemented line segment / line segment intersection test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2494
diff
changeset
|
238 denPos := den > 0 |
98bc023750cf
Impelemented line segment / line segment intersection test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2494
diff
changeset
|
239 |
98bc023750cf
Impelemented line segment / line segment intersection test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2494
diff
changeset
|
240 s02x := p0[0] - p2[0] |
98bc023750cf
Impelemented line segment / line segment intersection test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2494
diff
changeset
|
241 s02y := p0[1] - p2[1] |
98bc023750cf
Impelemented line segment / line segment intersection test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2494
diff
changeset
|
242 |
98bc023750cf
Impelemented line segment / line segment intersection test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2494
diff
changeset
|
243 sNum := s10x*s02y - s10y*s02x |
98bc023750cf
Impelemented line segment / line segment intersection test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2494
diff
changeset
|
244 if sNum < 0 == denPos { |
98bc023750cf
Impelemented line segment / line segment intersection test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2494
diff
changeset
|
245 return false |
98bc023750cf
Impelemented line segment / line segment intersection test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2494
diff
changeset
|
246 } |
98bc023750cf
Impelemented line segment / line segment intersection test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2494
diff
changeset
|
247 |
98bc023750cf
Impelemented line segment / line segment intersection test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2494
diff
changeset
|
248 tNum := s32x*s02y - s32y*s02x |
98bc023750cf
Impelemented line segment / line segment intersection test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2494
diff
changeset
|
249 if tNum < 0 == denPos { |
98bc023750cf
Impelemented line segment / line segment intersection test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2494
diff
changeset
|
250 return false |
98bc023750cf
Impelemented line segment / line segment intersection test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2494
diff
changeset
|
251 } |
98bc023750cf
Impelemented line segment / line segment intersection test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2494
diff
changeset
|
252 |
98bc023750cf
Impelemented line segment / line segment intersection test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2494
diff
changeset
|
253 if sNum > den == denPos || tNum > den == denPos { |
98bc023750cf
Impelemented line segment / line segment intersection test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2494
diff
changeset
|
254 return false |
98bc023750cf
Impelemented line segment / line segment intersection test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2494
diff
changeset
|
255 } |
98bc023750cf
Impelemented line segment / line segment intersection test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2494
diff
changeset
|
256 |
98bc023750cf
Impelemented line segment / line segment intersection test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2494
diff
changeset
|
257 // t := tNum / den |
98bc023750cf
Impelemented line segment / line segment intersection test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2494
diff
changeset
|
258 // intersection at( p0[0] + (t * s10x), p0[1] + (t * s10y) ) |
98bc023750cf
Impelemented line segment / line segment intersection test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2494
diff
changeset
|
259 return true |
2494
a727e0426240
More on triangle/clipping polygon intersection. TODO: line segment / line segment intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2492
diff
changeset
|
260 } |
a727e0426240
More on triangle/clipping polygon intersection. TODO: line segment / line segment intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2492
diff
changeset
|
261 |
2488
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
262 func (p *Polygon) IntersectionBox2D(box Box2D) IntersectionType { |
2492
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
263 |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
264 if len(p.rings) == 0 { |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
265 return IntersectionOutSide |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
266 } |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
267 |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
268 for _, index := range p.indices { |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
269 var intersects bool |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
270 index.Search(box, func(item rtree.Item) bool { |
2494
a727e0426240
More on triangle/clipping polygon intersection. TODO: line segment / line segment intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2492
diff
changeset
|
271 if item.(lineSegment).intersects(box) { |
2492
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
272 intersects = true |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
273 return false |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
274 } |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
275 return true |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
276 }) |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
277 if intersects { |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
278 return IntersectionOverlaps |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
279 } |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
280 } |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
281 |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
282 // No intersection -> check inside or outside |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
283 // if an abritrary point is inside or not. |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
284 point := []float64{box.X1, box.Y1} |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
285 |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
286 // Check holes first: inside a hole means outside. |
2498
843f39b9327e
Handle hole more precisely.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2495
diff
changeset
|
287 if len(p.rings) > 1 { |
2492
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
288 for _, hole := range p.rings[1:] { |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
289 if hole.contains(point) { |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
290 return IntersectionOutSide |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
291 } |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
292 } |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
293 } |
2494
a727e0426240
More on triangle/clipping polygon intersection. TODO: line segment / line segment intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2492
diff
changeset
|
294 |
a727e0426240
More on triangle/clipping polygon intersection. TODO: line segment / line segment intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2492
diff
changeset
|
295 // Check shell |
2492
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
296 if p.rings[0].contains(point) { |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
297 return IntersectionInside |
10681749371d
Implemented the BBox/clipping polygon test. TODO: triangle/clipping polygon test.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2490
diff
changeset
|
298 } |
2488
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
299 return IntersectionOutSide |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
300 } |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
301 |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
302 func (p *Polygon) IntersectionWithTriangle(t *Triangle) IntersectionType { |
2494
a727e0426240
More on triangle/clipping polygon intersection. TODO: line segment / line segment intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2492
diff
changeset
|
303 box := t.BBox() |
a727e0426240
More on triangle/clipping polygon intersection. TODO: line segment / line segment intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2492
diff
changeset
|
304 for _, index := range p.indices { |
a727e0426240
More on triangle/clipping polygon intersection. TODO: line segment / line segment intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2492
diff
changeset
|
305 var intersects bool |
a727e0426240
More on triangle/clipping polygon intersection. TODO: line segment / line segment intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2492
diff
changeset
|
306 index.Search(box, func(item rtree.Item) bool { |
a727e0426240
More on triangle/clipping polygon intersection. TODO: line segment / line segment intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2492
diff
changeset
|
307 ls := item.(lineSegment) |
a727e0426240
More on triangle/clipping polygon intersection. TODO: line segment / line segment intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2492
diff
changeset
|
308 other := make(lineSegment, 4) |
a727e0426240
More on triangle/clipping polygon intersection. TODO: line segment / line segment intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2492
diff
changeset
|
309 for i := range t { |
a727e0426240
More on triangle/clipping polygon intersection. TODO: line segment / line segment intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2492
diff
changeset
|
310 other[0] = t[i].X |
a727e0426240
More on triangle/clipping polygon intersection. TODO: line segment / line segment intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2492
diff
changeset
|
311 other[1] = t[i].Y |
a727e0426240
More on triangle/clipping polygon intersection. TODO: line segment / line segment intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2492
diff
changeset
|
312 other[2] = t[(i+1)%len(t)].X |
a727e0426240
More on triangle/clipping polygon intersection. TODO: line segment / line segment intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2492
diff
changeset
|
313 other[3] = t[(i+1)%len(t)].Y |
a727e0426240
More on triangle/clipping polygon intersection. TODO: line segment / line segment intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2492
diff
changeset
|
314 if ls.intersectsLineSegment(other) { |
a727e0426240
More on triangle/clipping polygon intersection. TODO: line segment / line segment intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2492
diff
changeset
|
315 intersects = true |
a727e0426240
More on triangle/clipping polygon intersection. TODO: line segment / line segment intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2492
diff
changeset
|
316 return false |
a727e0426240
More on triangle/clipping polygon intersection. TODO: line segment / line segment intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2492
diff
changeset
|
317 } |
a727e0426240
More on triangle/clipping polygon intersection. TODO: line segment / line segment intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2492
diff
changeset
|
318 } |
a727e0426240
More on triangle/clipping polygon intersection. TODO: line segment / line segment intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2492
diff
changeset
|
319 return true |
a727e0426240
More on triangle/clipping polygon intersection. TODO: line segment / line segment intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2492
diff
changeset
|
320 }) |
a727e0426240
More on triangle/clipping polygon intersection. TODO: line segment / line segment intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2492
diff
changeset
|
321 if intersects { |
a727e0426240
More on triangle/clipping polygon intersection. TODO: line segment / line segment intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2492
diff
changeset
|
322 return IntersectionOverlaps |
a727e0426240
More on triangle/clipping polygon intersection. TODO: line segment / line segment intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2492
diff
changeset
|
323 } |
a727e0426240
More on triangle/clipping polygon intersection. TODO: line segment / line segment intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2492
diff
changeset
|
324 } |
a727e0426240
More on triangle/clipping polygon intersection. TODO: line segment / line segment intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2492
diff
changeset
|
325 // No intersection -> check inside or outside |
a727e0426240
More on triangle/clipping polygon intersection. TODO: line segment / line segment intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2492
diff
changeset
|
326 // if an abritrary point is inside or not. |
a727e0426240
More on triangle/clipping polygon intersection. TODO: line segment / line segment intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2492
diff
changeset
|
327 point := []float64{t[0].X, t[0].Y} |
a727e0426240
More on triangle/clipping polygon intersection. TODO: line segment / line segment intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2492
diff
changeset
|
328 |
a727e0426240
More on triangle/clipping polygon intersection. TODO: line segment / line segment intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2492
diff
changeset
|
329 // Check holes first: inside a hole means outside. |
2498
843f39b9327e
Handle hole more precisely.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2495
diff
changeset
|
330 if len(p.rings) > 1 { |
2494
a727e0426240
More on triangle/clipping polygon intersection. TODO: line segment / line segment intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2492
diff
changeset
|
331 for _, hole := range p.rings[1:] { |
a727e0426240
More on triangle/clipping polygon intersection. TODO: line segment / line segment intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2492
diff
changeset
|
332 if hole.contains(point) { |
a727e0426240
More on triangle/clipping polygon intersection. TODO: line segment / line segment intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2492
diff
changeset
|
333 return IntersectionOutSide |
a727e0426240
More on triangle/clipping polygon intersection. TODO: line segment / line segment intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2492
diff
changeset
|
334 } |
a727e0426240
More on triangle/clipping polygon intersection. TODO: line segment / line segment intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2492
diff
changeset
|
335 } |
a727e0426240
More on triangle/clipping polygon intersection. TODO: line segment / line segment intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2492
diff
changeset
|
336 } |
a727e0426240
More on triangle/clipping polygon intersection. TODO: line segment / line segment intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2492
diff
changeset
|
337 |
a727e0426240
More on triangle/clipping polygon intersection. TODO: line segment / line segment intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2492
diff
changeset
|
338 // Check shell |
a727e0426240
More on triangle/clipping polygon intersection. TODO: line segment / line segment intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2492
diff
changeset
|
339 if p.rings[0].contains(point) { |
a727e0426240
More on triangle/clipping polygon intersection. TODO: line segment / line segment intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2492
diff
changeset
|
340 return IntersectionInside |
a727e0426240
More on triangle/clipping polygon intersection. TODO: line segment / line segment intersection.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2492
diff
changeset
|
341 } |
2488
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
342 return IntersectionOutSide |
cb55d7eaaa36
Started with the idea to clip an octree by an bounding polygon.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
343 } |
2489
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
344 |
2490
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
345 func (rng ring) isClosed() bool { return (len(rng) / 2) >= 3 } |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
346 |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
347 func (rng ring) contains(point []float64) bool { |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
348 if !rng.isClosed() { |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
349 return false |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
350 } |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
351 |
2498
843f39b9327e
Handle hole more precisely.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2495
diff
changeset
|
352 end := len(rng)/2 - 1 |
843f39b9327e
Handle hole more precisely.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2495
diff
changeset
|
353 |
843f39b9327e
Handle hole more precisely.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2495
diff
changeset
|
354 contains := intersectsWithRaycast(point, rng[:2], rng[end*2:end*2+2]) |
2490
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
355 |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
356 for i := 2; i < len(rng); i += 2 { |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
357 if intersectsWithRaycast(point, rng[i-2:i], rng[i:i+2]) { |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
358 contains = !contains |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
359 } |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
360 } |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
361 |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
362 return contains |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
363 } |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
364 |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
365 // Using the raycast algorithm, this returns whether or not the passed in point |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
366 // Intersects with the edge drawn by the passed in start and end points. |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
367 // Original implementation: http://rosettacode.org/wiki/Ray-casting_algorithm#Go |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
368 func intersectsWithRaycast(point, start, end []float64) bool { |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
369 |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
370 // Always ensure that the the first point |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
371 // has a y coordinate that is less than the second point |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
372 if start[1] > end[1] { |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
373 // Switch the points if otherwise. |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
374 start, end = end, start |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
375 } |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
376 |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
377 // Move the point's y coordinate |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
378 // outside of the bounds of the testing region |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
379 // so we can start drawing a ray |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
380 for point[1] == start[1] || point[1] == end[1] { |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
381 y := math.Nextafter(point[1], math.Inf(1)) |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
382 point = []float64{point[0], y} |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
383 } |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
384 |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
385 // If we are outside of the polygon, indicate so. |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
386 if point[1] < start[1] || point[1] > end[1] { |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
387 return false |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
388 } |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
389 |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
390 if start[0] > end[0] { |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
391 if point[0] > start[0] { |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
392 return false |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
393 } |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
394 if point[0] < end[0] { |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
395 return true |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
396 } |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
397 } else { |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
398 if point[0] > end[0] { |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
399 return false |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
400 } |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
401 if point[0] < start[0] { |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
402 return true |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
403 } |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
404 } |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
405 |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
406 raySlope := (point[1] - start[1]) / (point[0] - start[0]) |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
407 diagSlope := (end[1] - start[1]) / (end[0] - start[0]) |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
408 |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
409 return raySlope >= diagSlope |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
410 } |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
411 |
3658
1c3df921361d
Handle th case that a boundary polygon is uploaded along side with the single beam scan.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3650
diff
changeset
|
412 func (p *Polygon) NumVertices(ring int) int { |
1c3df921361d
Handle th case that a boundary polygon is uploaded along side with the single beam scan.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3650
diff
changeset
|
413 if ring < 0 || ring >= len(p.rings) { |
1c3df921361d
Handle th case that a boundary polygon is uploaded along side with the single beam scan.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3650
diff
changeset
|
414 return 0 |
1c3df921361d
Handle th case that a boundary polygon is uploaded along side with the single beam scan.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3650
diff
changeset
|
415 } |
1c3df921361d
Handle th case that a boundary polygon is uploaded along side with the single beam scan.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3650
diff
changeset
|
416 return len(p.rings[ring]) / 2 |
1c3df921361d
Handle th case that a boundary polygon is uploaded along side with the single beam scan.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3650
diff
changeset
|
417 } |
1c3df921361d
Handle th case that a boundary polygon is uploaded along side with the single beam scan.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3650
diff
changeset
|
418 |
1c3df921361d
Handle th case that a boundary polygon is uploaded along side with the single beam scan.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3650
diff
changeset
|
419 func (p *Polygon) Vertices(ring int, fn func(float64, float64)) { |
1c3df921361d
Handle th case that a boundary polygon is uploaded along side with the single beam scan.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3650
diff
changeset
|
420 if ring < 0 || ring >= len(p.rings) { |
1c3df921361d
Handle th case that a boundary polygon is uploaded along side with the single beam scan.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3650
diff
changeset
|
421 return |
1c3df921361d
Handle th case that a boundary polygon is uploaded along side with the single beam scan.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3650
diff
changeset
|
422 } |
1c3df921361d
Handle th case that a boundary polygon is uploaded along side with the single beam scan.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3650
diff
changeset
|
423 rng := p.rings[ring] |
1c3df921361d
Handle th case that a boundary polygon is uploaded along side with the single beam scan.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3650
diff
changeset
|
424 for i := 0; i < len(rng); i += 2 { |
1c3df921361d
Handle th case that a boundary polygon is uploaded along side with the single beam scan.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3650
diff
changeset
|
425 fn(rng[i+0], rng[i+1]) |
1c3df921361d
Handle th case that a boundary polygon is uploaded along side with the single beam scan.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3650
diff
changeset
|
426 } |
1c3df921361d
Handle th case that a boundary polygon is uploaded along side with the single beam scan.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3650
diff
changeset
|
427 } |
1c3df921361d
Handle th case that a boundary polygon is uploaded along side with the single beam scan.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3650
diff
changeset
|
428 |
3650
01ce3ba9b0d0
Fixed generating of random points.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2587
diff
changeset
|
429 func (p *Polygon) AsWKB() []byte { |
01ce3ba9b0d0
Fixed generating of random points.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2587
diff
changeset
|
430 |
01ce3ba9b0d0
Fixed generating of random points.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2587
diff
changeset
|
431 size := 1 + 4 + 4 |
01ce3ba9b0d0
Fixed generating of random points.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2587
diff
changeset
|
432 for _, r := range p.rings { |
01ce3ba9b0d0
Fixed generating of random points.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2587
diff
changeset
|
433 size += 4 + len(r)*8 |
01ce3ba9b0d0
Fixed generating of random points.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2587
diff
changeset
|
434 } |
01ce3ba9b0d0
Fixed generating of random points.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2587
diff
changeset
|
435 |
01ce3ba9b0d0
Fixed generating of random points.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2587
diff
changeset
|
436 buf := bytes.NewBuffer(make([]byte, 0, size)) |
01ce3ba9b0d0
Fixed generating of random points.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2587
diff
changeset
|
437 |
01ce3ba9b0d0
Fixed generating of random points.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2587
diff
changeset
|
438 binary.Write(buf, binary.LittleEndian, wkb.NDR) |
01ce3ba9b0d0
Fixed generating of random points.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2587
diff
changeset
|
439 binary.Write(buf, binary.LittleEndian, wkb.Polygon) |
01ce3ba9b0d0
Fixed generating of random points.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2587
diff
changeset
|
440 binary.Write(buf, binary.LittleEndian, uint32(len(p.rings))) |
01ce3ba9b0d0
Fixed generating of random points.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2587
diff
changeset
|
441 |
01ce3ba9b0d0
Fixed generating of random points.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2587
diff
changeset
|
442 for _, r := range p.rings { |
01ce3ba9b0d0
Fixed generating of random points.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2587
diff
changeset
|
443 binary.Write(buf, binary.LittleEndian, uint32(len(r)/2)) |
01ce3ba9b0d0
Fixed generating of random points.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2587
diff
changeset
|
444 for i := 0; i < len(r); i += 2 { |
01ce3ba9b0d0
Fixed generating of random points.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2587
diff
changeset
|
445 binary.Write(buf, binary.LittleEndian, math.Float64bits(r[i+0])) |
01ce3ba9b0d0
Fixed generating of random points.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2587
diff
changeset
|
446 binary.Write(buf, binary.LittleEndian, math.Float64bits(r[i+1])) |
01ce3ba9b0d0
Fixed generating of random points.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2587
diff
changeset
|
447 } |
01ce3ba9b0d0
Fixed generating of random points.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2587
diff
changeset
|
448 } |
01ce3ba9b0d0
Fixed generating of random points.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2587
diff
changeset
|
449 |
01ce3ba9b0d0
Fixed generating of random points.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2587
diff
changeset
|
450 return buf.Bytes() |
01ce3ba9b0d0
Fixed generating of random points.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2587
diff
changeset
|
451 } |
01ce3ba9b0d0
Fixed generating of random points.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2587
diff
changeset
|
452 |
2489
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
453 func (p *Polygon) FromWKB(data []byte) error { |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
454 |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
455 r := bytes.NewReader(data) |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
456 |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
457 endian, err := r.ReadByte() |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
458 |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
459 var order binary.ByteOrder |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
460 |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
461 switch { |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
462 case err != nil: |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
463 return err |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
464 case endian == wkb.NDR: |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
465 order = binary.LittleEndian |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
466 case endian == wkb.XDR: |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
467 order = binary.BigEndian |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
468 default: |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
469 return fmt.Errorf("unknown byte order %x", endian) |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
470 } |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
471 |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
472 var geomType uint32 |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
473 err = binary.Read(r, order, &geomType) |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
474 |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
475 switch { |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
476 case err != nil: |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
477 return err |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
478 case geomType != wkb.Polygon: |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
479 return fmt.Errorf("unknown geometry type %x", geomType) |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
480 } |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
481 |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
482 var numRings uint32 |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
483 if err = binary.Read(r, order, &numRings); err != nil { |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
484 return err |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
485 } |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
486 |
2490
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
487 rngs := make([]ring, numRings) |
2489
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
488 |
2498
843f39b9327e
Handle hole more precisely.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2495
diff
changeset
|
489 log.Printf("info: Number of rings: %d\n", len(rngs)) |
843f39b9327e
Handle hole more precisely.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2495
diff
changeset
|
490 |
2490
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
491 for rng := uint32(0); rng < numRings; rng++ { |
2489
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
492 var numVertices uint32 |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
493 if err = binary.Read(r, order, &numVertices); err != nil { |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
494 return err |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
495 } |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
496 |
2498
843f39b9327e
Handle hole more precisely.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2495
diff
changeset
|
497 log.Printf("info: Number of vertices in ring %d: %d\n", rng, numVertices) |
843f39b9327e
Handle hole more precisely.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2495
diff
changeset
|
498 |
2490
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
499 numVertices *= 2 |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
500 vertices := make([]float64, numVertices) |
2489
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
501 |
2490
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
502 for v := uint32(0); v < numVertices; v += 2 { |
2489
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
503 var lat, lon uint64 |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
504 if err = binary.Read(r, order, &lat); err != nil { |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
505 return err |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
506 } |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
507 if err = binary.Read(r, order, &lon); err != nil { |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
508 return err |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
509 } |
2490
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
510 vertices[v] = math.Float64frombits(lat) |
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
511 vertices[v+1] = math.Float64frombits(lon) |
2489
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
512 } |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
513 |
2490
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
514 rngs[rng] = vertices |
2489
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
515 } |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
516 |
2490
c9164ff98871
Started with point in polygon check.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2489
diff
changeset
|
517 p.rings = rngs |
2489
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
518 |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
519 return nil |
4f292ff74d9e
Added a WKB reader for clipping polygon.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
2488
diff
changeset
|
520 } |
3650
01ce3ba9b0d0
Fixed generating of random points.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2587
diff
changeset
|
521 |
01ce3ba9b0d0
Fixed generating of random points.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2587
diff
changeset
|
522 func (p *Polygon) FromLineStringZ(ls LineStringZ) { |
01ce3ba9b0d0
Fixed generating of random points.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2587
diff
changeset
|
523 r := make([]float64, 2*len(ls)) |
01ce3ba9b0d0
Fixed generating of random points.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2587
diff
changeset
|
524 var pos int |
01ce3ba9b0d0
Fixed generating of random points.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2587
diff
changeset
|
525 for i := range ls { |
01ce3ba9b0d0
Fixed generating of random points.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2587
diff
changeset
|
526 r[pos+0] = ls[i].X |
01ce3ba9b0d0
Fixed generating of random points.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2587
diff
changeset
|
527 r[pos+1] = ls[i].Y |
01ce3ba9b0d0
Fixed generating of random points.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2587
diff
changeset
|
528 pos += 2 |
01ce3ba9b0d0
Fixed generating of random points.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2587
diff
changeset
|
529 } |
01ce3ba9b0d0
Fixed generating of random points.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2587
diff
changeset
|
530 p.rings = []ring{r} |
01ce3ba9b0d0
Fixed generating of random points.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2587
diff
changeset
|
531 } |