/// <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); } }