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