diff --git a/src/function.jl b/src/function.jl
index 1d00318c2ca9e073688e86fefa4de6207c728f07..dfc7cfcd5f8cb98140cabe711f118d90b83d6272 100644
--- a/src/function.jl
+++ b/src/function.jl
@@ -268,9 +268,11 @@ ImageFunction(mesh, img) =
ImageFunction(mesh, img, Ref(1))
bind!(f::ImageFunction, cell) = f.cell[] = cell
+img_coord(img, x) = (size(img, 1) - x[2] + 1, x[1])
# TODO: precompute the offset from minimum mesh vertex
evaluate(f::ImageFunction, xloc) =
- interpolate_bilinear(f.img, elmap(f.mesh, f.cell[])(xloc) .+ (0.5, 0.5))
+ interpolate_bilinear(f.img,
+ img_coord(f.img, elmap(f.mesh, f.cell[])(xloc) .+ (0.5, 0.5)))
struct FacetDivergence{F}
@@ -322,6 +324,10 @@ end
bind!(f::FacetDivergence, cell) = f.cell[] = cell
+# evaluate the function on a rectangular grid of coordinates starting at (0.5,
+# 0.5) with integer spacing, i.e. pixel center coordinates of a bounding image.
+# indexing as for images: first index is y downwards, second index is x
+# rightwards
# TODO: get rid of this hack as soon as we use size=() for scalar functions
function sample(f::FeFunction)
out = _sample(f)
@@ -361,7 +367,13 @@ function _sample(f::FeFunction)
end
end
end
- return out
+
+ # convert to image indexing
+ d = length(f.space.size)
+ reverse!(out, dims = d + 2)
+ out2 = permutedims(out, (ntuple(identity, d)..., d + 2, d + 1))
+
+ return out2
end
diff --git a/src/mesh.jl b/src/mesh.jl
index 39ff191477a5a265fd07c051463afc7127ff3157..a8c5c2e09056dee70516ff9d3836062e6cbc1e33 100644
--- a/src/mesh.jl
+++ b/src/mesh.jl
@@ -44,10 +44,12 @@ function init_hgrid(m::Int, n::Int = m, v0 = (0., 0.), v1 = (1., 1.))
return HMesh(vertices, cells, zeros(Int, axes(cells)))
end
-init_hgrid(img::Array{<:Any, 2}; type=:vertex) =
+function init_hgrid(img::Array{<:Any, 2}; type=:vertex)
+ s = (size(img, 2), size(img, 1))
type == :vertex ?
- init_grid(size(img, 1) - 1, size(img, 2) - 1, (1.0, 1.0), size(img)) :
- init_grid(size(img, 1), size(img, 2), (0.5, 0.5), size(img) .- (0.5, 0.5))
+ init_hgrid((s .- 1)..., (1.0, 1.0), s) :
+ init_hgrid(s..., (0.5, 0.5), s .- (0.5, 0.5))
+end
function sub_mesh(hmesh::HMesh, subcells = cells(hmesh))
cells = collect(reshape(reinterpret(Int, hmesh.cells[subcells]), 3, :))
@@ -161,13 +163,17 @@ function init_grid(m::Int, n::Int = m, v0 = (0., 0.), v1 = (1., 1.))
return Mesh(vertices, cells)
end
-init_grid(img::Array{<:Any, 2}; type=:vertex) =
+function init_grid(img::Array{<:Any, 2}; type=:vertex)
+ s = (size(img, 2), size(img, 1))
type == :vertex ?
- init_grid(size(img, 1) - 1, size(img, 2) - 1, (1.0, 1.0), size(img)) :
- init_grid(size(img, 1), size(img, 2), (0.5, 0.5), size(img) .- (0.5, 0.5))
+ init_grid((s .- 1)..., (1.0, 1.0), s) :
+ init_grid(s..., (0.5, 0.5), s .- (0.5, 0.5))
+end
-init_grid(img::Array{<:Any, 2}, m::Int, n::Int = m) =
- init_grid(m, n, (0.5, 0.5), size(img) .- (0.5, 0.5))
+function init_grid(img::Array{<:Any, 2}, m::Int, n::Int = m)
+ s = (size(img, 2), size(img, 1))
+ init_grid(m, n, (0.5, 0.5), s .- (0.5, 0.5))
+end
# horribly implemented, please don't curse me
function bisect!(mesh::HMesh, marked_cells::Set)
diff --git a/src/operator.jl b/src/operator.jl
index 1a21b05ad99d82580ef8a2fabc49eaf92f31b04c..87c3710161f0f14c0e2786b8932f30a35eb500b9 100644
--- a/src/operator.jl
+++ b/src/operator.jl
@@ -116,10 +116,12 @@ function assemble(space::FeSpace, a, l; params...)
return A, b
end
+from_img(arr) = permutedims(reverse(arr; dims = 1))
+
project_img(space::FeSpace, img) =
(u = FeFunction(space); project_img!(u, img))
-# composite midpoint quadrature on lagrange point lattice
+# composite midpoint quadrature on 2d-lagrange point lattice
function quadrature_composite_lagrange_midpoint(p)
d_ = 2
n = binomial(p + 2, 2)