public void CalculateSpringConstants()
{
var sortedSprings = _timeSortedSprings = new FastList<Spring>();
_xMin = 0f;
foreach (var time in Springs)
{
var spring = Springs[time];
sortedSprings.Add(spring);
if (spring.SpringWidth < _xMin)
{
_xMin = spring.SpringWidth;
}
}
sortedSprings.Sort((a, b) =>
{
if (a.TimePosition < b.TimePosition)
{
return -1;
}
if (a.TimePosition > b.TimePosition)
{
return 1;
}
return 0;
});
var totalSpringConstant = 0f;
for (int i = 0; i < sortedSprings.Count; i++)
{
var currentSpring = sortedSprings[i];
int duration;
if (i == sortedSprings.Count - 1)
{
duration = currentSpring.LongestDuration;
}
else
{
var nextSpring = sortedSprings[i + 1];
duration = nextSpring.TimePosition - currentSpring.TimePosition;
}
currentSpring.SpringConstant = CalculateSpringConstant(currentSpring, duration);
totalSpringConstant += 1 / currentSpring.SpringConstant;
}
TotalSpringConstant = 1 / totalSpringConstant;
// calculate the force required to have at least the minimum size.
for (int i = 0; i < sortedSprings.Count; i++)
{
var force = sortedSprings[i].SpringWidth * sortedSprings[i].SpringConstant;
UpdateMinStretchForce(force);
}
}