Пример #1
0
        // If edgeIndex == -1, this method finds the first matching edge. Otherwise, it finds the edge with the given index
        public bool TryRemoveOuterEdge(ref Vector3 posv0, ref Vector3 posv1, ref int edgeIndex)
        {
            // Careful: This is quadratic in the number of entries in a bin in m_outerEdgePoints, so don't make the bins too large!
            if (edgeIndex == -1)
            {
                var en0 = m_outerEdgePoints.QueryPointsSphere(ref posv0, OUTER_EDGE_EPSILON);
                while (en0.MoveNext())
                {
                    var en1 = m_outerEdgePoints.QueryPointsSphere(ref posv1, OUTER_EDGE_EPSILON);
                    while (en1.MoveNext())
                    {
                        OuterEdgePoint p0 = en0.Current;
                        OuterEdgePoint p1 = en1.Current;
                        if (p0.EdgeIndex == p1.EdgeIndex && p0.FirstPoint && !p1.FirstPoint)
                        {
                            edgeIndex = p0.EdgeIndex;
                            m_outerEdgePoints.RemoveTwo(ref en0, ref en1);
                            return(true);
                        }
                    }
                }

                edgeIndex = -1;
            }
            else
            {
                int found = 0;
                var en0   = m_outerEdgePoints.QueryPointsSphere(ref posv0, OUTER_EDGE_EPSILON);
                while (en0.MoveNext())
                {
                    if (en0.Current.EdgeIndex == edgeIndex && en0.Current.FirstPoint)
                    {
                        found++;
                        break;
                    }
                }

                var en1 = m_outerEdgePoints.QueryPointsSphere(ref posv1, OUTER_EDGE_EPSILON);
                while (en1.MoveNext())
                {
                    if (en1.Current.EdgeIndex == edgeIndex && !en1.Current.FirstPoint)
                    {
                        found++;
                        break;
                    }
                }

                if (found == 2)
                {
                    m_outerEdgePoints.RemoveTwo(ref en0, ref en1);
                    return(true);
                }
                else
                {
                    edgeIndex = -1;
                }
            }

            return(false);
        }