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

          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

Generated by: LCOV version 1.16