Esempio n. 1
0
        /// <summary>
        /// Merge overlapping <see cref="TimeWindow"/>s. For use by merging <see cref="WindowAssigner{TElement,TWindow}"/>.
        /// </summary>
        /// <param name="windows"></param>
        /// <param name="callback"></param>
        public static void MergeWindows(IEnumerable <TimeWindow> windows, IMergeWindowCallback <TimeWindow> callback)
        {
            // sort the windows by the start time and then merge overlapping windows
            var sortedWindows = windows.OrderBy(it => it.Start);

            var        merged       = new List <MergedItem>();
            MergedItem currentMerge = null;

            foreach (var candidate in sortedWindows)
            {
                if (currentMerge == null)
                {
                    currentMerge = new MergedItem(candidate, candidate);
                }
                else if (currentMerge.MergeResult.Intersects(candidate))
                {   // 两个窗口的时间段相互重叠,则属于同一会话,因此会话窗口策略把这两个窗口合并成一个新的、更长的会话窗口。
                    currentMerge.MergeResult = currentMerge.MergeResult.Cover(candidate);
                    currentMerge.ToBeMerged.Add(candidate);
                }
                else
                {
                    merged.Add(currentMerge);
                    currentMerge = new MergedItem(candidate, candidate);
                }
            }

            if (currentMerge != null)
            {
                merged.Add(currentMerge);
            }

            foreach (var mergeItem in merged)
            {
                if (mergeItem.ToBeMerged.Count > 0)
                {
                    callback.Merge(mergeItem.ToBeMerged, mergeItem.MergeResult);
                }
            }
        }
        static void TransformVertices(List <Vector3> verticesOut, List <Vector3> normalsOut, MergedItem item)
        {
            var mesh        = item.mesh;
            var vertexCount = mesh.vertexCount;
            var vertices    = mesh.vertices;
            var normals     = mesh.normals;
            var matrix      = item.matrix;

            for (int i = 0; i < vertexCount; i++)
            {
                var v = matrix.MultiplyPoint3x4(vertices[i]);
                var n = matrix.MultiplyVector(normals[i]);
                verticesOut.Add(v);
                normalsOut.Add(n);
            }
        }