コード例 #1
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)));
        }
コード例 #2
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);
        }
コード例 #3
0
 internal void ComputeFacePlane(int faceId, ref double[] plane, bool willUnitize = true)
 {
     ComputeFaceNormal(faceId, ref plane, willUnitize);
     plane[3] = -MxVectorOps.Dot3(plane, Corner(faceId, 0).Pos);
 }