Ejemplo n.º 1
0
        internal void ApplyMeshPenalties(MxQSlimEdge info)
        {
            var n1 = model.Neighbors(info.V1);
            var n2 = model.Neighbors(info.V2);

            foreach (var faceId in n2) model.FaceMark(faceId, 0x00);
            foreach (var faceId in n1) model.FaceMark(faceId, 0x01);
            foreach (var faceId in n2) model.FaceMark(faceId, (byte)(model.FaceMark(faceId) + 0x1));

            var baseError = info.HeapKey;
            var bias = 0.0;

            var maxDeg = Math.Max(n1.Count, n2.Count);
            if (maxDeg > VertexDegreeLimit) bias += (maxDeg - VertexDegreeLimit)*MeshingPenalty*0.001;

            var nFailed = CheckLocalValidity(info.V1, info.vNew);
            nFailed += CheckLocalValidity(info.V2, info.vNew);
            if (nFailed > 0) bias += nFailed*MeshingPenalty;

            if (CompactnessRatio > 0.0)
            {
                var c1Min = CheckLocalCompactness(info.V1, info.vNew);
                var c2Min = CheckLocalCompactness(info.V2, info.vNew);
                var cMin = Math.Min(c1Min, c2Min);

                if (cMin < CompactnessRatio) bias += (1 - cMin);
            }

            info.HeapKey = (float)(baseError - bias);
        }
Ejemplo n.º 2
0
        internal void CreateEdge(int vertI, int vertJ)
        {
            var info = new MxQSlimEdge
            {
                V1 = vertI,
                V2 = vertJ
            };

            ComputeEdgeInfo(info);

            edgeLinks[vertI].Add(info);
            edgeLinks[vertJ].Add(info);
        }
Ejemplo n.º 3
0
        internal void ApplyMeshPenalties(MxQSlimEdge info)
        {
            var n1 = model.Neighbors(info.V1);
            var n2 = model.Neighbors(info.V2);

            foreach (var faceId in n2)
            {
                model.FaceMark(faceId, 0x00);
            }
            foreach (var faceId in n1)
            {
                model.FaceMark(faceId, 0x01);
            }
            foreach (var faceId in n2)
            {
                model.FaceMark(faceId, (byte)(model.FaceMark(faceId) + 0x1));
            }

            var baseError = info.HeapKey;
            var bias      = 0.0;

            var maxDeg = Math.Max(n1.Count, n2.Count);

            if (maxDeg > VertexDegreeLimit)
            {
                bias += (maxDeg - VertexDegreeLimit) * MeshingPenalty * 0.001;
            }

            var nFailed = CheckLocalValidity(info.V1, info.vNew);

            nFailed += CheckLocalValidity(info.V2, info.vNew);
            if (nFailed > 0)
            {
                bias += nFailed * MeshingPenalty;
            }

            if (CompactnessRatio > 0.0)
            {
                var c1Min = CheckLocalCompactness(info.V1, info.vNew);
                var c2Min = CheckLocalCompactness(info.V2, info.vNew);
                var cMin  = Math.Min(c1Min, c2Min);

                if (cMin < CompactnessRatio)
                {
                    bias += (1 - cMin);
                }
            }

            info.HeapKey = (float)(baseError - bias);
        }
Ejemplo n.º 4
0
 internal void FinalizeEdgeUpdate(MxQSlimEdge info)
 {
     if (MeshingPenalty > 1.0)
     {
         ApplyMeshPenalties(info);
     }
     if (info.IsInHeap)
     {
         heap.Update(info);
     }
     else
     {
         heap.Insert(info);
     }
 }
Ejemplo n.º 5
0
 internal void FinalizeEdgeUpdate(MxQSlimEdge info)
 {
     if (MeshingPenalty > 1.0) ApplyMeshPenalties(info);
     if (info.IsInHeap) heap.Update(info);
     else heap.Insert(info);
 }
Ejemplo n.º 6
0
 internal void Edge(int i, MxQSlimEdge edge)
 {
     heap[i] = edge;
 }
Ejemplo n.º 7
0
        internal void CreateEdge(int vertI, int vertJ)
        {
            var info = new MxQSlimEdge
            {
                V1 = vertI,
                V2 = vertJ
            };

            ComputeEdgeInfo(info);

            edgeLinks[vertI].Add(info);
            edgeLinks[vertJ].Add(info);
        }
