comparison src/Grids/geometry.jl @ 2012:4617e4b74b82 feature/grids/geometry_functions

Add arc() for constructing circle arcs between two points
author Jonatan Werpers <jonatan@werpers.com>
date Wed, 07 May 2025 08:39:06 +0200
parents d0b6c63c506e
children 7895b509f9bf
comparison
equal deleted inserted replaced
2011:d0b6c63c506e 2012:4617e4b74b82
177 return A.c((1-t)*θ₀ + t*θ₁) 177 return A.c((1-t)*θ₀ + t*θ₁)
178 end 178 end
179 179
180 function Grids.jacobian(a::Arc, t) 180 function Grids.jacobian(a::Arc, t)
181 return nothing 181 return nothing
182 end
183
184
185 """
186 arc(a,b,r)
187
188 # TODO
189 """
190 function arc(a,b,r)
191 if abs(r) < norm(b-a)/2
192 throw(DomainError(r, "arc was called with radius r = $r smaller than half the distance between the points."))
193 end
194
195 R̂ = @SMatrix[0 -1; 1 0]
196
197 α = sign(r)*√(r^2 - norm((b-a)/2)^2)
198 t̂ = R̂*(b-a)/norm(b-a)
199
200 c = (a+b)/2 + α*t̂
201
202 ca = a-c
203 cb = b-c
204 θₐ = atan(ca[2],ca[1])
205 θᵦ = atan(cb[2],cb[1])
206
207 Δθ = mod(θᵦ-θₐ+π, 2π)-π # Δθ in the interval (-π,π)
208
209 if r > 0
210 Δθ = abs(Δθ)
211 else
212 Δθ = -abs(Δθ)
213 end
214
215 return Arc(Circle(c,abs(r)), θₐ, θₐ+Δθ)
182 end 216 end
183 217
184 """ 218 """
185 TransfiniteInterpolationSurface(c₁, c₂, c₃, c₄) 219 TransfiniteInterpolationSurface(c₁, c₂, c₃, c₄)
186 220