コード例 #1
0
    // very simple edge smoothing by comparing distance between adjacent
    // points on edge and merging if close enough
    public void MergeClosePoints(float mergeDistance)
    {
        if (mergeDistance < 0.0f)
        {
            return;
        }

        ArrayList newOrderedEdges = new ArrayList();         // list to stick the joined edges
        //int originalCount = orderedEdges.Count;
        MC_Edge currentEdge = (MC_Edge)orderedEdges[0];

        for (int i = 1; i < orderedEdges.Count; i++)           // start with the second edge for comparison
        {
            MC_Edge   testEdge = (MC_Edge)orderedEdges[i];
            float     dist     = Vector2.Distance(new Vector2(currentEdge.v1.x, currentEdge.v1.y), new Vector2(testEdge.v2.x, testEdge.v2.y));
            MC_Vertex v2       = testEdge.v2;

            if (dist < mergeDistance)                 // combine the two lines into current
            {
                currentEdge.v2 = v2;
            }
            else               // there isn't a continuation of line, so add current to new ordered and set current to testEdge
            {
                newOrderedEdges.Add(currentEdge);
                currentEdge = testEdge;
            }
        }
        newOrderedEdges.Add(currentEdge);
        orderedEdges = newOrderedEdges;

        /*if (originalCount != orderedEdges.Count)
         * {
         *      Debug.Log("SimpleSurfaceEdge::MergeClosePoints(): trimmed from " + originalCount + " to " + orderedEdges.Count + " edges.");
         * }*/
    }
コード例 #2
0
 public MC_Edge(MC_Vertex _v1, MC_Vertex _v2)
 {
     v1 = _v1;
     v2 = _v2;
     isShared = false;
     attachedFaces = new ArrayList();
 }
コード例 #3
0
    public bool AddEdge(MC_Edge e)
    {
        // see if it shares with the last edge
        MC_Vertex lastVertex = ((MC_Edge)orderedEdges[orderedEdges.Count - 1]).v2;

        if (e.v1 == lastVertex)           // this is the correct vertex order
        {
            orderedEdges.Add(e);
            return(true);
        }
        else if (e.v2 == lastVertex)           // incorrect order, switch before adding
        {
            e.SwitchVertices();
            orderedEdges.Add(e);
            return(true);
        }

        // see if it shares with the first edge
        MC_Vertex firstVertex = ((MC_Edge)orderedEdges[0]).v1;

        if (e.v2 == firstVertex)           // this is the correct vertex order
        {
            orderedEdges.Insert(0, e);
            return(true);
        }
        else if (e.v1 == firstVertex)           // incorrect order, switch before adding
        {
            e.SwitchVertices();
            orderedEdges.Insert(0, e);
            return(true);
        }
        return(false);
    }
コード例 #4
0
    public void SwitchVertices()
    {
        MC_Vertex hold = v1;

        v1 = v2;
        v2 = hold;
    }
コード例 #5
0
 public MC_Edge(MC_Vertex _v1, MC_Vertex _v2)
 {
     v1            = _v1;
     v2            = _v2;
     isShared      = false;
     attachedFaces = new ArrayList();
 }
コード例 #6
0
 public Vector2[] GetVertexList()
 {
     Vector2[] verts = new Vector2[orderedEdges.Count];
     for (int i = 0; i < orderedEdges.Count; i++)
     {
         MC_Vertex v = ((MC_Edge)orderedEdges[i]).v1;
         verts[i] = new Vector2(v.x, v.y);
     }
     return(verts);
 }
コード例 #7
0
    public Vector2 GetUVForIndex(int i)
    {
        if (i >= orderedEdges.Count)
        {
            //Debug.Log("got " + i + " index for ordered edge with " + orderedEdges.Count + " elements");
            return(new Vector2());
        }
        MC_Vertex v = ((MC_Edge)orderedEdges[i]).v1;

        return(new Vector2(v.u, v.v));
    }
コード例 #8
0
    public bool IsClosed()
    {
        if (orderedEdges.Count < 2)
        {
            return(false);
        }
        MC_Vertex lastVertex  = ((MC_Edge)orderedEdges[orderedEdges.Count - 1]).v2;
        MC_Vertex firstVertex = ((MC_Edge)orderedEdges[0]).v1;

        if (firstVertex.x == lastVertex.x && firstVertex.y == lastVertex.y)
        {
            return(true);
        }
        return(false);
    }
