using Q01_Cálculos; using System.Collections; using System.Numerics; using System.Text; /// /// Clase que representa una colección de sólidos rígidos /// public class Assembly : IEnumerable, IRigidBody { public List components = new(); /// /// Obtiene el centro de masas del ensamblaje como la suma ponderada /// de los centros de masas de todos sus componentes. /// rcm = ( sum(rcm_i*m_i) / sum(m_i) ) /// public Vector3 CenterOfMass { get { Vector3 result = new Vector3(0, 0, 0); float TotalMass = 0; foreach (var item in components) { TotalMass += item.Mass; result += item.CenterOfMass * item.Mass; } result /= TotalMass; return result; } } /// /// Obtiene la masa total del ensamblaje como la suma de la masa de /// todos sus componentes /// public float Mass { get { float TotalMass = 0; foreach (var item in components) { TotalMass += item.Mass; } return TotalMass; } } /// /// Obtiene el peso del objeto como el producto de la masa del ensamblaje por /// la aceleración de la gravedad por defecto /// public Vector3 Weight => (Vector3)(Mass * Physics.CurrentGravity); /// /// Nombre para el componente /// public string Name { get; set; } = string.Empty; /// /// Obtiene como una cadena de texto legible un resumen de las características del ensamblaje y sus componentes /// /// /// public string Summary(int pad = 0) { StringBuilder r = new(); if (!string.IsNullOrEmpty(Name)) r.AppendLinePadded($"Object name: {Name}", pad); r.AppendLinePadded($"- Mass: {Mass}", pad); r.AppendLinePadded($"- Weight: {Weight}", pad); r.AppendLinePadded($"- Center Of Mass: {CenterOfMass}", pad); if (components.Count > 0) { r.AppendLinePadded($"- Item count: {GetChildItemCount(false)}.", pad); r.AppendLinePadded($"- Total child count {GetChildItemCount(true)}", pad); r.AppendLinePadded($"Child objects information ", pad); foreach (var component in this) r.AppendLine(component.Summary(pad + 1)); } else { r.AppendLinePadded("Empty assembly", pad); } return r.ToString(); } public IEnumerator GetEnumerator() => components.GetEnumerator(); IEnumerator IEnumerable.GetEnumerator() => components.GetEnumerator(); /// /// Devuelve el recuento de elementos que pertenecen al ensamblado. /// /// Si es true, sumará recursivamente los componentes de los subensamblajes. /// public int GetChildItemCount(bool Recursive) { int count = 0; foreach (var item in components) { count += item.GetChildItemCount(Recursive); } return count; } }