/// <summary> /// ResolvedElement を Part へ分類します。 /// </summary> /// <param name="resolvedElement">分類する ResolvedElement。</param> void Classify(ResolvedElement resolvedElement) { // 対象とする Part のリストを取得します。 List <Part> partList; if (!partListMap.TryGetValue(resolvedElement.Element.MaterialIndex, out partList)) { partList = new List <Part>(); partList.Add(new Part(resolvedElement.Element.MaterialIndex)); partListMap[resolvedElement.Element.MaterialIndex] = partList; } // リストの最後の Part を取得します。 var part = partList[partList.Count - 1]; // IndexBuffer の最大サイズを超えるならば、 // 新たな Part へ Element を追加するようにします。 // Reach Profile では 16 ビットが最大サイズ (ushort) であり、 // また、立方体の表現に必要なインデックス数は 36 です。 if (ushort.MaxValue < (part.ResolvedElements.Count + 1) * 36) { part = new Part(resolvedElement.Element.MaterialIndex); partList.Add(part); } // リストの最後の Part へ Element を追加します。 part.ResolvedElements.Add(resolvedElement); }
/// <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); }
/// <summary> /// ResolvedElement を Part へ分類します。 /// </summary> /// <param name="resolvedElement">分類する ResolvedElement。</param> void Classify(ResolvedElement resolvedElement) { // 対象とする Part のリストを取得します。 List<Part> partList; if (!partListMap.TryGetValue(resolvedElement.Element.MaterialIndex, out partList)) { partList = new List<Part>(); partList.Add(new Part(resolvedElement.Element.MaterialIndex)); partListMap[resolvedElement.Element.MaterialIndex] = partList; } // リストの最後の Part を取得します。 var part = partList[partList.Count - 1]; // IndexBuffer の最大サイズを超えるならば、 // 新たな Part へ Element を追加するようにします。 // Reach Profile では 16 ビットが最大サイズ (ushort) であり、 // また、立方体の表現に必要なインデックス数は 36 です。 if (ushort.MaxValue < (part.ResolvedElements.Count + 1) * 36) { part = new Part(resolvedElement.Element.MaterialIndex); partList.Add(part); } // リストの最後の Part へ Element を追加します。 part.ResolvedElements.Add(resolvedElement); }
/// <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; }