Beispiel #1
0
        public static List <IsoTri> CalcIsoSurfaces(Mesh m, uint dataIndex, double isoCount, Testing_openTK_again.Del valueToColor, ColorMapControl.ColorMap.Mode mode)
        {
            List <IsoTri> isoTri = new List <IsoTri>();
            double        min, max;

            m.GetMinMaxValues(dataIndex, out min, out max);
            double isoStep = (max - min) / isoCount;
            double iso     = min + isoStep * 0.5;

            for (int ic = 0; ic < isoCount; ++ic)
            {
                foreach (Zone z in m.Zones)
                {
                    foreach (Element e in z.Elements)
                    {
                        List <double> data = new List <double>();
                        for (int i = 0; i < e.vertInOrder.Length; ++i)
                        {
                            data.Add(z.Vertices[e.vertInOrder[i]].Data[dataIndex]);
                        }

                        var elementCase = ISOSurface.GetElementCase(data.ToArray(), iso);
                        var edges       = ISOSurface.GetCaseEdges(elementCase);
                        for (int i = 0; i < edges.Length; i += 3)
                        {
                            if (edges[i] < 0 || edges[i] > 16)
                            {
                                break;
                            }
                            isoTri.Add(new IsoTri());
                            //triangles.Add(new List<Point3>());
                            for (int j = 0; j < 3; ++j)
                            {
                                var edge      = ISOSurface.GetEdgePoints(edges[i + j]);
                                var startVert = z.Vertices[e.vertInOrder[edge.Start]];
                                var endVert   = z.Vertices[e.vertInOrder[edge.End]];
                                var alpha     = (iso - startVert.Data[dataIndex]) / (endVert.Data[dataIndex] - startVert.Data[dataIndex]);
                                var p         = Lerp(startVert.Position, endVert.Position, alpha);
                                //var p = process(iso, startVert.Position, endVert.Position, startVert.Data[dataIndex], startVert.Data[dataIndex]);
                                isoTri[isoTri.Count - 1].triangle.Add(p);
                                Color c = valueToColor(mode, (float)(iso - endVert.Data[dataIndex] + startVert.Data[dataIndex]));

                                //Color c = valueToColor(mode, (float)(iso));// (float)(iso - endVert.Data[dataIndex] + startVert.Data[dataIndex]));
                                isoTri[isoTri.Count - 1].color = new double[] { c.R / 255.0, c.G / 255.0, c.B / 255.0 };
                            }
                        }
                    }
                }
                iso += isoStep;
            }
            return(isoTri);
        }
Beispiel #2
0
        public static List <List <Vertex> > CalculateContours(Mesh m, int contourCount, uint dataIndex,
                                                              ref List <double[]> contourColors, Testing_openTK_again.Del valueToColor, ColorMapControl.ColorMap.Mode mode)
        {
            List <List <Vertex> > contourLines = new List <List <Vertex> >();
            double min, max;

            m.GetMinMaxValues(dataIndex, out min, out max);
            double contourStep = (max - min) / contourCount;
            double contourValue = min + contourStep * 0.5;

            contourColors.Clear();

            int idx = 0;

            for (int i = 0; i < contourCount; ++i)
            {
                foreach (Zone z in m.Zones)
                {
                    foreach (Face f in z.Faces)
                    {
                        var d1 = z.Vertices[f.Vertices[0]];
                        var d2 = z.Vertices[f.Vertices[1]];
                        var d3 = z.Vertices[f.Vertices[2]];
                        var d4 = z.Vertices[f.Vertices[3]];
                        var s  = new MarchingSquare(contourValue, d1, d2, d3, d4, dataIndex);
                        if (s.squareCase == 0 || s.squareCase == 15)
                        {
                            continue;
                        }
                        contourLines.Add(new List <Vertex>());

                        System.Drawing.Color c = valueToColor(mode, (float)contourValue);
                        contourColors.Add(new double[3] {
                            c.R / 255.0, c.G / 255.0, c.B / 255.0
                        });
                        var edges   = helper[s.squareCase];
                        var points1 = s.GetPoints(edges[0]);
                        var points2 = s.GetPoints(edges[1]);


                        contourLines[idx].Add(GetVertex(points1.Item1, points1.Item2, s[edges[0]]));
                        contourLines[idx].Add(GetVertex(points2.Item1, points2.Item2, s[edges[1]]));
                        idx++;

                        if (edges[2] == -1)
                        {
                            //idx++;
                            continue;
                        }
                        contourLines.Add(new List <Vertex>());
                        points1 = s.GetPoints(edges[2]);
                        points2 = s.GetPoints(edges[3]);
                        contourLines[idx].Add(GetVertex(points1.Item1, points1.Item2, s[edges[2]]));
                        contourLines[idx].Add(GetVertex(points2.Item1, points2.Item2, s[edges[3]]));
                        idx++;
                    }
                }
                contourValue += contourStep;
            }
            return(contourLines);
        }