コード例 #9
0
    MC_Vertex GetVertex(float x, float y, float u, float v)
    {
        for (int i = 0; i < vertices.Count; i++)
        {
            MC_Vertex ver = (MC_Vertex)vertices[i];
            if (ver.x == x && ver.y == y)
            {
                return(ver);
            }
        }
        MC_Vertex newver = new MC_Vertex(x, y, u, v);

        vertices.Add(newver);
        return(newver);
    }
コード例 #10
0
 public MC_Face(MC_Edge _e1, MC_Edge _e2, MC_Edge _e3)
 {
     e1 = _e1;
     e2 = _e2;
     e3 = _e3;
     e1.AttachFace(this);
     e2.AttachFace(this);
     e3.AttachFace(this);
     v1 = e1.v1;
     v2 = e1.v2;
     if (e2.v1 != v1 && e2.v1 != v2)
     {
         v3 = e2.v1;
     }
     else
     {
         v3 = e2.v2;
     }
 }
コード例 #11
0
    /*
     *	SimplifyEdge() searchs for edges in which the shared vertex is a point
     *	on a line between the two outer points.
     */
    public void SimplifyEdge()
    {
        ArrayList newOrderedEdges = new ArrayList();         // list to stick the joined edges
        MC_Edge   currentEdge     = (MC_Edge)orderedEdges[0];

        for (int i = 1; i < orderedEdges.Count; i++)           // start with the second edge for comparison
        {
            MC_Edge   testEdge    = (MC_Edge)orderedEdges[i];
            MC_Vertex v1          = currentEdge.v1;
            MC_Vertex v2          = testEdge.v2;
            MC_Vertex sharedPoint = currentEdge.v2;
            if (sharedPoint != testEdge.v1)               // oops, bad list, it should be closed by now
            {
                Debug.LogError("Mesh Creator EdgeLoop Error: list is not ordered when simplifying edge.  Please create a new issue at https://github.com/uclagamelab/MeshCreator/issues.");
                return;
            }
            if (v1 == v2)
            {
                Debug.LogError("Mesh Creator EdgeLoop Error: found matching endpoints for a line when simplifying.  Please create a new issue at https://github.com/uclagamelab/MeshCreator/issues.");
                return;
            }
            // determine if sharedPoint is on a line between the two endpoints
            //The point (x3, y3) is on the line determined by (x1, y1) and (x2, y2) if and only if (x3-x1)*(y2-y1)==(x2-x1)*(y3-y1).
            float slope1 = (sharedPoint.x - v1.x) * (v2.y - v1.y);
            float slope2 = (v2.x - v1.x) * (sharedPoint.y - v1.y);
            if (slope1 == slope2)               // combine the two lines into current
            {
                currentEdge.v2 = v2;
            }
            else               // there isn't a continuation of line, so add current to new ordered and set current to testEdge
            {
                newOrderedEdges.Add(currentEdge);
                currentEdge = testEdge;
            }
        }
        newOrderedEdges.Add(currentEdge);
        orderedEdges = newOrderedEdges;
    }
コード例 #12
0
 public void SwitchVertices()
 {
     MC_Vertex hold = v1;
     v1 = v2;
     v2 = hold;
 }
コード例 #13
0
 MC_Vertex GetVertex(float x, float y, float u, float v)
 {
     for (int i = 0; i < vertices.Count; i++) {
         MC_Vertex ver = (MC_Vertex) vertices[i];
         if (ver.x == x && ver.y == y) {
             return ver;
         }
     }
     MC_Vertex newver = new MC_Vertex(x,y,u,v);
     vertices.Add(newver);
     return newver;
 }
コード例 #14
0
 public MC_Face(MC_Edge _e1, MC_Edge _e2, MC_Edge _e3)
 {
     e1 = _e1;
     e2 = _e2;
     e3 = _e3;
     e1.AttachFace(this);
     e2.AttachFace(this);
     e3.AttachFace(this);
     v1 = e1.v1;
     v2 = e1.v2;
     if (e2.v1 != v1 && e2.v1 != v2) v3 = e2.v1;
     else v3 = e2.v2;
 }