Line data Source code
1 66 : trianglearea(g::AbstractGeometry, f::FHnd) =
2 : trianglearea(rawtrianglebase(g, f)[2:3]...)
3 :
4 1 : trianglearea(m::Mesh, x, f::FHnd) = trianglearea(geometry(m, x), f)
5 :
6 64 : trianglearea(ba::SVector{3, T}, ca::SVector{3, T}) where {T} = norm(ba × ca) / 2
7 :
8 2 : trianglearea(ba::SVector{2, T}, ca::SVector{2, T}) where {T} = det([ba ca]) / 2
9 :
10 : """
11 : ar = trianglearea(mesh, x, f)
12 :
13 : g = geometry(mesh, x)
14 : ar = trianglearea(g, x)
15 :
16 : Compute area of triangle `f`.
17 :
18 : ar = trianglearea(u, v)
19 :
20 : Compute area of triangle spanned by vectors `u` and `v` in 2d or 3d.
21 :
22 : !!! warning "precondition"
23 : Face `f` refers to a triangle.
24 :
25 : See also [`geometry`](@ref), [`rawtrianglebase`](@ref), [`trianglenormal`](@ref)
26 : """ trianglearea
27 :
28 :
29 : """
30 : Same as [`trianglenormalarea`](@ref) but more geneal.
31 :
32 : !!! note
33 : There is no benefit for non-triangular faces.
34 : The purpose of this method is providing a unifornm interface.
35 :
36 : See also [`geometry`](@ref), [`trianglenormalarea`](@ref)
37 : """ facenormalarea
38 :
39 :
40 60 : facearea(g::AbstractGeometry, f::FHnd) =
41 : facearea(g, f, _istriangulation(g))
42 :
43 12 : facearea(g::AbstractGeometry, f::FHnd, ::IsTriangulation) =
44 : trianglearea(g, f)
45 :
46 48 : function facearea(g::AbstractGeometry, f::FHnd, ::NoTriangulation)
47 : # TODO: general facearea -- facearea(g::AbstractGeometry, f::FHnd, ::NoTriangulation)
48 48 : @assert degree(_mesh(g), f) == 3
49 48 : trianglearea(g, f)
50 : end
51 :
52 1 : facearea(m::Mesh, x, f::FHnd) = facearea(geometry(m, x), f)
53 :
54 : """
55 : ar = facearea(mesh, x, f)
56 :
57 : g = geometry(mesh, x)
58 : ar = facearea(g, f)
59 :
60 : Compute area of face `f`.
61 :
62 : See also [`geometry`](@ref), [`trianglearea`](@ref), [`surfacearea`](@ref)
63 : """ facearea
64 :
65 13 : surfacearea(g::AbstractGeometry) =
66 : sum(facearea(g, f) for f in faces(_mesh(g)))
67 :
68 1 : surfacearea(m::Mesh, x) = surfacearea(geometry(m, x))
69 :
70 : """
71 : ar = surfacearea(mesh, x, f)
72 :
73 : g = geometry(mesh, x)
74 : ar = surfacearea(g, f)
75 :
76 : Compute area of face `f`.
77 :
78 : See also [`geometry`](@ref), [`facearea`](@ref)
79 : """ surfacearea
80 :
81 : """
82 : g = geometry(mesh, x)
83 :
84 : scalesurfacearea!(g[; area=4π, maxiter=4, rtol=0.001])
85 : scalesurfacearea!(m, x[; area=4π, maxiter=4, rtol=0.001])
86 :
87 : @assert surfacearea(g) ≈ area
88 :
89 : Scale mesh with [`centroid`](@ref) as origin such that
90 : [`surfacearea`](@ref) becomes `area`.
91 :
92 : The optional arguments specify the maximum number of iterations and a
93 : relative tolerance.
94 :
95 : See also [`geometry`](@ref), [`surfacearea`](@ref)
96 : """
97 6 : function scalesurfacearea!(g::AbstractGeometry;
98 : area::Real=4π, maxiter::Int=8, rtol=0.001)
99 3 : mesh = tessellation(g)
100 3 : x = position(g)
101 3 : T = eltype(eltype(x))
102 :
103 3 : area = T(area)
104 3 : rtol = T(rtol)
105 :
106 3 : i = 0
107 :
108 5 : while i < maxiter::Int
109 5 : a = surfacearea(g)
110 5 : s = abs(area / a)
111 :
112 5 : (abs(1-s) <= rtol) && break
113 :
114 2 : c = centroid(g)
115 :
116 4 : for v in vertices(mesh)
117 12 : x[v] = ((x[v] - c) * sqrt(s)) + c
118 22 : end
119 :
120 2 : i += 1
121 2 : end
122 :
123 0 : nothing
124 : end
|