Line data Source code
1 : # TODO: maybe split file
2 :
3 3 : barycenter(g::AbstractGeometry, h::Union{HHnd, EHnd}) =
4 : barycenter(g, vertices(_mesh(g), h))
5 :
6 3 : barycenter(g::AbstractGeometry, v01::Tuple{VHnd, VHnd}) =
7 : barycenter(g, v01, _has_vx(g))
8 :
9 3 : barycenter(g::AbstractGeometry, v01, ::HasVX) =
10 : (_vpos(g)[v01[1]] + _vpos(g)[v01[2]]) / 2
11 :
12 339 : barycenter(g::AbstractGeometry, f::FHnd) =
13 : barycenter(g, f, _has_vx(g), _istriangulation(g))
14 :
15 338 : function barycenter(g::AbstractGeometry, f::FHnd, ::HasVX, ::IsTriangulation)
16 338 : x = _vpos(g)
17 338 : vs = triangle(_mesh(g), f)
18 338 : (x[vs[1]] + x[vs[2]] + x[vs[3]]) / 3
19 : end
20 :
21 1 : function barycenter(g::AbstractGeometry, f::FHnd, ::HasVX, ::NoTriangulation)
22 1 : x = _vpos(g)
23 1 : c = zeros(eltype(x))
24 1 : w = zero(eltype(c))
25 :
26 1 : for v in vertices(_mesh(g), f)
27 3 : c += x[v]
28 3 : w += one(w)
29 3 : end
30 :
31 1 : c / w
32 : end
33 :
34 5 : function barycenter(g::AbstractGeometry)
35 5 : mesh = _mesh(g)
36 5 : x = _vpos(g)
37 5 : sum(x[v] for v in vertices(mesh)) / nv(mesh)
38 : end
39 :
40 1 : barycenter(mesh::Mesh, ax, hs) = barycenter(geometry(mesh, ax), hs)
41 :
42 1 : barycenter(mesh::Mesh, ax) = barycenter(geometry(mesh, ax))
43 :
44 : """
45 : c = barycenter(mesh, x, ...)
46 :
47 : g = geometry(mesh, x)
48 : c = barycenter(g, h)
49 : c = barycenter(g, e)
50 : c = barycenter(g, (v0, v1))
51 :
52 : c = barycenter(g, f)
53 :
54 : c = barycenter(g)
55 :
56 : Get barycenter of edge or face or all vertex positions.
57 :
58 : See also [`geometry`](@ref)
59 : """ barycenter
60 :
61 : # TODO: centermean!
62 :
63 : #-----------------------------------------------------------------------------
64 :
65 78 : edgevector(g::AbstractGeometry, h::Union{HHnd, EHnd}) =
66 : edgevector(g, vertices(_mesh(g), h))
67 :
68 96978 : edgevector(g::AbstractGeometry, v01::Tuple{VHnd, VHnd}) =
69 : edgevector(g, v01, _has_vx(g))
70 :
71 96978 : edgevector(g::AbstractGeometry, v01, ::HasVX) =
72 : _vpos(g)[v01[2]] - _vpos(g)[v01[1]]
73 :
74 1 : edgevector(mesh::Mesh, ax, hs) = edgevector(geometry(mesh, ax), hs)
75 :
76 : """
77 : d = edgevector(mesh, x, h)
78 : d = edgevector(mesh, x, e)
79 : d = edgevector(mesh, x, (v0, v1))
80 :
81 : g = geometry(mesh, x)
82 : d = edgevector(g, h)
83 : d = edgevector(g, e)
84 : d = edgevector(g, (v0, v1)
85 :
86 : Compute vector spanning an edge.
87 :
88 : See also [`geometry`](@ref), [`edgelength`](@ref)
89 : """ edgevector
90 :
91 : """
92 : g = geometry(mesh, x)
93 : d = diff(g, ...)
94 :
95 : Synonym for `d = edgevector(g, ...)`.
96 :
97 : See also [`geometry`](@ref), [`edgevector`](@ref)
98 : """
99 5 : Base.diff(g::AbstractGeometry, args...) = edgevector(g, args...)
100 :
101 3 : edgevectors(g::AbstractGeometry, f::FHnd) =
102 : (edgevector(g, h) for h in halfedges(_mesh(g), f))
103 :
104 1 : edgevectors(m::Mesh, ax, f::FHnd) = edgevectors(geometry(m, ax), f)
105 :
106 : """
107 : ds = collect(edgevectors(mesh, x, f)
108 :
109 : g = geometry(mesh, x)
110 : for d in edgevectors(g, f)
111 : # ...
112 : end
113 :
114 : Compute vectors spanning edges of fac `f`
115 :
116 : See also [`geometry`](@ref), [`edgevector`](@ref), [`circumference`](@ref)
117 : """ edgevectors
118 :
119 6 : circumference(g::AbstractGeometry, f::FHnd) =
120 : sum(edgelength(g, h) for h in halfedges(_mesh(g), f))
121 :
122 1 : circumference(m::Mesh, ax, f::FHnd) = circumference(geometry(m, ax), f)
123 :
124 : """
125 : len = circumference(mesh, x, f)
126 :
127 : m = geometry(mesh, x)
128 : len = circumferemce(g, f)
129 :
130 : Compute circumference of face `f`
131 :
132 : See also [`geometry`](@ref), [`edgevectors`](@ref)
133 : """
134 : circumference
135 :
136 55 : edgelength(g::AbstractGeometry, h) = edgevector(g, h) |> norm
137 :
138 1 : edgelength(m::Mesh, x, h) = edgelength(geometry(m, x), h)
139 :
140 : """
141 : len = edgelength(mesh, x, e)
142 : len = edgelength(mesh, x, h)
143 :
144 : g = geometry(mesh, x)
145 : len = edgelength(g, e)
146 : len = edgelength(g, h)
147 :
148 : Compute length of an edge.
149 :
150 : See also [`geometry`](@ref), [`edgevector`](@ref)
151 : """
152 : edgelength
153 :
154 7 : edgelengths(g::AbstractGeometry) = (edgelength(g, e) for e in edges(_mesh(g)))
155 :
156 1 : edgelengths(m::Mesh, x) = edgelengths(geometry(m, x))
157 :
158 : """
159 : lens = collect(edgelengths(mesh, x))
160 :
161 : g = geometry(mesh, x)
162 : for len in edgelengths(g)
163 : # ...
164 : end
165 :
166 : Generate all edge lengths.
167 :
168 : Examples:
169 :
170 : μlen = Statistics.mean(edgelengths(g))
171 : minlen, maxlex = extrema(edgelengths(g))
172 :
173 : See also [`geometry`](@ref), [`edgelength`](@ref), [`meanedgelength`](@ref)
174 : """
175 : edgelengths
176 :
177 6 : meanedgelength(g::AbstractGeometry) = Statistics.mean(edgelengths(g))
178 :
179 1 : meanedgelength(mesh::Mesh, x) = meanedgelength(geometry(mesh, x))
180 :
181 : """
182 : μlen = meanedgelength(mesh, x)
183 :
184 : g = meaure(mesh, x)
185 : μlen = meanedgelength(g)
186 :
187 : Compute mean edge length.barycenter(m::Mesh, ax, hs) = barycenter(geometry(mesh, ax), hs)
188 :
189 :
190 : See also See also [`geometry`](@ref), [`edgelengths`](@ref)
191 : """ meanedgelength
192 :
193 : #-----------------------------------------------------------------------------
194 :
195 0 : rawfacebase(g::AbstractGeometry, f::FHnd) =
196 : rawfacebase(g, f, _istriangulation(g))
197 :
198 0 : function rawfacebase(g::AbstractGeometry, f::FHnd, ::IsTriangulation)
199 0 : h0 = halfedge(_mesh(g), f)
200 0 : h1 = prev(_mesh(g), h0)
201 :
202 : # TODO: check angle, optionally use different vectors
203 :
204 0 : (edgevector(g, h0), -edgevector(g, h1))
205 : end
206 :
207 0 : rawfacebase(g::AbstractGeometry, f::FHnd, ::NoTriangulation) =
208 : rawtrianglebase(g, f)
209 :
210 0 : rawfacebase(m::Mesh, x, f::FHnd) = rawfacebase(geometry(m, x), f)
211 :
212 : """
213 : x0, u, v = rawfacebase(mesh, x, f)
214 :
215 : g = geometry(mesh, x)
216 : x0, u, v = rawfacebase(g, f)
217 :
218 : Compute edge vectors that span a planar face with origin shifted to `x0`.
219 : `u, v` provide a basis for the face's plane but they are neither unit
220 : length nor orthogonal.
221 :
222 : !!! warning "precondition"
223 : `f` must be a **planar** face.
224 :
225 : !! warning
226 : The caller must not make assumptions on the particular choice
227 : of vectors!
228 :
229 : !!! todo
230 : The current implementation uses an arbitrary pair of
231 : [`edgevectors`](@ref) and disregards conditioning/angles.
232 :
233 : See also [`geometry`](@ref), [`rawtrianglebase`](@ref),
234 : [`facenormal`](@ref), [`trianglenormal`](@ref), `tangentspace`](@ref)
235 : """ rawfacebase
236 :
237 48450 : function rawtrianglebase(g::AbstractGeometry, f::FHnd)
238 48450 : v0, v1, v2 = triangle(_mesh(g), f)
239 48450 : u = edgevector(g, (v1, v0))
240 48450 : v = edgevector(g, (v2, v0))
241 48450 : _vpos(g)[v0], u, v
242 : end
243 :
244 0 : rawtrianglebase(m::Mesh, x, f::FHnd) = rawtrianglebase(geometry(m, x), f)
245 :
246 : """
247 : x0, u, v = rawtrianglebase(mesh, x, f)
248 :
249 : g = geometry(mesh, x)
250 : x0, u, v = rawtrianglebase(g, f)
251 :
252 : Compute edge vectors that span a planar triangle with origin shifted
253 : to `x0`. `u, v` provide a basis for the triangle's plane but they are
254 : neither unit length nor orthogonal.
255 :
256 : !!! warning "precondition"
257 : Face `f` refers to a triangle.
258 :
259 : See also [`geometry`](@ref), [`rawfacebase`](@ref),
260 : [`rawtrianglenormal`](@ref), [`tangentspace`](@ref)
261 : """ rawtrianglebase
|