definida clase para trabajar con grupos de componentes
This commit is contained in:
108
Q01-Cálculos/Assembly.cs
Normal file
108
Q01-Cálculos/Assembly.cs
Normal file
@ -0,0 +1,108 @@
|
||||
using Q01_Cálculos;
|
||||
using System.Collections;
|
||||
using System.Numerics;
|
||||
using System.Text;
|
||||
|
||||
/// <summary>
|
||||
/// Clase que representa una colección de sólidos rígidos
|
||||
/// </summary>
|
||||
public class Assembly : IEnumerable<IRigidBody>, IRigidBody
|
||||
{
|
||||
|
||||
public List<IRigidBody> components = new();
|
||||
|
||||
/// <summary>
|
||||
/// 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) )
|
||||
/// </summary>
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Obtiene la masa total del ensamblaje como la suma de la masa de
|
||||
/// todos sus componentes
|
||||
/// </summary>
|
||||
public float Mass
|
||||
{
|
||||
get
|
||||
{
|
||||
float TotalMass = 0;
|
||||
foreach (var item in components)
|
||||
{
|
||||
TotalMass += item.Mass;
|
||||
}
|
||||
return TotalMass;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Obtiene el peso del objeto como el producto de la masa del ensamblaje por
|
||||
/// la aceleración de la gravedad por defecto
|
||||
/// </summary>
|
||||
public Vector3 Weight => (Vector3)(Mass * Physics.CurrentGravity);
|
||||
|
||||
/// <summary>
|
||||
/// Nombre para el componente
|
||||
/// </summary>
|
||||
public string Name { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// Obtiene como una cadena de texto legible un resumen de las características del ensamblaje y sus componentes
|
||||
/// </summary>
|
||||
/// <param name="pad"></param>
|
||||
/// <returns></returns>
|
||||
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<IRigidBody> GetEnumerator() => components.GetEnumerator();
|
||||
IEnumerator IEnumerable.GetEnumerator() => components.GetEnumerator();
|
||||
|
||||
/// <summary>
|
||||
/// Devuelve el recuento de elementos que pertenecen al ensamblado.
|
||||
/// </summary>
|
||||
/// <param name="Recursive">Si es true, sumará recursivamente los componentes de los subensamblajes.</param>
|
||||
/// <returns></returns>
|
||||
public int GetChildItemCount(bool Recursive)
|
||||
{
|
||||
int count = 0;
|
||||
foreach (var item in components)
|
||||
{
|
||||
count += item.GetChildItemCount(Recursive);
|
||||
}
|
||||
return count;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user