Beispiel #3
0
        public static List <Shape> CalcShapes(Mesh m, int countourCount, uint dataIndex, Testing_openTK_again.Del valueToColor, ColorMapControl.ColorMap.Mode mode)
        {
            List <Shape> shapes = new List <Shape>();

            shapes.Add(new Shape());
            double min, max;

            m.GetMinMaxValues(dataIndex, out min, out max);
            double contourStep      = (max - min) / countourCount;
            double contourValue     = min + contourStep * 0.5;
            int    idx              = 0;
            double prevContourValue = 0;

            contourValue     = min + contourStep * 0.5;
            prevContourValue = min;
            Point3 lower = new Point3(100000, 100000, 100000);

            for (int i = -1; i < countourCount; ++i)
            {
                foreach (Zone z in m.Zones)
                {
                    foreach (Face f in z.Faces)
                    {
                        if (z.ElementType == ElementType.Triangle)
                        {
                            (var v1, var v2, var v3) =
                                (z.Vertices[f.Vertices[0]], z.Vertices[f.Vertices[1]],
                                 z.Vertices[f.Vertices[2]]);
                            (var d1, var d2, var d3) =
                                (v1.Data[dataIndex], v2.Data[dataIndex], v3.Data[dataIndex]);
                            if (i == countourCount - 1)
                            {
                                contourValue = max;
                            }
                            lower.x = Math.Min(lower.x, Math.Min(v1.Position.x, Math.Min(v2.Position.x, v3.Position.x)));
                            lower.y = Math.Min(lower.y, Math.Min(v1.Position.y, Math.Min(v2.Position.y, v3.Position.y)));

                            shapes[idx].colorAlpha = (prevContourValue + contourValue) * 0.5;
                            if (isBetween(d1, prevContourValue, contourValue))
                            {
                                shapes[idx].verts.Add(v1.Position);
                            }
                            if (isBetween(d2, prevContourValue, contourValue))
                            {
                                shapes[idx].verts.Add(v2.Position);
                            }
                            if (isBetween(d3, prevContourValue, contourValue))
                            {
                                shapes[idx].verts.Add(v3.Position);
                            }

                            if (isBetween(contourValue, d1, d2))
                            {
                                shapes[idx].verts.Add(process(contourValue, v1.Position, v2.Position, d1, d2));
                            }
                            if (isBetween(contourValue, d2, d3))
                            {
                                shapes[idx].verts.Add(process(contourValue, v2.Position, v3.Position, d2, d3));
                            }
                            if (isBetween(contourValue, d1, d3))
                            {
                                shapes[idx].verts.Add(process(contourValue, v1.Position, v3.Position, d1, d3));
                            }
                            if (isBetween(prevContourValue, d1, d2))
                            {
                                shapes[idx].verts.Add(process(prevContourValue, v1.Position, v2.Position, d1, d2));
                            }
                            if (isBetween(prevContourValue, d2, d3))
                            {
                                shapes[idx].verts.Add(process(prevContourValue, v2.Position, v3.Position, d2, d3));
                            }
                            if (isBetween(prevContourValue, d1, d3))
                            {
                                shapes[idx].verts.Add(process(prevContourValue, v1.Position, v3.Position, d1, d3));
                            }
                            if (shapes[idx].verts.Count > 2)
                            {
                                shapes.Add(new Shape());
                                idx++;
                            }
                        }
                        else
                        {
                            (var v1, var v2, var v3, var v4) =
                                (z.Vertices[f.Vertices[0]], z.Vertices[f.Vertices[1]],
                                 z.Vertices[f.Vertices[2]], z.Vertices[f.Vertices[3]]);
                            (var d1, var d2, var d3, var d4) =
                                (v1.Data[dataIndex], v2.Data[dataIndex], v3.Data[dataIndex], v4.Data[dataIndex]);
                            lower.x = Math.Min(lower.x, Math.Min(v1.Position.x, Math.Min(v2.Position.x, Math.Min(v3.Position.x, v4.Position.x))));
                            lower.y = Math.Min(lower.y, Math.Min(v1.Position.y, Math.Min(v2.Position.y, Math.Min(v3.Position.y, v4.Position.y))));
                            if (i == countourCount - 1)
                            {
                                contourValue = max;
                            }

                            shapes[idx].colorAlpha = (prevContourValue + contourValue) * 0.5;
                            if (isBetween(d1, prevContourValue, contourValue))
                            {
                                shapes[idx].verts.Add(v1.Position);
                            }
                            if (isBetween(d2, prevContourValue, contourValue))
                            {
                                shapes[idx].verts.Add(v2.Position);
                            }
                            if (isBetween(d3, prevContourValue, contourValue))
                            {
                                shapes[idx].verts.Add(v3.Position);
                            }
                            if (isBetween(d4, prevContourValue, contourValue))
                            {
                                shapes[idx].verts.Add(v4.Position);
                            }
                            if (isBetween(contourValue, d1, d2))
                            {
                                shapes[idx].verts.Add(process(contourValue, v1.Position, v2.Position, d1, d2));
                            }
                            if (isBetween(contourValue, d2, d3))
                            {
                                shapes[idx].verts.Add(process(contourValue, v2.Position, v3.Position, d2, d3));
                            }
                            if (isBetween(contourValue, d3, d4))
                            {
                                shapes[idx].verts.Add(process(contourValue, v3.Position, v4.Position, d3, d4));
                            }
                            if (isBetween(contourValue, d4, d1))
                            {
                                shapes[idx].verts.Add(process(contourValue, v4.Position, v1.Position, d4, d1));
                            }
                            if (isBetween(prevContourValue, d1, d2))
                            {
                                shapes[idx].verts.Add(process(prevContourValue, v1.Position, v2.Position, d1, d2));
                            }
                            if (isBetween(prevContourValue, d2, d3))
                            {
                                shapes[idx].verts.Add(process(prevContourValue, v2.Position, v3.Position, d2, d3));
                            }
                            if (isBetween(prevContourValue, d3, d4))
                            {
                                shapes[idx].verts.Add(process(prevContourValue, v3.Position, v4.Position, d3, d4));
                            }
                            if (isBetween(prevContourValue, d4, d1))
                            {
                                shapes[idx].verts.Add(process(prevContourValue, v4.Position, v1.Position, d4, d1));
                            }
                            if (shapes[idx].verts.Count > 2)
                            {
                                shapes.Add(new Shape());
                                idx++;
                            }
                        }
                    }
                }

                prevContourValue = contourValue;
                contourValue    += contourStep;
            }
            shapes.RemoveAll(s => s.verts.Count == 0);
            Point3 mostLeft  = new Point3();
            Point3 mostRight = new Point3();

            foreach (Shape s in shapes)
            {
                lower = s.verts[0];
                //mostLeft = s.verts[0];
                //mostRight = s.verts[0];
                //foreach (Point3 p in s.verts)
                //{
                //    if (p.x < mostLeft.x)
                //        mostLeft = p;1
                //    if (p.x > mostRight.x)
                //        mostRight = p;
                // }
                //var upper = s.verts.Where(p => p.y <= mostLeft.y).ToList();
                //var upper = s.verts.Where(p => p.y > mostRight.y).ToList();
                foreach (Point3 p in s.verts)
                {
                    if (p.x < lower.x)
                    {
                        lower = p;
                    }
                }
                s.verts.Sort((Point3 a, Point3 b) =>
                {
                    double angle1 = Math2.angle(a, lower);
                    double angle2 = Math2.angle(b, lower);
                    return(angle1.CompareTo(angle2));
                });

                Color c = valueToColor(mode, (float)s.colorAlpha);
                s.color = new double[3]
                {
                    (double)c.R / 255.0,
                    (double)c.G / 255.0,
                    (double)c.B / 255.0
                };
            }

            return(shapes);
        }