Skip to content

Commit b0be05a

Browse files
committed
likely broken merge attempt
2 parents cba8ec8 + 9b2d1fc commit b0be05a

File tree

9 files changed

+299
-18
lines changed

9 files changed

+299
-18
lines changed

.github/workflows/ci.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ on:
33
push:
44
branches:
55
- master
6-
tags: '*'
6+
tags: "*"
77
pull_request:
88
branches:
99
- master
@@ -15,8 +15,8 @@ jobs:
1515
fail-fast: false
1616
matrix:
1717
version:
18-
- '1.5'
19-
- '1.7'
18+
- "1.6"
19+
- "1"
2020
os:
2121
- ubuntu-latest
2222
- macOS-latest
@@ -54,7 +54,7 @@ jobs:
5454
- uses: actions/checkout@v2
5555
- uses: julia-actions/setup-julia@v1
5656
with:
57-
version: '1.7'
57+
version: "1.7"
5858
- run: |
5959
julia --project=docs -e '
6060
using Pkg

Project.toml

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,27 @@
11
name = "GeometryBasics"
22
uuid = "5c1252a2-5f33-56bf-86c9-59e7332b4326"
33
authors = ["SimonDanisch <[email protected]>"]
4-
version = "0.4.2"
4+
version = "0.4.3"
55

66
[deps]
77
EarCut_jll = "5ae413db-bbd1-5e63-b57d-d24a61df00f5"
8+
GeoInterface = "cf35fbd7-0cd7-5166-be24-54bfbe79505f"
89
IterTools = "c8e1da08-722c-5040-9ed9-7db0dc04731e"
910
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
1011
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
1112

1213
[compat]
14+
EarCut_jll = "2"
15+
GeoInterface = "1.0.1"
1316
IterTools = "1.3.0"
14-
julia = "1.5"
17+
julia = "1.6"
1518

1619
[extras]
20+
Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595"
21+
GeoJSON = "61d90e0f-e114-555e-ac52-39dfb47a3ef9"
1722
OffsetArrays = "6fe1bfb0-de20-5000-8ca7-80f57d26f881"
1823
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
1924
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
20-
StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
2125

2226
[targets]
23-
test = ["Test", "Random", "StaticArrays", "OffsetArrays"]
27+
test = ["Aqua", "GeoJSON", "Test", "Random", "OffsetArrays"]

src/GeometryBasics.jl

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
module GeometryBasics
22

33
using IterTools, LinearAlgebra
4+
using GeoInterface
45
using EarCut_jll
56
import Base: *
67

@@ -24,6 +25,8 @@ include("triangulation.jl")
2425
include("lines.jl")
2526
include("boundingboxes.jl")
2627

28+
include("geointerface.jl")
29+
2730
export AbstractGeometry, GeometryPrimitive
2831
export Mat, Point, Vec
2932
export LineFace, Polytope, Line, NgonFace, convert_simplex
@@ -40,6 +43,7 @@ export Tesselation, Normal, UV, UVW
4043
export AbstractMesh, Mesh, MetaMesh
4144
export add_meta, pop_meta
4245

46+
4347
# all the different predefined mesh types
4448
# Note: meshes can contain arbitrary meta information,
4549
export AbstractMesh
@@ -48,11 +52,11 @@ export AbstractMesh
4852
export triangle_mesh, triangle_mesh, uv_mesh
4953
export uv_mesh, normal_mesh, uv_normal_mesh
5054

51-
export height, origin, radius, width, widths, xwidth, yheight
55+
export height, origin, radius, width, widths
5256
export HyperSphere, Circle, Sphere
5357
export Cylinder, Cylinder2, Cylinder3, Pyramid, extremity
5458
export HyperRectangle, Rect, Rect2, Rect3, Recti, Rect2i, Rect3i, Rectf, Rect2f, Rect3f
55-
export before, during, isinside, isoutside, meets, overlaps, intersects, finishes
59+
export before, during, meets, overlaps, intersects, finishes
5660
export centered, direction, area, volume, update
5761
export max_dist_dim, max_euclidean, max_euclideansq, min_dist_dim, min_euclidean
5862
export min_euclideansq, minmax_dist_dim, minmax_euclidean, minmax_euclideansq

