Пример #1
0
        /// 2Nurbs
        ///
        public string Mesh2Topo(ref Mesh mesh, out Mesh mesh2, int edge, out IndexPair data)
        {
            Rhino.Geometry.Collections.MeshTopologyEdgeList   el = mesh.TopologyEdges;
            Rhino.Geometry.Collections.MeshTopologyVertexList vs = mesh.TopologyVertices;
            string     str = "";
            List <int> firstLoop1;

            str += FirstEdge(mesh, out firstLoop1);
            double column = (double)vs.Count / (double)firstLoop1.Count;
            int    Column = (int)column;

            if (column - Column != 0)
            {
                str += "Points Count error,Please confirm the topo to be quad style";
            }
            int[]      energy  = new int[vs.Count];
            List <int> indexPt = new List <int>();

            indexPt.AddRange(firstLoop1);
            for (int i = 0; i < firstLoop1.Count; i++)
            {
                energy[firstLoop1[i]] = 1;
            }
            for (int i = 0; i < Column - 1; i++)
            {
                bool sign = true;
                for (int j = 0; j < firstLoop1.Count; j++)
                {
                    int[] index = vs.ConnectedTopologyVertices(firstLoop1[j]);
                    for (int k = 0; k < index.Length; k++)
                    {
                        energy[index[k]]++;
                    }
                }
                for (int j = 0; j < firstLoop1.Count; j++)
                {
                    int[] index = vs.ConnectedTopologyVertices(firstLoop1[j]);
                    for (int k = 0; k < index.Length; k++)
                    {
                        if (energy[index[k]] == 1)
                        {
                            firstLoop1[j] = index[k]; sign = false; break;
                        }
                    }
                }
                if (sign)
                {
                    str += " Loop false,Not quad topo Or To the end";
                }
                else
                {
                    indexPt.AddRange(firstLoop1);
                }
            }
            ///
            ///*******
            double         MX      = (double)Column - 1;
            double         MY      = (double)firstLoop1.Count - 1;
            List <Point3d> output1 = new List <Point3d>();
            List <Point3d> output2 = new List <Point3d>();
            int            iCount  = 0;

            Color[] cl = new Color[mesh.Vertices.Count];
            //edge
            List <int> pl1 = new List <int>();
            List <int> pl2 = new List <int>();
            List <int> pl3 = new List <int>();
            List <int> pl4 = new List <int>();
            int        edge1 = 0, edge2 = 0, edge3 = 0, edge4 = 0;

            //////////
            for (int i = 0; i < Column; i++)
            {
                for (int j = 0; j < firstLoop1.Count; j++)
                {
                    if (i == 0)
                    {
                        pl1.Add(iCount);
                    }
                    if (i == column - 1)
                    {
                        pl3.Add(iCount);
                    }
                    if (j == 0)
                    {
                        pl2.Add(iCount);
                    }
                    if (j == firstLoop1.Count - 1)
                    {
                        pl4.Add(iCount);
                    }
                    if (i == 0 && j == 0)
                    {
                        edge1 = iCount;
                    }
                    if (i == 0 && j == firstLoop1.Count - 1)
                    {
                        edge2 = iCount;
                    }
                    if (i == column - 1 && j == firstLoop1.Count - 1)
                    {
                        edge3 = iCount;
                    }
                    if (i == column - 1 && j == 0)
                    {
                        edge4 = iCount;
                    }
                    output1.Add(vs[indexPt[iCount]]);
                    int indexV = vs.MeshVertexIndices(indexPt[iCount])[0];
                    cl[iCount] = mesh.VertexColors[indexV];
                    iCount++;
                    Point3d pt = new Point3d(edge * i, edge * j, 0);
                    output2.Add(pt);
                }
            }
            mesh2 = mc.MeshFromPoints(output2, firstLoop1.Count, Column);
            mesh  = mc.MeshFromPoints(output1, firstLoop1.Count, Column);
            mesh.VertexColors.Clear();
            mesh.VertexColors.AppendColors(cl);
            mesh2.VertexColors.Clear();
            mesh2.VertexColors.AppendColors(cl);
            ///edge
            List <Point3d> pts;


            /////////////////////////////////////////////////////////
            Color[] cl1 = new Color[pl1.Count * 2]; pts = new List <Point3d>();
            for (int i = 0; i < pl1.Count; i++)
            {
                pts.Add(new Point3d(mesh2.Vertices[pl1[i]]));
                pts.Add((Point3d)mesh2.Vertices[pl1[i]] + new Vector3d(-edge, 0, 0));
                cl1[i * 2] = mesh2.VertexColors[pl1[i]]; cl1[i * 2 + 1] = mesh2.VertexColors[pl1[i]];
            }
            Mesh mesh3 = mc.MeshFromPoints(pts, 2, pl1.Count);

            mesh3.VertexColors.AppendColors(cl1);
            mesh2.Append(mesh3);
            /////////////////////////////////////////////////////////
            Color[] cl2 = new Color[pl2.Count * 2]; pts = new List <Point3d>();
            for (int i = 0; i < pl2.Count; i++)
            {
                pts.Add(new Point3d(mesh2.Vertices[pl2[i]]));
                pts.Add((Point3d)mesh2.Vertices[pl2[i]] + new Vector3d(0, -edge, 0));
                cl2[i * 2] = mesh2.VertexColors[pl2[i]]; cl2[i * 2 + 1] = mesh2.VertexColors[pl2[i]];
            }
            mesh3 = mc.MeshFromPoints(pts, 2, pl2.Count);
            mesh3.VertexColors.AppendColors(cl2);
            mesh2.Append(mesh3);
            /////////////////////////////////////////////////////////
            Color[] cl3 = new Color[pl3.Count * 2]; pts = new List <Point3d>();
            for (int i = 0; i < pl3.Count; i++)
            {
                pts.Add(new Point3d(mesh2.Vertices[pl3[i]]));
                pts.Add((Point3d)mesh2.Vertices[pl3[i]] + new Vector3d(edge, 0, 0));
                cl3[i * 2] = mesh2.VertexColors[pl3[i]]; cl3[i * 2 + 1] = mesh2.VertexColors[pl3[i]];
            }
            mesh3 = mc.MeshFromPoints(pts, 2, pl3.Count);
            mesh3.VertexColors.AppendColors(cl3);
            mesh2.Append(mesh3);
            /////////////////////////////////////////////////////////
            Color[] cl4 = new Color[pl4.Count * 2]; pts = new List <Point3d>();
            for (int i = 0; i < pl4.Count; i++)
            {
                pts.Add(new Point3d(mesh2.Vertices[pl4[i]]));
                pts.Add((Point3d)mesh2.Vertices[pl4[i]] + new Vector3d(0, edge, 0));
                cl4[i * 2] = mesh2.VertexColors[pl4[i]]; cl4[i * 2 + 1] = mesh2.VertexColors[pl4[i]];
            }
            mesh3 = mc.MeshFromPoints(pts, 2, pl4.Count);
            mesh3.VertexColors.AppendColors(cl4);
            mesh2.Append(mesh3);
            /////////////////////////////////////////////////////////

            Point3d ept = (Point3d)mesh2.Vertices[edge1];

            mesh3 = mc.MeshFromPoints(ept, ept + new Vector3d(-edge, 0, 0), ept + new Vector3d(-edge, -edge, 0), ept + new Vector3d(0, -edge, 0));
            mesh3.VertexColors.Add(mesh2.VertexColors[edge1]);
            mesh3.VertexColors.Add(mesh2.VertexColors[edge1]);
            mesh3.VertexColors.Add(mesh2.VertexColors[edge1]);
            mesh3.VertexColors.Add(mesh2.VertexColors[edge1]);
            mesh2.Append(mesh3);
            ept   = (Point3d)mesh2.Vertices[edge2];
            mesh3 = mc.MeshFromPoints(ept, ept + new Vector3d(-edge, 0, 0), ept + new Vector3d(-edge, edge, 0), ept + new Vector3d(0, edge, 0));
            mesh3.VertexColors.Add(mesh2.VertexColors[edge2]);
            mesh3.VertexColors.Add(mesh2.VertexColors[edge2]);
            mesh3.VertexColors.Add(mesh2.VertexColors[edge2]);
            mesh3.VertexColors.Add(mesh2.VertexColors[edge2]);
            mesh2.Append(mesh3);
            ept   = (Point3d)mesh2.Vertices[edge3];
            mesh3 = mc.MeshFromPoints(ept, ept + new Vector3d(edge, 0, 0), ept + new Vector3d(edge, edge, 0), ept + new Vector3d(0, edge, 0));
            mesh3.VertexColors.Add(mesh2.VertexColors[edge3]);
            mesh3.VertexColors.Add(mesh2.VertexColors[edge3]);
            mesh3.VertexColors.Add(mesh2.VertexColors[edge3]);
            mesh3.VertexColors.Add(mesh2.VertexColors[edge3]);
            mesh2.Append(mesh3);
            ept   = (Point3d)mesh2.Vertices[edge4];
            mesh3 = mc.MeshFromPoints(ept, ept + new Vector3d(edge, 0, 0), ept + new Vector3d(edge, -edge, 0), ept + new Vector3d(0, -edge, 0));
            mesh3.VertexColors.Add(mesh2.VertexColors[edge4]);
            mesh3.VertexColors.Add(mesh2.VertexColors[edge4]);
            mesh3.VertexColors.Add(mesh2.VertexColors[edge4]);
            mesh3.VertexColors.Add(mesh2.VertexColors[edge4]);
            mesh2.Append(mesh3);


            //////////////////////////////////////////////////////
            for (double i = 1; i <= Column; i++)
            {
                for (double j = 1; j <= firstLoop1.Count; j++)
                {
                    mesh.TextureCoordinates.Add(i / (Column + 1), j / (firstLoop1.Count + 1));
                }
            }
            data = new IndexPair((Column + 1) * edge, (firstLoop1.Count + 1) * edge);
            return(str);
        }