Ejemplo n.º 8
0
        internal void ComputeTargetPlacement(MxQSlimEdge info)
        {
            var i = info.V1;
            var j = info.V2;

            var Qi = quadrics[i];
            var Qj = quadrics[j];
            var Q = Qi + Qj;

            var eMin = 0.0;
            if (PlacementPolicy == MxPlacement.Optimal
                && Q.Optimize(ref info.vNew[0], ref info.vNew[1], ref info.vNew[2]))
            {
                eMin = Q.Evaluate(info.vNew);
            }
            else
            {
                var vi = new MxVector3(model.Vertex(i));
                var vj = new MxVector3(model.Vertex(j));
                var best = new MxVector3(0.0, 0.0, 0.0);

                if (PlacementPolicy == MxPlacement.Line && Q.Optimize(vi, vj, ref best))
                {
                    eMin = Q.Evaluate(best);
                }
                else
                {
                    var ei = Q.Evaluate(vi);
                    var ej = Q.Evaluate(vj);

                    if (ei < ej)
                    {
                        eMin = ei;
                        best = vi;
                    }
                    else
                    {
                        eMin = ej;
                        best = vj;
                    }

                    if (PlacementPolicy == MxPlacement.EndOrMid)
                    {
                        var mid = (vi + vj)*0.5;
                        var eMid = Q.Evaluate(mid);
                        if (eMid < eMin)
                        {
                            eMin = eMid;
                            best = mid;
                        }
                    }
                }

                info.vNew[0] = best[0];
                info.vNew[1] = best[1];
                info.vNew[2] = best[2];
            }

            if (WeightingPolicy == MxWeighting.AreaAverage)
            {
                eMin /= Q.Area;
            }

            info.HeapKey = (float)(-eMin);
        }
Ejemplo n.º 9
0
 internal void ComputeEdgeInfo(MxQSlimEdge info)
 {
     ComputeTargetPlacement(info);
     FinalizeEdgeUpdate(info);
 }
Ejemplo n.º 10
0
 internal void Edge(int i, MxQSlimEdge edge)
 {
     heap[i] = edge;
 }
Ejemplo n.º 11
0
 internal void ComputeEdgeInfo(MxQSlimEdge info)
 {
     ComputeTargetPlacement(info);
     FinalizeEdgeUpdate(info);
 }
Ejemplo n.º 12
0
        internal void ComputeTargetPlacement(MxQSlimEdge info)
        {
            var i = info.V1;
            var j = info.V2;

            var Qi = quadrics[i];
            var Qj = quadrics[j];
            var Q  = Qi + Qj;

            var eMin = 0.0;

            if (PlacementPolicy == MxPlacement.Optimal &&
                Q.Optimize(ref info.vNew[0], ref info.vNew[1], ref info.vNew[2]))
            {
                eMin = Q.Evaluate(info.vNew);
            }
            else
            {
                var vi   = new MxVector3(model.Vertex(i));
                var vj   = new MxVector3(model.Vertex(j));
                var best = new MxVector3(0.0, 0.0, 0.0);

                if (PlacementPolicy == MxPlacement.Line && Q.Optimize(vi, vj, ref best))
                {
                    eMin = Q.Evaluate(best);
                }
                else
                {
                    var ei = Q.Evaluate(vi);
                    var ej = Q.Evaluate(vj);

                    if (ei < ej)
                    {
                        eMin = ei;
                        best = vi;
                    }
                    else
                    {
                        eMin = ej;
                        best = vj;
                    }

                    if (PlacementPolicy == MxPlacement.EndOrMid)
                    {
                        var mid  = (vi + vj) * 0.5;
                        var eMid = Q.Evaluate(mid);
                        if (eMid < eMin)
                        {
                            eMin = eMid;
                            best = mid;
                        }
                    }
                }

                info.vNew[0] = best[0];
                info.vNew[1] = best[1];
                info.vNew[2] = best[2];
            }

            if (WeightingPolicy == MxWeighting.AreaAverage)
            {
                eMin /= Q.Area;
            }

            info.HeapKey = (float)(-eMin);
        }