private void OnDataSourceReplaced(IDataSource3D<Vector3D> prevSource, IDataSource3D<Vector3D> currSource)
		{
			if (prevSource != null)
				prevSource.Changed -= OnDataSourceChanged;
			if (currSource != null)
				currSource.Changed += OnDataSourceChanged;
			RebuildUI();
		}
Beispiel #2
0
        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);
        }
Beispiel #3
0
 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);
        }
Beispiel #5
0
        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;
        }
Beispiel #7
0
        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);
        }
Beispiel #8
0
 public static TransformedGridDataSource3D <T> TransformGrid <T>(this IDataSource3D <T> dataSource, Transform3D transform)
 {
     return(new TransformedGridDataSource3D <T>(dataSource, transform));
 }
Beispiel #9
0
 public static IDataSource3D <double> GetMagnitudeDataSource(this IDataSource3D <Vector3D> dataSource)
 {
     return(new VectorToMagnitudeDataSource3D(dataSource));
 }
Beispiel #10
0
 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));
 }
Beispiel #11
0
        //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]
                    });
                }
            }
        }
Beispiel #12
0
		//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]
					});
				}
			}
		}
Beispiel #13
0
		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));
 }