src/basic_types.jl

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,53 @@ function coordinates(polygon::Polygon{N,T}) where {N,T}
221221
end
222222
end
223223

224+
"""
225+
MultiPolygon(polygons::AbstractPolygon)
226+
"""
227+
struct MultiPolygon{Dim,T<:Real,Element<:AbstractPolygon{Dim,T},
228+
A<:AbstractVector{Element}} <: AbstractVector{Element}
229+
polygons::A
230+
end
231+
232+
function MultiPolygon(polygons::AbstractVector{P};
233+
kw...) where {P<:AbstractPolygon{Dim,T}} where {Dim,T}
234+
return MultiPolygon(meta(polygons; kw...))
235+
end
236+
237+
Base.getindex(mp::MultiPolygon, i) = mp.polygons[i]
238+
Base.size(mp::MultiPolygon) = size(mp.polygons)
239+
240+
struct MultiLineString{Dim,T<:Real,Element<:LineString{Dim,T},A<:AbstractVector{Element}} <:
241+
AbstractVector{Element}
242+
linestrings::A
243+
end
244+
245+
function MultiLineString(linestrings::AbstractVector{L};
246+
kw...) where {L<:AbstractVector{LineP{Dim,T,P}}} where {Dim,T,P}
247+
return MultiLineString(meta(linestrings; kw...))
248+
end
249+
250+
Base.getindex(ms::MultiLineString, i) = ms.linestrings[i]
251+
Base.size(ms::MultiLineString) = size(ms.linestrings)
252+
253+
"""
254+
MultiPoint(points::AbstractVector{AbstractPoint})
255+
256+
A collection of points
257+
"""
258+
struct MultiPoint{Dim,T<:Real,P<:AbstractPoint{Dim,T},A<:AbstractVector{P}} <:
259+
AbstractVector{P}
260+
points::A
261+
end
262+
263+
function MultiPoint(points::AbstractVector{P};
264+
kw...) where {P<:AbstractPoint{Dim,T}} where {Dim,T}
265+
return MultiPoint(meta(points; kw...))
266+
end
267+
268+
Base.getindex(mpt::MultiPoint, i) = mpt.points[i]
269+
Base.size(mpt::MultiPoint) = size(mpt.points)
270+
224271
"""
225272
AbstractMesh
226273

src/geointerface.jl

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
# Implementation of trait based interface from https://github.com/JuliaGeo/GeoInterface.jl/
2+
3+
GeoInterface.isgeometry(::Type{<:AbstractGeometry}) = true
4+
GeoInterface.isgeometry(::Type{<:AbstractFace}) = true
5+
GeoInterface.isgeometry(::Type{<:AbstractPoint}) = true
6+
GeoInterface.isgeometry(::Type{<:AbstractVector{<:AbstractGeometry}}) = true
7+
GeoInterface.isgeometry(::Type{<:AbstractVector{<:AbstractPoint}}) = true
8+
GeoInterface.isgeometry(::Type{<:AbstractVector{<:LineString}}) = true
9+
GeoInterface.isgeometry(::Type{<:AbstractVector{<:AbstractPolygon}}) = true
10+
GeoInterface.isgeometry(::Type{<:AbstractVector{<:AbstractFace}}) = true
11+
GeoInterface.isgeometry(::Type{<:Mesh}) = true
12+
13+
GeoInterface.geomtrait(::Point) = PointTrait()
14+
GeoInterface.geomtrait(::Line) = LineTrait()
15+
GeoInterface.geomtrait(::LineString) = LineStringTrait()
16+
GeoInterface.geomtrait(::Polygon) = PolygonTrait()
17+
GeoInterface.geomtrait(::MultiPoint) = MultiPointTrait()
18+
GeoInterface.geomtrait(::MultiLineString) = MultiLineStringTrait()
19+
GeoInterface.geomtrait(::MultiPolygon) = MultiPolygonTrait()
20+
GeoInterface.geomtrait(::Ngon) = PolygonTrait()
21+
GeoInterface.geomtrait(::AbstractMesh) = PolyhedralSurfaceTrait()
22+
23+
GeoInterface.geomtrait(::Simplex{Dim,T,1}) where {Dim,T} = PointTrait()
24+
GeoInterface.geomtrait(::Simplex{Dim,T,2}) where {Dim,T} = LineStringTrait()
25+
GeoInterface.geomtrait(::Simplex{Dim,T,3}) where {Dim,T} = PolygonTrait()
26+
27+
GeoInterface.ncoord(::PointTrait, g::Point) = length(g)
28+
GeoInterface.getcoord(::PointTrait, g::Point, i::Int) = g[i]
29+
30+
GeoInterface.ngeom(::LineTrait, g::Line) = length(g)
31+
GeoInterface.getgeom(::LineTrait, g::Line, i::Int) = g[i]
32+
33+
GeoInterface.ngeom(::LineStringTrait, g::LineString) = length(g) + 1 # n line segments + 1
34+
function GeoInterface.getgeom(::LineStringTrait, g::LineString, i::Int)
35+
return GeometryBasics.coordinates(g)[i]
36+
end
37+
38+
GeoInterface.ngeom(::PolygonTrait, g::Polygon) = length(g.interiors) + 1 # +1 for exterior
39+
function GeoInterface.getgeom(::PolygonTrait,
40+
g::Polygon,
41+
i::Int)::typeof(g.exterior)
42+
return i > 1 ? g.interiors[i - 1] : g.exterior
43+
end
44+
45+
GeoInterface.ngeom(::MultiPointTrait, g::MultiPoint) = length(g)
46+
GeoInterface.getgeom(::MultiPointTrait, g::MultiPoint, i::Int) = g[i]
47+
48+
function GeoInterface.ngeom(::MultiLineStringTrait, g::MultiLineString)
49+
return length(g)
50+
end
51+
function GeoInterface.getgeom(::MultiLineStringTrait, g::MultiLineString,
52+
i::Int)
53+
return g[i]
54+
end
55+
56+
GeoInterface.ngeom(::MultiPolygonTrait, g::MultiPolygon) = length(g)
57+
GeoInterface.getgeom(::MultiPolygonTrait, g::MultiPolygon, i::Int) = g[i]
58+
59+
function GeoInterface.ncoord(::AbstractGeometryTrait,
60+
::Simplex{Dim,T,N,P}) where {Dim,T,N,P}
61+
return Dim
62+
end
63+
function GeoInterface.ncoord(::AbstractGeometryTrait,
64+
::AbstractGeometry{Dim,T}) where {Dim,T}
65+
return Dim
66+
end
67+
function GeoInterface.ngeom(::AbstractGeometryTrait,
68+
::Simplex{Dim,T,N,P}) where {Dim,T,N,P}
69+
return N
70+
end
71+
GeoInterface.ngeom(::PolygonTrait, ::Ngon) = 1 # can't have any holes
72+
GeoInterface.getgeom(::PolygonTrait, g::Ngon, _) = LineString(g.points)
73+
74+
function GeoInterface.ncoord(::PolyhedralSurfaceTrait,
75+
::Mesh{Dim,T,E,V} where {Dim,T,E,V})
76+
return Dim
77+
end
78+
GeoInterface.ngeom(::PolyhedralSurfaceTrait, g::AbstractMesh) = length(g)
79+
GeoInterface.getgeom(::PolyhedralSurfaceTrait, g::AbstractMesh, i) = g[i]
80+
81+
function GeoInterface.convert(::Type{Point}, type::PointTrait, geom)
82+
dim = Int(ncoord(geom))
83+
return Point{dim}(GeoInterface.coordinates(geom))
84+
end
85+
86+
function GeoInterface.convert(::Type{LineString}, type::LineStringTrait, geom)
87+
dim = Int(ncoord(geom))
88+
return LineString([Point{dim}(GeoInterface.coordinates(p)) for p in getgeom(geom)])
89+
end
90+
91+
function GeoInterface.convert(::Type{Polygon}, type::PolygonTrait, geom)
92+
t = LineStringTrait()
93+
exterior = GeoInterface.convert(LineString, t, GeoInterface.getexterior(geom))
94+
if GeoInterface.nhole(geom) == 0
95+
return Polygon(exterior)
96+
else
97+
interiors = GeoInterface.convert.(LineString, Ref(t), GeoInterface.gethole(geom))
98+
return Polygon(exterior, interiors)
99+
end
100+
end
101+
102+
function GeoInterface.convert(::Type{MultiPoint}, type::MultiPointTrait, geom)
103+
dim = Int(ncoord(geom))
104+
return MultiPoint([Point{dim}(GeoInterface.coordinates(p)) for p in getgeom(geom)])
105+
end
106+
107+
function GeoInterface.convert(::Type{MultiLineString}, type::MultiLineStringTrait, geom)
108+
t = LineStringTrait()
109+
return MultiLineString([GeoInterface.convert(LineString, t, l) for l in getgeom(geom)])
110+
end
111+
112+
function GeoInterface.convert(::Type{MultiPolygon}, type::MultiPolygonTrait, geom)
113+
t = PolygonTrait()
114+
return MultiPolygon([GeoInterface.convert(Polygon, t, poly) for poly in getgeom(geom)])
115+
end

src/meshes.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ end
7777
Calculate the signed volume of one tetrahedron. Be sure the orientation of your
7878
surface is right.
7979
"""
80-
function volume(triangle::Triangle) where {VT,FT}
80+
function volume(triangle::Triangle)
8181
v1, v2, v3 = triangle
8282
sig = sign(orthogonal_vector(v1, v2, v3) v1)
8383
return sig * abs(v1 (v2 × v3)) / 6
@@ -89,7 +89,7 @@ end
8989
Calculate the signed volume of all tetrahedra. Be sure the orientation of your
9090
surface is right.
9191
"""
92-
function volume(mesh::Mesh) where {VT,FT}
92+
function volume(mesh::Mesh)
9393
return sum(volume, mesh)
9494
end
9595

src/primitives/rectangles.jl

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,16 +48,16 @@ function Rect(v1::Vec{N,T1}, v2::Vec{N,T2}) where {N,T1,T2}
4848
return Rect{N,T}(Vec{N,T}(v1), Vec{N,T}(v2))
4949
end
5050

51-
function RectT{T}(v1::VecTypes{N,T1}, v2::VecTypes{N,T2}) where {N,T,T1,T2}
51+
function RectT{T}(v1::VecTypes{N}, v2::VecTypes{N}) where {N,T}
5252
return if T <: Integer
5353
Rect{N,T}(round.(T, v1), round.(T, v2))
5454
else
5555
return Rect{N,T}(Vec{N,T}(v1), Vec{N,T}(v2))
5656
end
5757
end
5858

59-
function Rect{N}(v1::VecTypes{N,T1}, v2::VecTypes{N,T2}) where {N,T1,T2}
60-
T = promote_type(T1, T2)
59+
function Rect{N}(v1::VecTypes{N}, v2::VecTypes{N}) where {N}
60+
T = promote_type(eltype(v1), eltype(v2))
6161
return Rect{N,T}(Vec{N,T}(v1), Vec{N,T}(v2))
6262
end
6363

@@ -67,7 +67,7 @@ end
6767
```
6868
Rect(vals::Number...)
6969
```
70-
Rect constructor for indidually specified intervals.
70+
Rect constructor for individually specified intervals.
7171
e.g. Rect(0,0,1,2) has origin == Vec(0,0) and
7272
width == Vec(1,2)
7373
"""
@@ -512,7 +512,7 @@ Base.isequal(b1::Rect, b2::Rect) = b1 == b2
512512

513513
centered(R::Type{Rect{N,T}}) where {N,T} = R(Vec{N,T}(-0.5), Vec{N,T}(1))
514514
centered(R::Type{Rect{N}}) where {N} = R(Vec{N,Float32}(-0.5), Vec{N,Float32}(1))
515-
centered(R::Type{Rect}) where {N} = R(Vec{2,Float32}(-0.5), Vec{2,Float32}(1))
515+
centered(R::Type{Rect}) = R(Vec{2,Float32}(-0.5), Vec{2,Float32}(1))
516516

517517
##
518518
# Rect2 decomposition

0 commit comments

Comments
 (0)