private float addToShearDiagram(LineLoad load, float dirComponent, float position, float lineLength)
{
if (load is ConcentratedSpanLoad)
{
float P = ((ConcentratedSpanLoad)load).L;
float pDist = ((ConcentratedSpanLoad)load).D;
if (position < (pDist * lineLength))
return (P * dirComponent) / lineLength * position;
else
return -(P * dirComponent) / lineLength * (lineLength - position);
}
else if (load is DistributedSpanLoad)
{
DistributedSpanLoad dLoad = load as DistributedSpanLoad;
//return 0f;
float a, b, c, Ra, W, xt;
a = dLoad.Da * lineLength;
b = dLoad.Db * lineLength - a;
c = lineLength - a - b;
if (b == 0)
return 0f;
else if (position >= a && position <= (a + b))
{
W = (dLoad.La + dLoad.Lb) * b / 2f;
xt = Math.Abs(dLoad.La + dLoad.Lb) > float.Epsilon ? b * (dLoad.La + 2f * dLoad.Lb) / (3 * (dLoad.La + dLoad.Lb)) : 0.0f;
Ra = W / lineLength * (lineLength - (a + xt));
/////////////////////////////////////////
// Shear in a
float shear_a = Ra;
/////////////////////////////////////////
/////////////////////////////////////////
// Shear in a + b
float Wx_b, shear_b;
Wx_b = (dLoad.La + dLoad.La + dLoad.Lb - dLoad.La) * b / 2f;
shear_b = Ra - Wx_b;
/////////////////////////////////////////
/////////////////////////////////////////
// Line between a --- b
float originalLine = (position - a) / b * ((shear_b - shear_a)) + shear_a;
/////////////////////////////////////////
float Wx, y, xt2, y1;
y1 = (dLoad.Lb - dLoad.La) * (position - a) / b;
y = dLoad.La + y1;
xt2 = Math.Abs(dLoad.La + y) > float.Epsilon ? (position - a) / 3f * (dLoad.La + 2 * y) / (dLoad.La + y) : 0.0f;
Wx = (dLoad.La + y) * (position - a) / 2f;
return (Ra - Wx - originalLine) * dirComponent;
//return dirComponent * dLoad.La * (position - a) + dLoad.La * (dLoad.Db - dLoad.Da) * position;
}
}
return 0f;
}