Skip to content

Commit d292ba8

Browse files
committed
refactor
1 parent 6e46f6f commit d292ba8

File tree

4 files changed

+154
-105
lines changed

4 files changed

+154
-105
lines changed
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
using System;
2+
using UnityEngine;
3+
4+
namespace UnityVolumeRendering
5+
{
6+
public class CentralDifferenceGradientComputator : GradientComputator
7+
{
8+
public CentralDifferenceGradientComputator(VolumeDataset dataset) : base(dataset)
9+
{
10+
}
11+
12+
public override Vector3 ComputeGradient(int x, int y, int z, float minValue, float maxRange)
13+
{
14+
float x1 = data[Math.Min(x + 1, dimX - 1) + y * dimX + z * (dimX * dimY)] - minValue;
15+
float x2 = data[Math.Max(x - 1, 0) + y * dimX + z * (dimX * dimY)] - minValue;
16+
float y1 = data[x + Math.Min(y + 1, dimY - 1) * dimX + z * (dimX * dimY)] - minValue;
17+
float y2 = data[x + Math.Max(y - 1, 0) * dimX + z * (dimX * dimY)] - minValue;
18+
float z1 = data[x + y * dimX + Math.Min(z + 1, dimZ - 1) * (dimX * dimY)] - minValue;
19+
float z2 = data[x + y * dimX + Math.Max(z - 1, 0) * (dimX * dimY)] - minValue;
20+
21+
return new Vector3((x2 - x1) / maxRange, (y2 - y1) / maxRange, (z2 - z1) / maxRange);
22+
}
23+
}
24+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
using System;
2+
using UnityEngine;
3+
4+
namespace UnityVolumeRendering
5+
{
6+
public abstract class GradientComputator
7+
{
8+
protected float[] data;
9+
protected int dimX, dimY, dimZ;
10+
11+
public GradientComputator(VolumeDataset dataset)
12+
{
13+
this.data = dataset.data;
14+
this.dimX = dataset.dimX;
15+
this.dimY = dataset.dimY;
16+
this.dimZ = dataset.dimZ;
17+
}
18+
19+
public abstract Vector3 ComputeGradient(int x, int y, int z, float minValue, float maxRange);
20+
}
21+
}
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
using System;
2+
using UnityEngine;
3+
4+
namespace UnityVolumeRendering
5+
{
6+
public class SobelGradientComputator : GradientComputator
7+
{
8+
public SobelGradientComputator(VolumeDataset dataset) : base(dataset)
9+
{
10+
}
11+
12+
private float GetData(int x, int y, int z)
13+
{
14+
return data[x + y * dimX + z * (dimX * dimY)];
15+
}
16+
17+
private float Convolve(int x, int y, int z, float[,,] matrix)
18+
{
19+
float result = 0;
20+
for (int iz = 0; iz <= 2; iz++)
21+
{
22+
for (int iy = 0; iy <= 2; iy++)
23+
{
24+
for (int ix = 0; ix <= 2; ix++)
25+
{
26+
float matrixValue = matrix[iz, iy, ix];
27+
float dataValue = GetData(x + ix - 1, y + iy - 1, z + iz - 1);
28+
result += matrixValue * dataValue;
29+
}
30+
}
31+
}
32+
return result;
33+
}
34+
35+
private static readonly float[,,] kernelx = {
36+
{
37+
{-1, 0, 1},
38+
{-2, 0, 2},
39+
{-1, 0, 1}
40+
},
41+
{
42+
{-2, 0, 2},
43+
{-4, 0, 4},
44+
{-2, 0, 2}
45+
},
46+
{
47+
{-1, 0, 1},
48+
{-2, 0, 2},
49+
{-1, 0, 1}
50+
}};
51+
52+
private static readonly float[,,] kernely = {
53+
{
54+
{-1, -2, -1},
55+
{0, 0, 0},
56+
{1, 2, 1}
57+
},
58+
{
59+
{-2, -4, -2},
60+
{0, 0, 0},
61+
{2, 4, 2}
62+
},
63+
{
64+
{-1, -2, -1},
65+
{0, 0, 0},
66+
{1, 2, 1}
67+
}};
68+
69+
private static readonly float[,,] kernelz = {
70+
{
71+
{-1, -2, -1},
72+
{-2, -4, -2},
73+
{-1, -2, -1}
74+
},
75+
{
76+
{0, 0, 0},
77+
{0, 0, 0},
78+
{0, 0, 0}
79+
},
80+
{
81+
{1, 2, 1},
82+
{2, 4, 2},
83+
{1, 2, 1}
84+
}};
85+
86+
public override Vector3 ComputeGradient(int x, int y, int z, float minValue, float maxRange)
87+
{
88+
// TODO
89+
if (x < 2 || y < 2 || z < 2 || x > dimX - 3 || y > dimY - 3 || z > dimZ - 3)
90+
{
91+
return Vector3.zero;
92+
}
93+
94+
float dx = Convolve(x, y, z, kernelx);
95+
float dy = Convolve(x, y, z, kernely);
96+
float dz = Convolve(x, y, z, kernelz);
97+
98+
Vector3 gradient = new Vector3(dx, dy, dz);
99+
100+
return new Vector3(gradient.x / maxRange, gradient.y / maxRange, gradient.z / maxRange);
101+
}
102+
}
103+
}

Assets/Scripts/VolumeData/VolumeDataset.cs

Lines changed: 6 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,8 @@ await Task.Run(() => {
370370
Texture3D textureTmp = new Texture3D(dimX, dimY, dimZ, texformat, false);
371371
textureTmp.wrapMode = TextureWrapMode.Clamp;
372372

373+
GradientComputator gradientComputator = new SobelGradientComputator(this);
374+
373375
for (int x = 0; x < dimX; x++)
374376
{
375377
progressHandler.ReportProgress(x, dimX, "Calculating gradients for slice");
@@ -378,7 +380,7 @@ await Task.Run(() => {
378380
for (int z = 0; z < dimZ; z++)
379381
{
380382
int iData = x + y * dimX + z * (dimX * dimY);
381-
Vector3 grad = GetGrad(x, y, z, minValue, maxRange);
383+
Vector3 grad = gradientComputator.ComputeGradient(x, y, z, minValue, maxRange);
382384

383385
textureTmp.SetPixel(x, y, z, new Color(grad.x, grad.y, grad.z, (float)(data[iData] - minValue) / maxRange));
384386
}
@@ -396,6 +398,8 @@ await Task.Run(() => {
396398

397399
progressHandler.StartStage(0.6f, "Creating gradient texture");
398400
await Task.Run(() => {
401+
GradientComputator gradientComputator = new SobelGradientComputator(this);
402+
399403
for (int z = 0; z < dimZ; z++)
400404
{
401405
progressHandler.ReportProgress(z, dimZ, "Calculating gradients for slice");
@@ -404,7 +408,7 @@ await Task.Run(() => {
404408
for (int x = 0; x < dimX; x++)
405409
{
406410
int iData = x + y * dimX + z * (dimX * dimY);
407-
Vector3 grad = GetGrad(x, y, z, minValue, maxRange);
411+
Vector3 grad = gradientComputator.ComputeGradient(x, y, z, minValue, maxRange);
408412

409413
cols[iData] = new Color(grad.x, grad.y, grad.z, (float)(data[iData] - minValue) / maxRange);
410414
}
@@ -425,109 +429,6 @@ await Task.Run(() => {
425429

426430
}
427431

428-
private float Convolve(int x, int y, int z, float[,,] matrix)
429-
{
430-
float result = 0;
431-
for (int iz = 0; iz <=2; iz++)
432-
{
433-
for (int iy = 0; iy <=2; iy++)
434-
{
435-
for (int ix = 0; ix <=2; ix++)
436-
{
437-
float matrixValue = matrix[iz, iy, ix];
438-
float dataValue = GetData(x + ix - 1, y + iy - 1, z + iz - 1);
439-
result += matrixValue * dataValue;
440-
}
441-
}
442-
}
443-
return result;
444-
}
445-
446-
float[,,] kernelx = {
447-
{
448-
{-1, 0, 1},
449-
{-2, 0, 2},
450-
{-1, 0, 1}
451-
},
452-
{
453-
{-2, 0, 2},
454-
{-4, 0, 4},
455-
{-2, 0, 2}
456-
},
457-
{
458-
{-1, 0, 1},
459-
{-2, 0, 2},
460-
{-1, 0, 1}
461-
}};
462-
463-
float[,,] kernely = {
464-
{
465-
{-1, -2, -1},
466-
{0, 0, 0},
467-
{1, 2, 1}
468-
},
469-
{
470-
{-2, -4, -2},
471-
{0, 0, 0},
472-
{2, 4, 2}
473-
},
474-
{
475-
{-1, -2, -1},
476-
{0, 0, 0},
477-
{1, 2, 1}
478-
}};
479-
480-
float[,,] kernelz = {
481-
{
482-
{-1, -2, -1},
483-
{-2, -4, -2},
484-
{-1, -2, -1}
485-
},
486-
{
487-
{0, 0, 0},
488-
{0, 0, 0},
489-
{0, 0, 0}
490-
},
491-
{
492-
{1, 2, 1},
493-
{2, 4, 2},
494-
{1, 2, 1}
495-
}};
496-
497-
public Vector3 GetGradSobel(int x, int y, int z, float minValue, float maxRange)
498-
{
499-
// TODO
500-
if (x < 2 || y < 2 || z < 2 || x > dimX - 3 || y > dimY - 3 || z > dimZ - 3)
501-
{
502-
return Vector3.zero;
503-
}
504-
505-
float dx = Convolve(x, y, z, kernelx);
506-
float dy = Convolve(x, y, z, kernely);
507-
float dz = Convolve(x, y, z, kernelz);
508-
509-
Vector3 gradient = new Vector3(dx, dy, dz);
510-
511-
return new Vector3(gradient.x / maxRange, gradient.y / maxRange, gradient.z / maxRange);
512-
}
513-
514-
public Vector3 GetGradSimple(int x, int y, int z, float minValue, float maxRange)
515-
{
516-
float x1 = data[Math.Min(x + 1, dimX - 1) + y * dimX + z * (dimX * dimY)] - minValue;
517-
float x2 = data[Math.Max(x - 1, 0) + y * dimX + z * (dimX * dimY)] - minValue;
518-
float y1 = data[x + Math.Min(y + 1, dimY - 1) * dimX + z * (dimX * dimY)] - minValue;
519-
float y2 = data[x + Math.Max(y - 1, 0) * dimX + z * (dimX * dimY)] - minValue;
520-
float z1 = data[x + y * dimX + Math.Min(z + 1, dimZ - 1) * (dimX * dimY)] - minValue;
521-
float z2 = data[x + y * dimX + Math.Max(z - 1, 0) * (dimX * dimY)] - minValue;
522-
523-
return new Vector3((x2 - x1) / maxRange, (y2 - y1) / maxRange, (z2 - z1) / maxRange);
524-
}
525-
526-
public Vector3 GetGrad(int x, int y, int z, float minValue, float maxRange)
527-
{
528-
return GetGradSobel(x, y, z, minValue, maxRange);
529-
}
530-
531432
public float GetAvgerageVoxelValues(int x, int y, int z)
532433
{
533434
// if a dimension length is not an even number

0 commit comments

Comments
 (0)