Mercurial > repos > public > sbplib_julia
comparison src/Grids/geometry.jl @ 1978:d7a5129517d9 feature/grids/geometry_functions
Add docstrings
author | Jonatan Werpers <jonatan@werpers.com> |
---|---|
date | Wed, 26 Feb 2025 15:40:19 +0100 |
parents | 270675bb97be |
children | db3383581b9f |
comparison
equal
deleted
inserted
replaced
1977:270675bb97be | 1978:d7a5129517d9 |
---|---|
3 tangent::PT | 3 tangent::PT |
4 | 4 |
5 Line{PT}(p::PT, tangent::PT) where PT = new{PT}(p,tangent) | 5 Line{PT}(p::PT, tangent::PT) where PT = new{PT}(p,tangent) |
6 end | 6 end |
7 | 7 |
8 """ | |
9 Line(p,t) | |
10 | |
11 A line, as a callable object, starting at `p` with tangent `t`. | |
12 | |
13 # Example | |
14 ```julia-repl | |
15 julia> l = Grids.Line([1,1],[2,1]) | |
16 Diffinitive.Grids.Line{StaticArraysCore.SVector{2, Int64}}([1, 1], [2, 1]) | |
17 | |
18 julia> l(0) | |
19 2-element StaticArraysCore.SVector{2, Int64} with indices SOneTo(2): | |
20 1 | |
21 1 | |
22 | |
23 julia> l(1) | |
24 2-element StaticArraysCore.SVector{2, Int64} with indices SOneTo(2): | |
25 3 | |
26 2 | |
27 ``` | |
28 | |
29 See also: [`LineSegment`](@ref). | |
30 """ | |
8 function Line(p, t) | 31 function Line(p, t) |
9 p = SVector{length(p)}(p) | 32 p = SVector{length(p)}(p) |
10 t = SVector{length(t)}(t) | 33 t = SVector{length(t)}(t) |
11 p, t = promote(p, t) | 34 p, t = promote(p, t) |
12 | 35 |
22 b::PT | 45 b::PT |
23 | 46 |
24 LineSegment{PT}(p::PT, tangent::PT) where PT = new{PT}(p,tangent) | 47 LineSegment{PT}(p::PT, tangent::PT) where PT = new{PT}(p,tangent) |
25 end | 48 end |
26 | 49 |
50 """ | |
51 LineSegment(a,b) | |
52 | |
53 A line segment, as a callable object, from `a` to `b`. | |
54 | |
55 # Example | |
56 ```julia-repl | |
57 julia> l = Grids.LineSegment([1,1],[2,1]) | |
58 Diffinitive.Grids.LineSegment{StaticArraysCore.SVector{2, Int64}}([1, 1], [2, 1]) | |
59 | |
60 julia> l(0) | |
61 2-element StaticArraysCore.SVector{2, Int64} with indices SOneTo(2): | |
62 1 | |
63 1 | |
64 | |
65 julia> l(0.5) | |
66 2-element StaticArraysCore.SVector{2, Float64} with indices SOneTo(2): | |
67 1.5 | |
68 1.0 | |
69 | |
70 julia> l(1) | |
71 2-element StaticArraysCore.SVector{2, Int64} with indices SOneTo(2): | |
72 2 | |
73 1 | |
74 ``` | |
75 | |
76 See also: [`Line`](@ref). | |
77 """ | |
27 function LineSegment(a, b) | 78 function LineSegment(a, b) |
28 a = SVector{length(a)}(a) | 79 a = SVector{length(a)}(a) |
29 b = SVector{length(b)}(b) | 80 b = SVector{length(b)}(b) |
30 a, b = promote(a, b) | 81 a, b = promote(a, b) |
31 | 82 |
34 | 85 |
35 (c::LineSegment)(s) = (1-s)*c.a + s*c.b | 86 (c::LineSegment)(s) = (1-s)*c.a + s*c.b |
36 | 87 |
37 Grids.jacobian(c::LineSegment, s) = c.b - c.a | 88 Grids.jacobian(c::LineSegment, s) = c.b - c.a |
38 | 89 |
90 """ | |
91 linesegments(ps...) | |
92 | |
93 An array of line segments between the points `ps[1]`, `ps[2]`, and so on. | |
94 | |
95 See also: [`polygon_edges`](@ref). | |
96 """ | |
39 function linesegments(ps...) | 97 function linesegments(ps...) |
40 return [LineSegment(ps[i], ps[i+1]) for i ∈ 1:length(ps)-1] | 98 return [LineSegment(ps[i], ps[i+1]) for i ∈ 1:length(ps)-1] |
41 end | 99 end |
42 | 100 |
43 | 101 |
102 """ | |
103 polygon_edges(ps...) | |
104 | |
105 An array of line segments between the points `ps[1]`, `ps[2]`, and so on | |
106 including the segment between `ps[end]` and `ps[1]`. | |
107 | |
108 See also: [`linesegments`](@ref). | |
109 """ | |
44 function polygon_edges(ps...) | 110 function polygon_edges(ps...) |
45 n = length(ps) | 111 n = length(ps) |
46 return [LineSegment(ps[i], ps[mod1(i+1,n)]) for i ∈ eachindex(ps)] | 112 return [LineSegment(ps[i], ps[mod1(i+1,n)]) for i ∈ eachindex(ps)] |
47 end | 113 end |
48 | 114 |
51 r::T | 117 r::T |
52 | 118 |
53 Circle{PT,T}(c,r) where {PT,T} = new{PT,T}(c,r) | 119 Circle{PT,T}(c,r) where {PT,T} = new{PT,T}(c,r) |
54 end | 120 end |
55 | 121 |
122 """ | |
123 Circle(c,r) | |
124 | |
125 A circle with center `c` and radius `r` paramatrized with the angle to the x-axis. | |
126 | |
127 # Example | |
128 ```julia-repl | |
129 julia> c = Grids.Circle([1,1], 2) | |
130 Diffinitive.Grids.Circle{StaticArraysCore.SVector{2, Int64}, Int64}([1, 1], 2) | |
131 | |
132 julia> c(0) | |
133 2-element StaticArraysCore.SVector{2, Float64} with indices SOneTo(2): | |
134 3.0 | |
135 1.0 | |
136 | |
137 julia> c(π/2) | |
138 2-element StaticArraysCore.SVector{2, Float64} with indices SOneTo(2): | |
139 1.0000000000000002 | |
140 3.0 | |
141 ``` | |
142 """ | |
56 function Circle(c,r) | 143 function Circle(c,r) |
57 c = SVector{2}(c) | 144 c = SVector{2}(c) |
58 return Circle{typeof(c), typeof(r)}(c,r) | 145 return Circle{typeof(c), typeof(r)}(c,r) |
59 end | 146 end |
60 | 147 |
66 function Grids.jacobian(C::Circle, θ) | 153 function Grids.jacobian(C::Circle, θ) |
67 (;r) = C | 154 (;r) = C |
68 r*@SVector[-sin(θ), cos(θ)] | 155 r*@SVector[-sin(θ), cos(θ)] |
69 end | 156 end |
70 | 157 |
158 """ | |
159 TransfiniteInterpolationSurface(c₁, c₂, c₃, c₄) | |
160 | |
161 A surface defined by the transfinite interpolation of the curves `c₁`, `c₂`, `c₃`, and `c₄`. | |
162 """ | |
71 struct TransfiniteInterpolationSurface{T1,T2,T3,T4} | 163 struct TransfiniteInterpolationSurface{T1,T2,T3,T4} |
72 c₁::T1 | 164 c₁::T1 |
73 c₂::T2 | 165 c₂::T2 |
74 c₃::T3 | 166 c₃::T3 |
75 c₄::T4 | 167 c₄::T4 |
88 | 180 |
89 function (s::TransfiniteInterpolationSurface)(ξ̄::AbstractArray) | 181 function (s::TransfiniteInterpolationSurface)(ξ̄::AbstractArray) |
90 s(ξ̄...) | 182 s(ξ̄...) |
91 end | 183 end |
92 | 184 |
185 """ | |
186 check_transfiniteinterpolation(s::TransfiniteInterpolationSurface) | |
187 | |
188 Throw an error if the ends of the curves in the transfinite interpolation do not match. | |
189 """ | |
93 function check_transfiniteinterpolation(s::TransfiniteInterpolationSurface) | 190 function check_transfiniteinterpolation(s::TransfiniteInterpolationSurface) |
94 if check_transfiniteinterpolation(Bool, s) | 191 if check_transfiniteinterpolation(Bool, s) |
95 return nothing | 192 return nothing |
96 else | 193 else |
97 error("The end of each curve in the transfinite interpolation should be the same as the beginning of the next curve.") | 194 error("The end of each curve in the transfinite interpolation should be the same as the beginning of the next curve.") |
98 end | 195 end |
99 end | 196 end |
100 | 197 |
198 """ | |
199 check_transfiniteinterpolation(::Type{Bool}, s::TransfiniteInterpolationSurface) | |
200 | |
201 Return true if the ends of the curves in the transfinite interpolation match. | |
202 """ | |
101 function check_transfiniteinterpolation(::Type{Bool}, s::TransfiniteInterpolationSurface) | 203 function check_transfiniteinterpolation(::Type{Bool}, s::TransfiniteInterpolationSurface) |
102 if !isapprox(s.c₁(1), s.c₂(0)) | 204 if !isapprox(s.c₁(1), s.c₂(0)) |
103 return false | 205 return false |
104 end | 206 end |
105 | 207 |
141 -(1-u)*P₀₀ - u*P₁₀ + u*P₁₁ + (1-u)*P₀₁ | 243 -(1-u)*P₀₀ - u*P₁₀ + u*P₁₁ + (1-u)*P₀₁ |
142 ) | 244 ) |
143 | 245 |
144 return [∂x̄∂ξ₁ ∂x̄∂ξ₂] | 246 return [∂x̄∂ξ₁ ∂x̄∂ξ₂] |
145 end | 247 end |
146 | |
147 # TODO: Implement jacobian() for the different mapping helpers | |
148 # TODO: Add doc strings |