Exemplo n.º 1
0
        internal void ComputeFaceNormal(int faceId, ref double[] nml, bool willUnitize = true)
        {
            var v0 = Vertex(Face(faceId)[0]);
            var v1 = Vertex(Face(faceId)[1]);
            var v2 = Vertex(Face(faceId)[2]);

            var a = new[] { v1[0] - v0[0], v1[1] - v0[1], v1[2] - v0[2] };
            var b = new[] { v2[0] - v0[0], v2[1] - v0[1], v2[2] - v0[2] };

            MxVectorOps.Cross3(ref nml, a, b);
            if (willUnitize)
            {
                MxVectorOps.Unitize3(ref nml);
            }
        }
Exemplo n.º 2
0
        internal double ComputeCornerAngle(int faceId, int corner)
        {
            var cornerPrev = (corner == 0) ? 2 : (corner - 1);
            var cornerNext = (corner == 2) ? 0 : (corner + 1);

            var ePrev = new double[3];

            MxVectorOps.Sub3(ref ePrev, Corner(faceId, cornerPrev).Pos, Corner(faceId, corner).Pos);
            MxVectorOps.Unitize3(ref ePrev);

            var eNext = new double[3];

            MxVectorOps.Sub3(ref eNext, Corner(faceId, cornerNext).Pos, Corner(faceId, corner).Pos);
            MxVectorOps.Unitize3(ref eNext);

            return(Math.Acos(MxVectorOps.Dot3(ePrev, eNext)));
        }
Exemplo n.º 3
0
        internal int CheckLocalValidity(int vertId, double[] vNew)
        {
            var n1      = model.Neighbors(vertId);
            var nFailed = 0;

            foreach (var faceId in n1)
            {
                if (!model.FaceIsValid(faceId))
                {
                    continue;
                }

                var face = model.Face(faceId);
                var k    = face.FindVertex(vertId);
                var x    = face[(k + 1) % 3];
                var y    = face[(k + 2) % 3];
                var vPos = model.Vertex(vertId).Pos;
                var xPos = model.Vertex(x).Pos;
                var yPos = model.Vertex(y).Pos;

                var dYX = new double[3];
                MxVectorOps.Sub3(ref dYX, xPos, yPos);

                var dVX = new double[3];
                MxVectorOps.Sub3(ref dVX, vPos, xPos);

                var dVNew = new double[3];
                MxVectorOps.Sub3(ref dVNew, vNew, xPos);

                var fN = new double[3];
                MxVectorOps.Cross3(ref fN, dYX, dVX);

                var nml = new double[3];
                MxVectorOps.Cross3(ref nml, dYX, dVX);
                MxVectorOps.Unitize3(ref nml);

                if (MxVectorOps.Dot3(dVNew, nml) < LocalValidityThreshold * MxVectorOps.Dot3(dVX, nml))
                {
                    nFailed++;
                }
            }

            return(nFailed);
        }
Exemplo n.º 4
0
        internal void ComputeVertexNormal(int vertId, ref double[] nml)
        {
            for (var i = 0; i < 3; i++)
            {
                nml[i] = 0.0;
            }
            var star = faceLinks[vertId];

            foreach (var faceId in star)
            {
                var faceNml = new double[3];

                ComputeFaceNormal(faceId, ref faceNml, false);
                MxVectorOps.AddInto3(ref nml, faceNml);
            }

            if (star.Count > 1)
            {
                MxVectorOps.Unitize3(ref nml);
            }
        }