wip: depth gradien on regular grid

This commit is contained in:
Ole Anders N&st
2022-06-10 08:39:43 +02:00
parent 2ea0fe3f2d
commit a8eaf0b6f1
2 changed files with 52 additions and 37 deletions

View File

@@ -14,8 +14,6 @@ Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Build", "Build.fsproj", "{5
EndProject
Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "src", "src/Batman.fsproj", "{9EBF5E9B-ED3E-4CEB-ABD4-E03F92AD45C9}"
EndProject
Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "test", "test\Tests.fsproj", "{E2472750-93E4-4A7B-9DF3-A39BB5D6E8C4}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -55,18 +53,6 @@ Global
{9EBF5E9B-ED3E-4CEB-ABD4-E03F92AD45C9}.Release|x86.ActiveCfg = Release|Any CPU
{9EBF5E9B-ED3E-4CEB-ABD4-E03F92AD45C9}.Release|x86.Build.0 = Release|Any CPU
{E2472750-93E4-4A7B-9DF3-A39BB5D6E8C4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E2472750-93E4-4A7B-9DF3-A39BB5D6E8C4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E2472750-93E4-4A7B-9DF3-A39BB5D6E8C4}.Debug|x64.ActiveCfg = Debug|Any CPU
{E2472750-93E4-4A7B-9DF3-A39BB5D6E8C4}.Debug|x64.Build.0 = Debug|Any CPU
{E2472750-93E4-4A7B-9DF3-A39BB5D6E8C4}.Debug|x86.ActiveCfg = Debug|Any CPU
{E2472750-93E4-4A7B-9DF3-A39BB5D6E8C4}.Debug|x86.Build.0 = Debug|Any CPU
{E2472750-93E4-4A7B-9DF3-A39BB5D6E8C4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E2472750-93E4-4A7B-9DF3-A39BB5D6E8C4}.Release|Any CPU.Build.0 = Release|Any CPU
{E2472750-93E4-4A7B-9DF3-A39BB5D6E8C4}.Release|x64.ActiveCfg = Release|Any CPU
{E2472750-93E4-4A7B-9DF3-A39BB5D6E8C4}.Release|x64.Build.0 = Release|Any CPU
{E2472750-93E4-4A7B-9DF3-A39BB5D6E8C4}.Release|x86.ActiveCfg = Release|Any CPU
{E2472750-93E4-4A7B-9DF3-A39BB5D6E8C4}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(NestedProjects) = preSolution

View File

@@ -84,30 +84,59 @@ let interp3 (datapoints: (float * float * float) []) (grid: (float * float) [,])
(x, y, h))
let flat2Darray array2D =
seq { for i in [0..(Array2D.length1 array2D) - 1] do
for j in [0..(Array2D.length2 array2D) - 1] do
yield array2D[i, j] }
|> Seq.toArray
seq {
for i in [ 0 .. (Array2D.length1 array2D) - 1 ] do
for j in [ 0 .. (Array2D.length2 array2D) - 1 ] do
yield array2D[i, j]
}
|> Seq.toArray
let smooth9 (grid: (float * float * float) [,]) =
let n1 = Array2D.length1 grid
let n2 = Array2D.length2 grid
let smoothed =
grid
|> Array2D.mapi (fun i j _ ->
let g2d =
if i=0 && j>0 && j<n2-1 then
grid[i .. i + 1, j - 1 .. j + 1]
elif i=n1-1 && j>0 && j<n2-1 then
grid[i - 1 .. i, j - 1 .. j + 1]
elif i > 0 && i < n1-1 && j=0 then
grid[i - 1 .. i + 1, j .. j + 1]
elif i > 0 && i < n1-1 && j = n2-1 then
grid[i - 1 .. i + 1, j - 1 .. j]
else
grid[i - 1 .. i + 1, j - 1 .. j + 1]
let g1d = flat2Darray g2d
let x, y, h = Array.unzip3 g1d
let d = h |> Array.map (fun r -> r / float h.Length) |> Array.sum
x,y,d)
smoothed
grid
|> Array2D.mapi (fun i j _ ->
let g2d =
if i = 0 && j > 0 && j < n2 - 1 then
grid[i .. i + 1, j - 1 .. j + 1]
elif i = n1 - 1 && j > 0 && j < n2 - 1 then
grid[i - 1 .. i, j - 1 .. j + 1]
elif i > 0 && i < n1 - 1 && j = 0 then
grid[i - 1 .. i + 1, j .. j + 1]
elif i > 0 && i < n1 - 1 && j = n2 - 1 then
grid[i - 1 .. i + 1, j - 1 .. j]
elif i = 0 && j = 0 then
grid[i .. i + 1, j .. j + 1]
elif i = n1 - 1 && j = n2 - 1 then
grid[i - 1 .. i, j - 1 .. j]
else
grid[i - 1 .. i + 1, j - 1 .. j + 1]
let g1d = flat2Darray g2d
let x, y, h = Array.unzip3 g1d
let d =
h
|> Array.map (fun r -> r / float h.Length)
|> Array.sum
x, y, d)
let gradient (grid: (float * float * float) [,]) =
let n1 = Array2D.length1 grid
let n2 = Array2D.length2 grid
grid
|> Array2D.mapi (fun i j _ ->
let g =
if i = n1 - 1 && j > 0 && j < n2 - 1 then
[| grid[i - 1, j]; grid[i, j]; grid[i, j - 1]; grid[i, j + 1] |]
elif i > 0 && i < n1 - 1 && j = n2 - 1 then
[| grid[i - 1, j]; grid[i + 1, j]; grid[i, j]; grid[i, j - 1] |]
elif i = 0 && j = 0 then
[| grid[i, j]; grid[i + 1, j]; grid[i, j]; grid[i, j + 1] |]
elif i = n1 - 1 && j = n2 - 1 then
[| grid[i - 1, j]; grid[i, j]; grid[i, j - 1]; grid[i, j] |]
else
[| grid[i - 1, j]; grid[i + 1, j]; grid[i, j - 1]; grid[i, j + 1] |]
let xx, yy, h = Array.unzip3 g
let grx = (h[1] - h[0]) / (xx[1] - xx[0])
let gry = (h[3] - h[2]) / (yy[3] - yy[2])
let x, y, _ = grid[i, j]
(x, y, sqrt (grx ** 2 + gry ** 2)))