/// <summary> /// 指定の Element コレクション内について、指定の Element を解析します。 /// </summary> /// <param name="elements">Element コレクション。</param> /// <param name="target">解析対象の Element。</param> /// <returns>解析結果の ResolvedElement。</returns> public static ResolvedElement Resolve(InterElementCollection elements, Element target) { var resolvedElement = new ResolvedElement(target); var targetPosition = target.Position; var testPosition = targetPosition; testPosition.X = targetPosition.X + 1; resolvedElement.SurfaceVisible[(int)CubeSurfaces.East] = !elements.Contains(testPosition); testPosition.X = targetPosition.X - 1; resolvedElement.SurfaceVisible[(int)CubeSurfaces.West] = !elements.Contains(testPosition); testPosition.X = targetPosition.X; testPosition.Y = targetPosition.Y + 1; resolvedElement.SurfaceVisible[(int)CubeSurfaces.Top] = !elements.Contains(testPosition); testPosition.Y = targetPosition.Y - 1; resolvedElement.SurfaceVisible[(int)CubeSurfaces.Bottom] = !elements.Contains(testPosition); testPosition.Y = targetPosition.Y; testPosition.Z = targetPosition.Z - 1; resolvedElement.SurfaceVisible[(int)CubeSurfaces.North] = !elements.Contains(testPosition); testPosition.Z = targetPosition.Z + 1; resolvedElement.SurfaceVisible[(int)CubeSurfaces.South] = !elements.Contains(testPosition); return(resolvedElement); }
/// <summary> /// Element を分類します。 /// </summary> /// <param name="elements">Element のリスト。</param> /// <returns>分類結果を管理する ElementClassifier。</returns> public static ElementClassifier Classify(InterElementCollection elements) { var instance = new ElementClassifier(); foreach (var element in elements) { // 面の結合状態を解析します。 var resolvedElement = ResolvedElement.Resolve(elements, element); // 立方体が完全に囲まれているのではないならば分類を開始します。 if (!resolvedElement.Enclosed) { instance.Classify(resolvedElement); } } // Parts プロパティへ全ての Part を追加します。 foreach (var partList in instance.partListMap.Values) { foreach (var part in partList) { instance.Parts.Add(part); } } return(instance); }