private void OnDataSourceReplaced(IDataSource3D<Vector3D> prevSource, IDataSource3D<Vector3D> currSource) { if (prevSource != null) prevSource.Changed -= OnDataSourceChanged; if (currSource != null) currSource.Changed += OnDataSourceChanged; RebuildUI(); }
public VectorToMagnitudeDataSource3D(IDataSource3D <Vector3D> dataSource) { if (dataSource == null) { throw new ArgumentNullException("dataSource"); } //todo subscribe on dataSource Changed event this.dataSource = dataSource; this.data = new MagnitudeData3D(dataSource.Data); }
private void OnDataSourceReplaced(IDataSource3D <Vector3D> prevSource, IDataSource3D <Vector3D> currSource) { if (prevSource != null) { prevSource.Changed -= OnDataSourceChanged; } if (currSource != null) { currSource.Changed += OnDataSourceChanged; } RebuildUI(); }
public TransformedGridDataSource3D(IDataSource3D <T> child, Transform3D transform) { if (child == null) { throw new ArgumentNullException("child"); } if (transform == null) { throw new ArgumentNullException("transform"); } this.child = child; this.transformedGrid = new TransformedGrid3D(child.Grid, transform); }
public void MarchingCubes(IDataSource3D <double> source, double potential) { vertices = new List <IsoSurfaceVertex>(10000); indices = new List <int>(); edges = new List <IsoSurfaceIndex>(); for (int ix = 0; ix < sizeX - 1; ix++) { for (int iy = 0; iy < sizeY - 1; iy++) { for (int iz = 0; iz < sizeZ - 1; iz++) { MarchCube(ix, iy, iz, potential, source); } } } }
public FilteringDataSource(IDataSource3D <T> child, int xStep = 2, int yStep = 2, int zStep = 2) { if (child == null) { throw new ArgumentNullException("child"); } this.child = child; this.child.Changed += OnChildChanged; this.filteringData = new FilteringData <T>(child.Data, xStep, yStep, zStep); this.filteringGrid = new FilteringGrid(child.Grid, xStep, yStep, zStep); this.xStep = xStep; this.yStep = yStep; this.zStep = zStep; }
public static T[, ,] DataToArray <T>(this IDataSource3D <T> dataSource) { T[, ,] result = new T[dataSource.Width, dataSource.Height, dataSource.Depth]; var data = dataSource.Data; Parallel.For(0, dataSource.Width, ix => { for (int iy = 0; iy < dataSource.Height; iy++) { for (int iz = 0; iz < dataSource.Depth; iz++) { result[ix, iy, iz] = data[ix, iy, iz]; } } }); return(result); }
public static TransformedGridDataSource3D <T> TransformGrid <T>(this IDataSource3D <T> dataSource, Transform3D transform) { return(new TransformedGridDataSource3D <T>(dataSource, transform)); }
public static IDataSource3D <double> GetMagnitudeDataSource(this IDataSource3D <Vector3D> dataSource) { return(new VectorToMagnitudeDataSource3D(dataSource)); }
public static FilteringDataSource <T> Filter <T>(this IDataSource3D <T> dataSource, int xStep = 2, int yStep = 2, int zStep = 2) { return(new FilteringDataSource <T>(dataSource, xStep, yStep, zStep)); }
//Find part of Surface for current voxel void MarchCube(double x, double y, double z, double scale, IDataSource3D <double> source) { int iCorner, iVertex, iVertexTest, iEdge, iTriangle, iFlagIndex, iEdgeFlags; double fOffset; double[] afCubeValue = new double[8]; Vector3D[] asEdgeVertex = new Vector3D[12]; Vector3D[] asEdgeNorm = new Vector3D[12]; //Find value in voxel's knots for (iVertex = 0; iVertex < 8; iVertex++) { afCubeValue[iVertex] = (float)source.Data[(int)(x + a2fVertexOffset[iVertex, 0]), (int)(y + a2fVertexOffset[iVertex, 1]), (int)(z + a2fVertexOffset[iVertex, 2])]; //if (afCubeValue[iVertex] == (double)source.MissingValue) return; } //Checking intersections via table iFlagIndex = 0; for (iVertexTest = 0; iVertexTest < 8; iVertexTest++) { if (afCubeValue[iVertexTest] <= potential) { iFlagIndex |= 1 << iVertexTest; } } //Finally, get our surface configuration iEdgeFlags = aiCubeEdgeFlags[iFlagIndex]; //if our surface doesn't intersect voxel if (iEdgeFlags == 0) { return; } //Building vertices for (iEdge = 0; iEdge < 12; iEdge++) { if ((iEdgeFlags & (1 << iEdge)) != 0) { fOffset = GetOffset(afCubeValue[a2iEdgeConnection[iEdge, 0]], afCubeValue[a2iEdgeConnection[iEdge, 1]], potential); asEdgeVertex[iEdge].X = (float)(x + (a2fVertexOffset[a2iEdgeConnection[iEdge, 0], 0] + fOffset * a2fEdgeDirection[iEdge, 0]) * scale); asEdgeVertex[iEdge].Y = (float)(y + (a2fVertexOffset[a2iEdgeConnection[iEdge, 0], 1] + fOffset * a2fEdgeDirection[iEdge, 1]) * scale); asEdgeVertex[iEdge].Z = (float)(z + (a2fVertexOffset[a2iEdgeConnection[iEdge, 0], 2] + fOffset * a2fEdgeDirection[iEdge, 2]) * scale); asEdgeNorm[iEdge] = MathHelper.CalculateNormalToField(asEdgeVertex[iEdge].X, asEdgeVertex[iEdge].Y, asEdgeVertex[iEdge].Z, data); } } //Building triangles for (iTriangle = 0; iTriangle < 5; iTriangle++) { if (a2iTriangleConnectionTable[iFlagIndex, 3 * iTriangle] < 0) { break; } for (iCorner = 0; iCorner < 3; iCorner++) { iVertex = a2iTriangleConnectionTable[iFlagIndex, 3 * iTriangle + iCorner]; vertices.Add(new IsoSurfaceVertex { Position = asEdgeVertex[iVertex], Normal = MathHelper.CalculateNormalToPolygon(asEdgeVertex[a2iTriangleConnectionTable[iFlagIndex, 3 * iTriangle]], asEdgeVertex[a2iTriangleConnectionTable[iFlagIndex, 3 * iTriangle + 1]], asEdgeVertex[a2iTriangleConnectionTable[iFlagIndex, 3 * iTriangle + 2]]) //asEdgeNorm[iVertex] }); } } }
//Find part of Surface for current voxel void MarchCube(double x, double y, double z, double scale, IDataSource3D<double> source) { int iCorner, iVertex, iVertexTest, iEdge, iTriangle, iFlagIndex, iEdgeFlags; double fOffset; double[] afCubeValue = new double[8]; Vector3D[] asEdgeVertex = new Vector3D[12]; Vector3D[] asEdgeNorm = new Vector3D[12]; //Find value in voxel's knots for (iVertex = 0; iVertex < 8; iVertex++) { afCubeValue[iVertex] = (float)source.Data[(int)(x + a2fVertexOffset[iVertex, 0]), (int)(y + a2fVertexOffset[iVertex, 1]), (int)(z + a2fVertexOffset[iVertex, 2])]; //if (afCubeValue[iVertex] == (double)source.MissingValue) return; } //Checking intersections via table iFlagIndex = 0; for (iVertexTest = 0; iVertexTest < 8; iVertexTest++) { if (afCubeValue[iVertexTest] <= potential) iFlagIndex |= 1 << iVertexTest; } //Finally, get our surface configuration iEdgeFlags = aiCubeEdgeFlags[iFlagIndex]; //if our surface doesn't intersect voxel if (iEdgeFlags == 0) return; //Building vertices for (iEdge = 0; iEdge < 12; iEdge++) { if ((iEdgeFlags & (1 << iEdge)) != 0) { fOffset = GetOffset(afCubeValue[a2iEdgeConnection[iEdge, 0]], afCubeValue[a2iEdgeConnection[iEdge, 1]], potential); asEdgeVertex[iEdge].X = (float)(x + (a2fVertexOffset[a2iEdgeConnection[iEdge, 0], 0] + fOffset * a2fEdgeDirection[iEdge, 0]) * scale); asEdgeVertex[iEdge].Y = (float)(y + (a2fVertexOffset[a2iEdgeConnection[iEdge, 0], 1] + fOffset * a2fEdgeDirection[iEdge, 1]) * scale); asEdgeVertex[iEdge].Z = (float)(z + (a2fVertexOffset[a2iEdgeConnection[iEdge, 0], 2] + fOffset * a2fEdgeDirection[iEdge, 2]) * scale); asEdgeNorm[iEdge] = MathHelper.CalculateNormalToField(asEdgeVertex[iEdge].X, asEdgeVertex[iEdge].Y, asEdgeVertex[iEdge].Z, data); } } //Building triangles for (iTriangle = 0; iTriangle < 5; iTriangle++) { if (a2iTriangleConnectionTable[iFlagIndex, 3 * iTriangle] < 0) break; for (iCorner = 0; iCorner < 3; iCorner++) { iVertex = a2iTriangleConnectionTable[iFlagIndex, 3 * iTriangle + iCorner]; vertices.Add(new IsoSurfaceVertex { Position = asEdgeVertex[iVertex], Normal = MathHelper.CalculateNormalToPolygon(asEdgeVertex[a2iTriangleConnectionTable[iFlagIndex, 3 * iTriangle]], asEdgeVertex[a2iTriangleConnectionTable[iFlagIndex, 3 * iTriangle + 1]], asEdgeVertex[a2iTriangleConnectionTable[iFlagIndex, 3 * iTriangle + 2]]) //asEdgeNorm[iVertex] }); } } }
public void MarchingCubes(IDataSource3D<double> source, double potential) { vertices = new List<IsoSurfaceVertex>(10000); indices = new List<int>(); edges = new List<IsoSurfaceIndex>(); for (int ix = 0; ix < sizeX - 1; ix++) for (int iy = 0; iy < sizeY - 1; iy++) for (int iz = 0; iz < sizeZ - 1; iz++) { MarchCube(ix, iy, iz, potential, source); } }
public static FilteringDataSource <T> Create <T>(IDataSource3D <T> child, int xStep, int yStep, int zStep) { return(new FilteringDataSource <T>(child, xStep, yStep, zStep)); }