Пример #2
0
        public Mesh Plannar2D(Polyline pl)
        {
            Mesh mesh = new Mesh();

            if (pl[0].DistanceTo(pl[pl.Count - 1]) < Rhino.RhinoDoc.ActiveDoc.ModelAbsoluteTolerance)
            {
                pl.RemoveAt(pl.Count - 1);
            }
            Polyline pl2 = new Polyline(pl);

            if (pl.Count < 3)
            {
                return(mesh);
            }
            if (pl.Count == 3)
            {
                mesh.Append(mc.MeshFromPoints(pl2[0], pl2[1], pl2[2])); return(mesh);
            }
            ///////////////////////////////////
            double[] polyX = new double[pl.Count]; //  =  horizontalcoordinates of corners
            double[] polyY = new double[pl.Count]; // =  verticalcoordinates of corners
            for (int ii = 0; ii < pl.Count; ii++)
            {
                polyX[ii] = pl[ii].X;
                polyY[ii] = pl[ii].Y;
            }
            ////////////////////////////////
            while (pl2.Count >= 3)
            {
                int sign = -1; int before = -1; int after = -1;
                for (int i = 0; i < pl2.Count; i++)
                {
                    if (i == 0)
                    {
                        before = pl2.Count - 1;
                    }
                    else
                    {
                        before = i - 1;
                    }
                    if (i == pl2.Count - 1)
                    {
                        after = 0;
                    }
                    else
                    {
                        after = i + 1;
                    }

                    Point3d cen = (pl2[before] + pl2[after]) / 2;
                    if (!LinePolyline(new Line(pl2[before], pl2[after]), pl))
                    {
                        if (pointInPolygon2D_1(polyX, polyY, cen.X, cen.Y))
                        {
                            sign = i;
                            if (sign == 0)
                            {
                                before = pl2.Count - 1;
                            }
                            else
                            {
                                before = sign - 1;
                            }
                            if (sign == pl2.Count - 1)
                            {
                                after = 0;
                            }
                            else
                            {
                                after = sign + 1;
                            }
                            mesh.Append(mc.MeshFromPoints(pl2[before], pl2[sign], pl2[after]));
                            pl2.RemoveAt(sign);
                            break;
                        }
                    }
                }
            }
            mesh.Weld(Rhino.RhinoDoc.ActiveDoc.ModelAbsoluteTolerance);
            return(mesh);
        }