diff --git a/Q01-Cálculos/Assembly.cs b/Q01-Cálculos/Assembly.cs new file mode 100644 index 0000000..1195d69 --- /dev/null +++ b/Q01-Cálculos/Assembly.cs @@ -0,0 +1,108 @@ +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; + } +}