Skip to content

Commit e5d3d51

Browse files
eliascarvjuliohm
andauthored
Add method for measure of Segment with Ellipsoid manifold (#1069)
* Add method for 'measure' of 'Segment' with Ellipsoid manifold * Apply suggestions from code review Co-authored-by: Júlio Hoffimann <[email protected]> --------- Co-authored-by: Júlio Hoffimann <[email protected]>
1 parent f82d8cf commit e5d3d51

File tree

4 files changed

+26
-18
lines changed

4 files changed

+26
-18
lines changed

src/discretization/maxlength.jl

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ function discretize(box::Box, method::MaxLengthDiscretization)
2020
end
2121

2222
function discretize(segment::Segment, method::MaxLengthDiscretization)
23-
size = ceil(Int, _measure(segment) / method.length)
23+
size = ceil(Int, measure(segment) / method.length)
2424
discretize(segment, RegularDiscretization(size))
2525
end
2626

@@ -41,18 +41,5 @@ function _sides(box::Box{<:🌐})
4141

4242
AP = Segment(A, P)
4343
PB = Segment(P, B)
44-
(_measure(AP), _measure(PB))
45-
end
46-
47-
_measure(segment::Segment{<:𝔼}) = measure(segment)
48-
49-
# TODO: Haversine returns the shortest distance between two points
50-
# this is not always equal to the distance between two directed points
51-
function _measure(segment::Segment{<:🌐})
52-
T = numtype(lentype(segment))
53-
🌎 = ellipsoid(datum(crs(segment)))
54-
r = numconvert(T, majoraxis(🌎))
55-
56-
A, B = extrema(segment)
57-
evaluate(Haversine(r), A, B)
44+
(measure(AP), measure(PB))
5845
end

src/geometries/primitives/box.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,9 @@ Base.maximum(b::Box) = b.max
5151

5252
Base.extrema(b::Box) = b.min, b.max
5353

54-
diagonal(b::Box) = norm(b.max - b.min)
54+
diagonal(b::Box{<:𝔼}) = norm(b.max - b.min)
5555

56-
sides(b::Box) = Tuple(b.max - b.min)
56+
sides(b::Box{<:𝔼}) = Tuple(b.max - b.min)
5757

5858
==(b₁::Box, b₂::Box) = b₁.min == b₂.min && b₁.max == b₂.max
5959

src/measures.jl

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,17 @@ function measure(t::Torus)
7575
4 * T(π)^2 * R * r
7676
end
7777

78-
measure(s::Segment) = norm(maximum(s) - minimum(s))
78+
measure(s::Segment{<:𝔼}) = norm(maximum(s) - minimum(s))
79+
80+
# TODO: replace Haversine by an appropriate geodesic distance
81+
# that considers the west-east orientation of segments
82+
function measure(s::Segment{<:🌐})
83+
T = numtype(lentype(s))
84+
🌎 = ellipsoid(datum(crs(s)))
85+
r = numconvert(T, majoraxis(🌎))
86+
87+
evaluate(Haversine(r), extrema(s)...)
88+
end
7989

8090
function measure(t::Triangle)
8191
A, B, C = vertices(t)

test/polytopes.jl

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,17 @@
7171
s = Segment(merc(0, 0), merc(1, 1))
7272
@test crs(s(T(0))) === crs(s)
7373

74+
# measure
75+
s = Segment(merc(0, 0), merc(1, 1))
76+
@test measure(s) T(2) * u"m"
77+
s = Segment(latlon(0, 45), latlon(0, 135))
78+
r = majoraxis(ellipsoid(datum(crs(s))))
79+
C = 2 * T(π) * (r)
80+
@test measure(s) C / 4
81+
# TODO: fix measure of segments on the globe
82+
s = Segment(latlon(0, 135), latlon(0, 45))
83+
@test_broken measure(s) 3C / 4
84+
7485
s = Segment(cart(0, 0), cart(1, 1))
7586
@test sprint(show, s) == "Segment((x: 0.0 m, y: 0.0 m), (x: 1.0 m, y: 1.0 m))"
7687
if T === Float32

0 commit comments

Comments
 (0)