05 - 08 - 2020

Detect edges in a 3D mesh

User Rating:  / 0
PoorBest 

Detecting edges in a 3D mesh is not that easy but after some experiments i ended up with this code that work fine so far i have tested it. The code look like this;

public static class DetectEdges
    {
        public class Edge
        {
            public int a, b;
            public Edge(int a, int b)
            {
                this.a = a;
                this.b = b;
            }
        }
        
        private static float smallnum = 0.001f;
 
        public static List<Edge> SearchBorders(ref List<Vertex> verts, ref List<Triangle> faces, List<int> selectedfaces)
        {
            List<Edge> edges = new List<Edge>();
            foreach (Triangle t in faces)
                t.ComputeNormal(ref verts);
            int n;
            foreach (int i in selectedfaces)
            {
                Triangle t = faces[i];                
                n = SearchCount(ref faces, t, t.P0, t.P1);
                if (n < 1) if (!edges.Exists(delegate(Edge e) { return e.a == t.P0 && e.b == t.P1 || e.b == t.P0 && e.a == t.P1; })) edges.Add(new Edge(t.P0, t.P1));
                n = SearchCount(ref faces, t, t.P1, t.P2);
                if (n < 1) if (!edges.Exists(delegate(Edge e) { return e.a == t.P1 && e.b == t.P2 || e.b == t.P1 && e.a == t.P2; })) edges.Add(new Edge(t.P1, t.P2));
                n = SearchCount(ref faces, t, t.P2, t.P0);
                if (n < 1) if (!edges.Exists(delegate(Edge e) { return e.a == t.P2 && e.b == t.P0 || e.b == t.P2 && e.a == t.P0; })) edges.Add(new Edge(t.P2, t.P0));
            }
            return edges;
        }
 
        private static int SearchCount(ref List<Triangle> faces, Triangle t, int nV, int nW)
        {
            return faces.FindAll(delegate(Triangle tx) { return Test(t, tx, nV, nW);}).Count;
        }
 
        private static bool Test(Triangle a, Triangle b, int nV, int nW)
        {
            if (a == b)
                return false;
            else if (a._Normal.X - b._Normal.X < smallnum && a._Normal.Y - b._Normal.Y < smallnum && a._Normal.Z - b._Normal.Z < smallnum)
                return 
                (b.P0 == nV && b.P1 == nW || b.P1 == nV && b.P2 == nW || b.P2 == nV && b.P0 == nW) ||
                (b.P0 == nW && b.P1 == nV || b.P1 == nW && b.P2 == nV || b.P2 == nW && b.P0 == nV);
            else return false;
        }
    }
}

Add comment

Security code
Refresh