LCOV - code coverage report
Current view: top level - src/geometry - areas.jl (source / functions) Hit Total Coverage
Test: on branch nothing Lines: 29 30 96.7 %
Date: 2025-07-10 13:12:25 Functions: 0 0 -

          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

Generated by: LCOV version 1.16