(*by Nasser M. Abbasi. Vesion: Nov 10, 2013 *)
Manipulate[
Module[{z},
z = \[Theta]*Pi/180;
If[plotType == "stress section" ||
plotType == "Mohr circle/stress section" ||
plotType == "Mohr circle",
If[angleSelection == "specific plane",
z = getAngleAtSpecificPlane[
specificPlaneAngle, \[Sigma]x, \[Sigma]y, \[Tau]xy];
\[Theta] = z*180./Pi
]
];
Text@makeDiagrams[N@\[Sigma]x, N@\[Sigma]y, N@\[Tau]xy, z, annotate,
onPositiveSideOnly, plotType, limit, gridLines]
],
Grid[{
{
Grid[{
{Style[Row[{"stresses at 0", Degree}], 12], SpanFromLeft},
{"\!\(\*SubscriptBox[\(\[Sigma]\), \(x\)]\)",
Control[{{\[Sigma]x, 14, ""}, -20, 20, 0.1,
ImageSize -> Tiny}],
Style[Dynamic@padIt1[\[Sigma]x, {3, 1}], 11], Spacer[13]},
{"\!\(\*SubscriptBox[\(\[Sigma]\), \(y\)]\)",
Control[{{\[Sigma]y, 4, ""}, -20, 20, 0.1, ImageSize -> Tiny}],
Style[Dynamic@padIt1[\[Sigma]y, {3, 1}], 11]},
{"\!\(\*SubscriptBox[\(\[Tau]\), \(xy\)]\)",
Control[{{\[Tau]xy, 10, ""}, -20, 20, 0.1, ImageSize -> Tiny}],
Style[Dynamic@padIt1[\[Tau]xy, {3, 1}], 11]},
{Style[Dynamic@Row[{matrix, " = ", TraditionalForm[{
{padIt1[N[\[Sigma]x], {3, 1}],
padIt1[N[\[Tau]xy], {3, 1}]},
{padIt1[N[\[Tau]xy], {3, 1}],
padIt1[N[\[Sigma]y], {3, 1}]}
}]
}], 11], SpanFromLeft}
}, Spacings -> {.5, .5}, Alignment -> Center, Frame -> True,
FrameStyle -> Directive[Thickness[.005], Gray]]
},
{
Grid[{
{Style["select plot type", 12], SpanFromLeft},
{
PopupMenu[Dynamic[plotType],
{ "stress section" -> Style["stress section", 11],
"Mohr circle" -> Style[ "Mohr circle", 11],
"Mohr circle/stress section" ->
Style[ "Mohr circle/stress section", 11],
"normal stress trajectory" ->
Style[ "normal stress trajectory", 11],
"shear stress trajectory" ->
Style["shear stress trajectory", 11],
"normal/shear trajectory" ->
Style["normal/shear trajectory", 11]
}, ImageSize -> All, ContinuousAction -> False], SpanFromLeft
},
{Row[{Style["annotate", 12], Spacer[1],
Checkbox[Dynamic[annotate],
Enabled ->
Dynamic[
plotType == "stress section" ||
plotType == "Mohr circle/stress section"]]}],
Row[{Style[
Column[{"display stresses on", "positive sides only"},
Alignment -> Left], 11], Spacer[1],
Checkbox[Dynamic[onPositiveSideOnly],
Enabled ->
Dynamic[
plotType == "stress section" ||
plotType == "Mohr circle/stress section"]]}], SpanFromLeft
}
}, Spacings -> {.2, .5}, Alignment -> Center, Frame -> True,
FrameStyle -> Directive[Thickness[.005], Gray]], SpanFromLeft
},
{
Grid[{
{Grid[{
{Row[{Style["rotate to new angle" , 12]}], SpanFromLeft},
{RadioButtonBar[
Dynamic[angleSelection], {"slider" -> "",
"specific plane" -> ""}, Appearance -> "Vertical",
Enabled ->
Dynamic[
plotType == "stress section" ||
plotType == "Mohr circle/stress section" ||
plotType == "Mohr circle"]],
Grid[{
{Row[{Control[{{\[Theta], 45, ""}, -90, 90, 1,
ImageSize -> Tiny,
Enabled ->
Dynamic[(plotType == "stress section" ||
plotType == "Mohr circle/stress section" ||
plotType == "Mohr circle") &&
angleSelection == "slider"]}], Spacer[4],
Style[Row[{Dynamic@padIt2s[\[Theta], 3], Degree}],
11]}]},
{Row[{
PopupMenu[
Dynamic[
specificPlaneAngle , {specificPlaneAngle = #; \
\[Theta] =
getAngleAtSpecificPlane[
specificPlaneAngle, \[Sigma]x, \[Sigma]y, \
\[Tau]xy]} &],
{
"first principal plane" ->
Style["first principal plane", 11],
"second principal plane" ->
Style["second principal plane", 11],
"first maximum shear plane" ->
Style[ "first shear plane", 11],
"second maximum shear plane" ->
Style[ "second shear plane", 11]
}, ImageSize -> All,
Enabled ->
Dynamic[(plotType == "stress section" ||
plotType == "Mohr circle/stress section") &&
angleSelection == "specific plane"]
]
}]
}
}
]
}
}, Spacings -> {.5, .5}, Alignment -> Center, Frame -> None]
, Spacer[7]
}
,
{Style[Dynamic@Row[{matrix2, " = ",
TraditionalForm[{
{padIt1[
N[1/2 (\[Sigma]x + \[Sigma]y) +
1/2 (\[Sigma]x - \[Sigma]y) Cos[
2 (\[Theta] *Pi/180)] + \[Tau]xy Sin[
2 (\[Theta] *Pi/180)]], {3, 1}],
padIt1[N[-(1/2) (\[Sigma]x - \[Sigma]y) Sin[
2 (\[Theta] *Pi/180)] + \[Tau]xy Cos[
2 (\[Theta] *Pi/180)]], {3, 1}]
},
{padIt1[
N[-(1/2) (\[Sigma]x - \[Sigma]y) Sin[
2 (\[Theta] *Pi/180)] + \[Tau]xy Cos[
2 (\[Theta] *Pi/180)]], {3, 1}],
padIt1[N[
1/2 (\[Sigma]x + \[Sigma]y) -
1/2 (\[Sigma]x - \[Sigma]y) Cos[
2 (\[Theta] *Pi/180)] - \[Tau]xy Sin[
2 (\[Theta] *Pi/180)]], {3, 1}]
}
}
]}], 11]
}}, Spacings -> {.5, .5}, Alignment -> Center, Frame -> True,
FrameStyle -> Directive[Thickness[.005], Gray]]
},
{
Grid[{
{Grid[{
{Style["zoom", 12], Spacer[13],
Control[{{limit, 30, ""}, 5, 50, 0.1, ImageSize -> Small}],
Spacer[12]},
{"", Style[Row[{"in", Spacer[75], "out"}], 11], SpanFromLeft}
}, Spacings -> {.1, .1}, Alignment -> Center, Frame -> True,
FrameStyle -> Directive[Thickness[.005], Gray]]
},
{Grid[{
{Style["gridlines", 12],
Control[{{gridLines, 0.5, ""}, 0, 1, 0.1,
ImageSize -> Small}] Spacer[8]},
{"", Style[Row[{"less", Spacer[70], "more"}], 11]}
}, Spacings -> {.1, .1}, Alignment -> Center, Frame -> True,
FrameStyle -> Directive[Thickness[.005], Gray]]
}
}, Spacings -> {.1, .5}, Alignment -> Left, Frame -> None
], SpanFromLeft
}
}, Spacings -> {.2, .5}, Alignment -> Left],
{{annotate, True}, None},
{{plotType, "Mohr circle"}, None},
{{matrix,
TraditionalForm[{{Subscript[\[Sigma], x], Subscript[\[Tau],
x\[InvisibleComma]y]}, {Subscript[\[Tau], x\[InvisibleComma]y],
Subscript[\[Sigma], y]}}]}, None},
{{matrix2,
TraditionalForm[{{Subscript[(\[Sigma]'), x], Subscript[\[Tau]',
x\[InvisibleComma]y]}, {Subscript[\[Tau]', x\[InvisibleComma]y],
Subscript[(\[Sigma]'), y]}}]}, None},
{{onPositiveSideOnly, True}, None},
{{principalPlaneAngle, False}, None},
{{maxShearPlane, False}, None},
{{specificPlaneAngle, "first principal plane"}, None},
{{angleSelection, "slider"}, None},
ControlPlacement -> Left,
SynchronousUpdating -> False,
SynchronousInitialization -> False,
ContinuousAction -> True,
Alignment -> Center,
ImageMargins -> 0,
FrameMargins -> 0,
Paneled -> True,
Frame -> False,
AutorunSequencing -> {1},
Initialization :>
{
(*--- constant parameters size and width of display ---*)
contentSizeW = 425;
contentSizeH = 425;
(*--------------------------------------------*)
(* helper function for formatting *)
(*--------------------------------------------*)
padIt2[v_?numeric, f_List] :=
AccountingForm[Chop[v] , f, NumberSigns -> {"", ""},
NumberPadding -> {"0", "0"}, SignPadding -> True];
padIt2[v_?numeric, f_Integer] :=
AccountingForm[Chop[v] , f, NumberSigns -> {"", ""},
NumberPadding -> {"0", "0"}, SignPadding -> True];
padIt2s[v_?numeric, f_Integer] :=
AccountingForm[Chop[v] , f, NumberSigns -> {"-", "+"},
NumberPadding -> {"0", "0"}, SignPadding -> True];
padIt1[v_?numeric, f_List] :=
AccountingForm[Chop[v] , f, NumberSigns -> {"-", "+"},
NumberPadding -> {"0", "0"}, SignPadding -> True];
(*definitions used for parameter checking*)
integerStrictPositive = (IntegerQ[#] && # > 0 &);
integerPositive = (IntegerQ[#] && # >= 0 &);
numericStrictPositive = (Element[#, Reals] && # > 0 &);
numericPositive = (Element[#, Reals] && # >= 0 &);
numericStrictNegative = (Element[#, Reals] && # < 0 &);
numericNegative = (Element[#, Reals] && # <= 0 &);
bool = (Element[#, Booleans] &);
numeric = (Element[#, Reals] &);
integer = (Element[#, Integers] &);
(*-------------------------------------------------------------*)
makeDiagrams[\[Sigma]x_?numeric, \[Sigma]y_?numeric, \[Tau]xy_?
numeric, \[Theta]_?numeric, annotate_?bool,
onPositiveSideOnly_?bool, plotType_String,
limit_?numericStrictPositive, gridLines_?numericPositive] :=
Module[{},
Which[
plotType == "stress section",
make2DStressDiagram[\[Sigma]x, \[Sigma]y, \[Tau]xy, \[Theta],
annotate, onPositiveSideOnly, limit,
gridLines, {contentSizeW, contentSizeH}],
plotType == "Mohr circle",
makeMohrCircle[\[Theta], \[Sigma]x, \[Sigma]y, \[Tau]xy, limit,
gridLines, {contentSizeW, contentSizeH},
makeMohrCircleTitle[\[Sigma]x, \[Sigma]y, \[Tau]xy]],
plotType == "Mohr circle/stress section",
Grid[{
{makeMohrCircleTitle[\[Sigma]x, \[Sigma]y, \[Tau]xy],
SpanFromLeft},
{make2DStressDiagram[\[Sigma]x, \[Sigma]y, \[Tau]xy, \[Theta],
annotate, onPositiveSideOnly, limit,
gridLines, {0.5 contentSizeW, 0.87 contentSizeH}],
makeMohrCircle[\[Theta], \[Sigma]x, \[Sigma]y, \[Tau]xy,
limit, gridLines, {0.499 contentSizeW, .87 contentSizeH}, {}]
}
}, Spacings -> {0, 0}
],
plotType == "normal stress trajectory",
makeNormalStressPolarPlot[\[Sigma]x, \[Sigma]y, \[Tau]xy, limit,
gridLines],
plotType == "shear stress trajectory",
makeShearStressPolarPlot[\[Sigma]x, \[Sigma]y, \[Tau]xy, limit,
gridLines],
plotType == "normal/shear trajectory",
makeShearAndNormalStressPolarPlot[\[Sigma]x, \[Sigma]y, \
\[Tau]xy, limit, gridLines]
]
];
(*-------------------------------------------------------------*)
getAngleAtSpecificPlane[
specificPlaneAngle_, \[Sigma]x_, \[Sigma]y_, \[Tau]xy_] :=
N@Which[specificPlaneAngle == "first principal plane",
principalStresses[\[Sigma]x, \[Sigma]y, \[Tau]xy][[1, 2]],
specificPlaneAngle == "second principal plane",
principalStresses[\[Sigma]x, \[Sigma]y, \[Tau]xy][[2, 2]],
specificPlaneAngle == "first maximum shear plane",
principalStresses[\[Sigma]x, \[Sigma]y, \[Tau]xy][[1, 2]] + Pi/4,
specificPlaneAngle == "second maximum shear plane",
principalStresses[\[Sigma]x, \[Sigma]y, \[Tau]xy][[1, 2]] +
3/4 Pi
];
(*-------------------------------------------------------------*)
(*finds the 2 Principal stresses in plane stress 2D setting*)
principalStresses[\[Sigma]x_?numeric, \[Sigma]y_?
numeric, \[Tau]xy_?numeric] :=
Module[{\[Theta]p, \[Sigma], \[Sigma]1, \[Sigma]2, \[Sigma]1max,
r, c, tmp, \[Theta]1, \[Theta]2},
r = Sqrt[((\[Sigma]x - \[Sigma]y)/2)^2 + \[Tau]xy^2];
c = (\[Sigma]x + \[Sigma]y)/2;
{\[Sigma]1, \[Sigma]2} = {c + r, c - r};
(*\[Sigma]1 is the largest stress regadless of sign*)
If[Abs[\[Sigma]2] > Abs[\[Sigma]1],
tmp = \[Sigma]1;
\[Sigma]1 = \[Sigma]2;
\[Sigma]2 = tmp
];
If[Abs[\[Sigma]x - \[Sigma]y] <= $MachineEpsilon, \[Theta]p =
Pi/4, \[Theta]p =
ArcTan[(2 Abs[\[Tau]xy])/Abs[\[Sigma]x - \[Sigma]y]]/2];
If[\[Sigma]1 > \[Sigma]2,
If[\[Tau]xy > 0,(*below*)
If[\[Sigma]x >
c, {\[Theta]1, \[Theta]2} = {\[Theta]p, -(Pi/
2 - \[Theta]p)}, {\[Theta]1, \[Theta]2} = {Pi/
2 - \[Theta]p, -\[Theta]p}]
,
If[\[Sigma]x >
c, {\[Theta]1, \[Theta]2} = {-\[Theta]p, (Pi/
2 - \[Theta]p)}, {\[Theta]1, \[Theta]2} = {-(Pi/
2 - \[Theta]p), \[Theta]p}]
]
,
If[\[Tau]xy > 0,
If[\[Sigma]x >
c, {\[Theta]1, \[Theta]2} = {-(Pi/
2 - \[Theta]p), \[Theta]p}, {\[Theta]1, \[Theta]2} = {-\
\[Theta]p, Pi/2 - \[Theta]p}]
,
If[\[Sigma]x >
c, {\[Theta]1, \[Theta]2} = {(Pi/
2 - \[Theta]p), -\[Theta]p}, {\[Theta]1, \[Theta]2} = {\
\[Theta]p, -(Pi/2 - \[Theta]p)}]
]
];
{{\[Sigma]1, \[Theta]1}, {\[Sigma]2, \[Theta]2}}
];
(*-------------------------------------------------------------*)
(*finds the maximum and minumum shear stresses in plane stress 2D \
setting*)
maxAndMinShearStress[\[Sigma]x_?numeric, \[Sigma]y_?
numeric, \[Tau]xy_?numeric] := Module[{r},
r = Sqrt[((\[Sigma]x - \[Sigma]y)/2)^2 + \[Tau]xy^2];
{r, -r}
];
(*-------------------------------------------------------------*)
(*find normal and shear stress for plane at angle theta from \
normal. plain stress*)
(*use standard stress angle transformation for 2D*)
rotationStress[\[Sigma]x_, \[Sigma]y_, \[Tau]xy_, \[Theta]_] :=
Module[{\[Sigma]xx, \[Sigma]yy, \[Tau]},
\[Sigma]xx =
1/2 (\[Sigma]x + \[Sigma]y) +
1/2 (\[Sigma]x - \[Sigma]y) Cos[2 \[Theta]] + \[Tau]xy Sin[
2 \[Theta]];
\[Tau] = -(1/2) (\[Sigma]x - \[Sigma]y) Sin[
2 \[Theta]] + \[Tau]xy Cos[2 \[Theta]];
\[Sigma]yy =
1/2 (\[Sigma]x + \[Sigma]y) -
1/2 (\[Sigma]x - \[Sigma]y) Cos[2 \[Theta]] - \[Tau]xy Sin[
2 \[Theta]];
{\[Sigma]xx, \[Sigma]yy, \[Tau]}
];
(*-------------------------------------------------------------*)
plot[data_List, limit_?numericStrictPositive,
gridLines_?numericPositive, color_] :=
ListPolarPlot[data,
Joined -> True,
AxesOrigin -> {0, 0},
ImageSize -> {contentSizeW, contentSizeH},
ImagePadding -> {{20, 10}, {20, 5}},
ImageMargins -> 0,
AspectRatio -> 1,
Frame -> True,
If[gridLines == 0,
GridLines ->
None, {GridLines -> {Range[-limit,
limit, (2*limit)/(gridLines*20)],
Range[-limit, limit, (2*limit)/(gridLines*20)]},
GridLinesStyle -> Directive[Thickness[.001], LightGray]
}],
PlotRange -> {{-limit, limit}, {-limit, limit}},
PlotStyle -> color
];
(*-------------------------------------------------------------*)
makeArrowForAngle[r_,
center_, {{\[Sigma]1_, \[Theta]1_}, {\[Sigma]2_, \[Theta]2_}}, \
\[Tau]xy_?numeric] := Module[{phi, tbl, align},
If[\[Sigma]1 > \[Sigma]2,
If[\[Tau]xy > 0,
tbl =
Table[{center[[1]] + r/3*Cos[phi],
r/3*Sin[phi]}, {phi, -2*\[Theta]1, 0, Pi/100}];
align = {-1, 1}
,
tbl =
Table[{center[[1]] + r/3*Cos[phi],
r/3*Sin[phi]}, {phi, -2*\[Theta]1, 0, -Pi/100}];
align = {-1, -1}
]
,
If[\[Tau]xy > 0,
tbl =
Table[{center[[1]] + r/3*Cos[phi],
r/3*Sin[phi]}, {phi, -(Pi + 2*\[Theta]1), -Pi, -Pi/100}];
align = {1, 1}
,
tbl =
Table[{center[[1]] + r/3*Cos[phi],
r/3*Sin[phi]}, {phi, (Pi - 2*\[Theta]1), Pi, Pi/100}];
align = {1, -1}
]
];
{Text["2\!\(\*SubscriptBox[\(\[Theta]\), \(1\)]\)",
If[Length[tbl] > 1, tbl[[ Round[ Length[tbl]/2 ] ]],
First@tbl] , align ], tbl}
];
(*-------------------------------------------------------------*)
makeMohrCircleTitle[\[Sigma]x_?numeric, \[Sigma]y_?
numeric, \[Tau]xy_?numeric] :=
Module[{\[Sigma]1, \[Sigma]2, \[Theta]1, \[Theta]2, r, center,
ptA},
{{\[Sigma]1, \[Theta]1}, {\[Sigma]2, \[Theta]2}} =
principalStresses[\[Sigma]x, \[Sigma]y, \[Tau]xy];
center = {(\[Sigma]1 + \[Sigma]2)/2, 0};
ptA = {\[Sigma]x, -\[Tau]xy};
r = EuclideanDistance[center, ptA];
Grid[{
TraditionalForm[
Style[#]] & /@ {"\!\(\*SubscriptBox[\(\[Sigma]\), \(x\)]\)",
"\!\(\*SubscriptBox[\(\[Sigma]\), \(y\)]\)",
"\!\(\*SubscriptBox[\(\[Tau]\), \(x\[InvisibleComma]y\)]\)",
"\!\(\*SubscriptBox[\(\[Sigma]\), \(1\)]\)",
"\!\(\*SubscriptBox[\(\[Sigma]\), \(2\)]\)",
"\!\(\*SubscriptBox[\(\[Tau]\), \(max\)]\)",
"\!\(\*SubscriptBox[\(\[Theta]\), \(1\)]\)",
"\!\(\*SubscriptBox[\(\[Theta]\), \(2\)]\)"},
{padIt1[\[Sigma]x, {4, 1}],
padIt1[\[Sigma]y, {4, 1}],
padIt1[\[Tau]xy, {4, 1}],
padIt1[\[Sigma]1, {4, 1}],
padIt1[\[Sigma]2, {4, 1}],
\[PlusMinus]padIt2[r, {4, 1}],
Row[{padIt1[\[Theta]1*180/Pi, {4, 1}], Degree}],
Row[{padIt1[\[Theta]2*180/Pi, {4, 1}], Degree}]
}
}, Spacings -> {.5, 1}, Frame -> All,
FrameStyle -> Directive[Thin]]
];
(*-------------------------------------------------------------*)
getRadiusOfCircle[\[Theta]_?numeric, \[Sigma]x_?
numeric, \[Sigma]y_?numeric, \[Tau]xy_?numeric] :=
Sqrt[((\[Sigma]x - \[Sigma]y)/2)^2 + \[Tau]xy^2];
(*-------------------------------------------------------------*)
getCurrentStressOnInclinded[\[Theta]_?numeric, \[Sigma]x_?
numeric, \[Sigma]y_?numeric, \[Tau]xy_?numeric] :=
Module[{\[Sigma]x1, \[Tau]xy1, \[Sigma]y1},
\[Sigma]x1 = (\[Sigma]x + \[Sigma]y)/
2 + ((\[Sigma]x - \[Sigma]y)/
2 Cos[2 \[Theta]] + \[Tau]xy Sin[2 \[Theta]]);
\[Tau]xy1 = (-((\[Sigma]x - \[Sigma]y)/2) Sin[
2 \[Theta]] + \[Tau]xy Cos[2 \[Theta]]);
\[Sigma]y1 = (\[Sigma]x + \[Sigma]y)/
2 - ((\[Sigma]x - \[Sigma]y)/
2 Cos[2 \[Theta]] + \[Tau]xy Sin[2 \[Theta]]);
{\[Sigma]x1, \[Sigma]y1, \[Tau]xy1}
];
(*-------------------------------------------------------------*)
makeMohrCircle[\[Theta]_?numeric, \[Sigma]x_?numeric, \[Sigma]y_?
numeric, \[Tau]xy_?numeric, limit_?numericStrictPositive,
gridLines_?numericPositive, {contentSizeW_?numericStrictPositive,
contentSizeH_?numericStrictPositive}, plotTitle_] :=
Module[{ptA, ptB,
center, \[Sigma]1, \[Sigma]2, \[Theta]1, \[Theta]2, r, z, lst,
txt, ptD1, ptD2, \[Sigma]x1, \[Tau]xy1, \[Sigma]y1},
{{\[Sigma]1, \[Theta]1}, {\[Sigma]2, \[Theta]2}} =
principalStresses[\[Sigma]x, \[Sigma]y, \[Tau]xy];
center = {(\[Sigma]1 + \[Sigma]2)/2, 0};
ptA = {\[Sigma]x, -\[Tau]xy};
r = getRadiusOfCircle[\[Theta], \[Sigma]x, \[Sigma]y, \[Tau]xy];
{\[Sigma]x1, \[Sigma]y1, \[Tau]xy1} =
getCurrentStressOnInclinded[\[Theta], \[Sigma]x, \[Sigma]y, \
\[Tau]xy];
(*Print["in makeMohrCircle, \[Theta]=",\[Theta],
" \[Sigma]x=",\[Sigma]x," \[Sigma]y=",\[Sigma]y," r=",r,
" cosBeta=",cosBeta, " sinBeta=",sinBeta," currentStress=",
currentStress," currentShear=",currentShear];*)
z = \[Sigma]x - First@center;
ptB = {ptA[[1]] - 2 z, -ptA[[2]]};
ptD1 = {\[Sigma]x1, -\[Tau]xy1};
ptD2 = {\[Sigma]y1, \[Tau]xy1};
Graphics[{
Circle[center, r],
(*{Text[TraditionalForm[Style["(Subscript[\[Sigma],
x],-Subscript[\[Tau], x\[InvisibleComma]y])",12]],ptA,
If[\[Sigma]x>center[[1]],{-1,1},{1,1}]]},*)
{Black, PointSize[.02], Point[ptA]},
{Black, PointSize[.02], Point[center]},
(*{Text[TraditionalForm[Style["(Subscript[\[Sigma],
y],Subscript[\[Tau], x\[InvisibleComma]y])",12]],ptB,
If[\[Sigma]y>center[[1]],{-1,-1},{1,-1}]]},*)
{Black, PointSize[.02], Point[ptB]},
{Dashed, Line[{ptA, ptB}]},
Circle[ptD1, .8],
{Red, Dashed, Line[{ptD1, ptD2}]},
Circle[ptD2, .8],
Text[
Row[{"(", padIt1[\[Sigma]x1, {4, 1}], ",",
padIt1[\[Tau]xy1, {4, 1}], ")"}], ptD1,
If[\[Sigma]x1 > center[[1]], {-1, -1}, {1, -1}]],
Text[
Row[{"(", padIt1[\[Sigma]y1, {4, 1}], ",",
padIt1[\[Tau]xy1, {4, 1}], ")"}], ptD2,
If[\[Sigma]y1 > center[[1]], {-1, -1}, {1, -1}]],
{Red, PointSize[.02], Point[{\[Sigma]1, 0}]},
{Text[
TraditionalForm[
Style["\!\(\*SubscriptBox[\(\[Sigma]\), \(1\)]\)",
12]], {\[Sigma]1, 0}, {-1.5, 1.5}]},
{Red, PointSize[.02], Point[{\[Sigma]2, 0}]},
{Text[
TraditionalForm[
Style["\!\(\*SubscriptBox[\(\[Sigma]\), \(2\)]\)",
12]], {\[Sigma]2, 0}, {1.2, 1.3}]},
{Blue, PointSize[.02], Point[{center[[1]], r}]},
{Text[
TraditionalForm[
Style["\!\(\*SubscriptBox[\(\[Tau]\), \(max\)]\)",
12]], {center[[1]], r}, {0, -1.5}]},
{Blue, PointSize[.02], Point[{center[[1]], -r}]},
{Text[
TraditionalForm[
Style["\!\(\*SubscriptBox[\(\[Tau]\), \(max\)]\)",
12]], {center[[1]], -r}, {0, 1.5}]},
{Text[Style["tension", 11], {limit, 0}, {1, 3}]},
{Text[Style["compression", 11], {-limit, 0}, {-1, 3}]}
},
If[gridLines == 0,
GridLines ->
None, {GridLines -> {Range[-limit,
limit, (2*limit)/(gridLines*20)],
Range[-limit, limit, (2*limit)/(gridLines*20)]},
GridLinesStyle -> Directive[Thickness[.001], LightGray]
}],
PlotRange -> {{-limit, limit}, {-limit, limit}},
Axes -> True,
AxesOrigin -> {0, 0},
TicksStyle -> 8,
PlotLabel -> If[plotTitle === {}, "", plotTitle],
ImageSize -> {contentSizeW, contentSizeH},
ImagePadding -> {{20, 10}, {20, 5}}
]
];
(*-------------------------------------------------------------*)
makeShearAndNormalStressPolarPlot[\[Sigma]x_?numeric, \[Sigma]y_?
numeric, \[Tau]xy_?numeric, limit_?numericStrictPositive,
gridLines_?numericPositive] :=
Module[{pts, \[Theta], \[Sigma]1, \[Sigma]2, \[Sigma]1Abs, \
\[Sigma]2Abs, \[Theta]p1, \[Theta]p2, p1, p2, p3, p4, plotTitle,
coord1, coord2, \[Tau]1, \[Tau]2},
pts =
Table[{rotationStress[\[Sigma]x, \[Sigma]y, \[Tau]xy, \
\[Theta]], \[Theta]}, {\[Theta], 0, 2 Pi, Pi/40}];
{{\[Sigma]1, \[Theta]p1}, {\[Sigma]2, \[Theta]p2}} =
principalStresses[\[Sigma]x, \[Sigma]y, \[Tau]xy];
p1 =
plot[Transpose[{pts[[All, 2]], pts[[All, 1, 1]]}], limit,
gridLines, Red];
coord1 = {Abs[\[Sigma]1] Cos[\[Theta]p1],
Abs[\[Sigma]1] Sin[\[Theta]p1]};
coord2 = {Abs[\[Sigma]2] Cos[\[Theta]p2],
Abs[\[Sigma]2] Sin[\[Theta]p2]};
p2 = Graphics[{
{PointSize[0.015], Point[{\[Sigma]x, 0}]},
Text[
TraditionalForm[
Style["\!\(\*SubscriptBox[\(\[Sigma]\), \(x\)]\)",
12]], {\[Sigma]x, 0}, {0, 1.2}],
{PointSize[0.015], Point[{0, \[Sigma]y}]},
Text[
TraditionalForm[
Style["\!\(\*SubscriptBox[\(\[Sigma]\), \(y\)]\)",
12]], {0, \[Sigma]y}, {1.2, 0}],
{PointSize[0.015], Point[coord1]},
Text[
TraditionalForm[
Style["\!\(\*SubscriptBox[\(\[Sigma]\), \(1\)]\)", 12]],
coord1, {-1.4, 0}],
{PointSize[0.015], Point[coord2]},
Text[
TraditionalForm[
Style["\!\(\*SubscriptBox[\(\[Sigma]\), \(2\)]\)", 12]],
coord2, {-1.4, 0}],
{Dashed, Thin, Line[{coord1, {-coord1[[1]], -coord1[[2]]}}]},
{Dashed, Thin, Line[{coord2, {-coord2[[1]], -coord2[[2]]}}]}
}
];
{\[Tau]1, \[Tau]2} =
maxAndMinShearStress[\[Sigma]x, \[Sigma]y, \[Tau]xy];
p3 =
plot[Transpose[{pts[[All, 2]], pts[[All, 1, 3]]}], limit,
gridLines, Blue];
coord1 = {Abs[\[Tau]1] Cos[\[Theta]p1 + Pi/4],
Abs[\[Tau]1] Sin[\[Theta]p1 + Pi/4]};
coord2 = {Abs[\[Tau]1] Cos[\[Theta]p2 + Pi/4],
Abs[\[Tau]1] Sin[\[Theta]p2 + Pi/4]};
p4 = Graphics[{
{PointSize[0.015], Point[{\[Tau]xy, 0}]},
Text[
TraditionalForm[
Style["\!\(\*SubscriptBox[\(\[Tau]\), \(x\[InvisibleComma]y\
\)]\)", 12]], {\[Tau]xy, 0}, {0, 1.2}],
{PointSize[0.015], Point[{0, \[Tau]xy}]},
Text[
TraditionalForm[
Style["\!\(\*SubscriptBox[\(\[Tau]\), \(y\[InvisibleComma]x\
\)]\)", 12]], {0, \[Tau]xy}, {1.2, 0}],
{PointSize[0.015], Point[coord1]},
Text[
TraditionalForm[
Style["\!\(\*SubscriptBox[\(\[Tau]\), \(max\)]\)", 12]],
coord1, {-1.4, 0}],
{Dashed, Thin, Line[{coord1, {-coord1[[1]], -coord1[[2]]}}]},
{Dashed, Thin, Line[{coord2, {-coord2[[1]], -coord2[[2]]}}]}
}
];
plotTitle = Style[Grid[{
{"normal (red) and shear (blue) polar (stress vs. angle) \
trajectory", SpanFromLeft},
TraditionalForm[
Style[#]] & /@ {"\!\(\*SubscriptBox[\(\[Sigma]\), \
\(x\)]\)", "\!\(\*SubscriptBox[\(\[Sigma]\), \(y\)]\)",
"\!\(\*SubscriptBox[\(\[Tau]\), \
\(x\[InvisibleComma]y\)]\)",
"\!\(\*SubscriptBox[\(\[Sigma]\), \(1\)]\)",
"\!\(\*SubscriptBox[\(\[Theta]\), \(1\)]\)",
"\!\(\*SubscriptBox[\(\[Sigma]\), \(2\)]\)",
"\!\(\*SubscriptBox[\(\[Theta]\), \(2\)]\)",
"\!\(\*SubscriptBox[\(\[Tau]\), \(max\)]\)"},
{padIt1[\[Sigma]x, {4, 1}],
padIt1[\[Sigma]y, {4, 1}],
padIt1[\[Tau]xy, {4, 1}],
padIt1[\[Sigma]1, {4, 1}],
Row[{padIt1[\[Theta]p1*180/Pi, {4, 1}], Degree}],
padIt1[\[Sigma]2, {4, 1}],
Row[{padIt1[\[Theta]p2*180/Pi, {4, 1}], Degree}],
\[PlusMinus]padIt2[\[Tau]1, {4, 1}]
}
}, Spacings -> {0.4, 1.1}, Frame -> All,
FrameStyle -> Directive[Thin]], 12];
Show[p1, p2, p3, p4, PlotLabel -> plotTitle]
];
(*-------------------------------------------------------------*)
makeNormalStressPolarPlot[\[Sigma]x_?numeric, \[Sigma]y_?
numeric, \[Tau]xy_?numeric, limit_?numericStrictPositive,
gridLines_?numericPositive] :=
Module[{pts, \[Theta], \[Sigma]1, \[Sigma]2, \[Sigma]1Abs, \
\[Sigma]2Abs, \[Theta]p1, \[Theta]p2, p1, p2, plotTitle, coord1,
coord2},
pts =
Table[{rotationStress[\[Sigma]x, \[Sigma]y, \[Tau]xy, \
\[Theta]], \[Theta]}, {\[Theta], 0, 2 Pi, Pi/40}];
{{\[Sigma]1, \[Theta]p1}, {\[Sigma]2, \[Theta]p2}} =
principalStresses[\[Sigma]x, \[Sigma]y, \[Tau]xy];
p1 =
plot[Transpose[{pts[[All, 2]], pts[[All, 1, 1]]}], limit,
gridLines, Red];
coord1 = {Abs[\[Sigma]1] Cos[\[Theta]p1],
Abs[\[Sigma]1] Sin[\[Theta]p1]};
coord2 = {Abs[\[Sigma]2] Cos[\[Theta]p2],
Abs[\[Sigma]2] Sin[\[Theta]p2]};
p2 = Graphics[{
{PointSize[0.015], Point[{\[Sigma]x, 0}]},
Text[
TraditionalForm[
Style["\!\(\*SubscriptBox[\(\[Sigma]\), \(x\)]\)",
12]], {\[Sigma]x, 0}, {0, 1.2}],
{PointSize[0.015], Point[{0, \[Sigma]y}]},
Text[
TraditionalForm[
Style["\!\(\*SubscriptBox[\(\[Sigma]\), \(y\)]\)",
12]], {0, \[Sigma]y}, {1.2, 0}],
{PointSize[0.015], Point[coord1]},
Text[
TraditionalForm[
Style["\!\(\*SubscriptBox[\(\[Sigma]\), \(1\)]\)", 12]],
coord1, {-1.4, 0}],
{PointSize[0.015], Point[coord2]},
Text[
TraditionalForm[
Style["\!\(\*SubscriptBox[\(\[Sigma]\), \(2\)]\)", 12]],
coord2, {-1.4, 0}],
{Dashed, Thin, Line[{coord1, {-coord1[[1]], -coord1[[2]]}}]},
{Dashed, Thin, Line[{coord2, {-coord2[[1]], -coord2[[2]]}}]}
}
];
plotTitle = Grid[{
{"normal stress polar (stress vs. angle) trajectory",
SpanFromLeft},
TraditionalForm[
Style[#]] & /@ {"\!\(\*SubscriptBox[\(\[Sigma]\), \
\(x\)]\)", "\!\(\*SubscriptBox[\(\[Sigma]\), \(y\)]\)",
"\!\(\*SubscriptBox[\(\[Tau]\), \(x\[InvisibleComma]y\)]\)",
"\!\(\*SubscriptBox[\(\[Sigma]\), \(1\)]\)",
"\!\(\*SubscriptBox[\(\[Theta]\), \(1\)]\)",
"\!\(\*SubscriptBox[\(\[Sigma]\), \(2\)]\)",
"\!\(\*SubscriptBox[\(\[Theta]\), \(2\)]\)"},
{padIt1[\[Sigma]x, {4, 1}],
padIt1[\[Sigma]y, {4, 1}],
padIt1[\[Tau]xy, {4, 1}],
padIt1[\[Sigma]1, {4, 1}],
Row[{padIt1[\[Theta]p1*180/Pi, {4, 1}], Degree}],
padIt1[\[Sigma]2, {4, 1}],
Row[{padIt1[\[Theta]p2*180/Pi, {4, 1}], Degree}]
}
}, Spacings -> {0.8, 1}, Frame -> All,
FrameStyle -> Directive[Thin]];
Show[p1, p2, PlotLabel -> plotTitle]
];
(*-------------------------------------------------------------*)
makeShearStressPolarPlot[\[Sigma]x_?numeric, \[Sigma]y_?
numeric, \[Tau]xy_?numeric, limit_?numericStrictPositive,
gridLines_?numericPositive] :=
Module[{pts, \[Theta], \[Sigma]1, \[Tau]1, \[Tau]2, \[Sigma]2, \
\[Sigma]1Abs, \[Sigma]2Abs, \[Theta]p1, \[Theta]p2, p1, p2, plotTitle,
coord1, coord2},
pts =
Table[{rotationStress[\[Sigma]x, \[Sigma]y, \[Tau]xy, \
\[Theta]], \[Theta]}, {\[Theta], 0, 2 Pi, Pi/40}];
{{\[Sigma]1, \[Theta]p1}, {\[Sigma]2, \[Theta]p2}} =
principalStresses[\[Sigma]x, \[Sigma]y, \[Tau]xy];
{\[Tau]1, \[Tau]2} =
maxAndMinShearStress[\[Sigma]x, \[Sigma]y, \[Tau]xy];
p1 =
plot[Transpose[{pts[[All, 2]], pts[[All, 1, 3]]}], limit,
gridLines, Blue];
coord1 = {Abs[\[Tau]1] Cos[\[Theta]p1 + Pi/4],
Abs[\[Tau]1] Sin[\[Theta]p1 + Pi/4]};
coord2 = {Abs[\[Tau]1] Cos[\[Theta]p2 + Pi/4],
Abs[\[Tau]1] Sin[\[Theta]p2 + Pi/4]};
p2 = Graphics[{
{PointSize[0.015], Point[{\[Tau]xy, 0}]},
Text[
TraditionalForm[
Style["\!\(\*SubscriptBox[\(\[Tau]\), \(x\[InvisibleComma]y\
\)]\)", 12]], {\[Tau]xy, 0}, {0, 1.2}],
{PointSize[0.015], Point[{0, \[Tau]xy}]},
Text[
TraditionalForm[
Style["\!\(\*SubscriptBox[\(\[Tau]\), \(y\[InvisibleComma]x\
\)]\)", 12]], {0, \[Tau]xy}, {1.2, 0}],
{PointSize[0.015], Point[coord1]},
Text[
TraditionalForm[
Style["\!\(\*SubscriptBox[\(\[Tau]\), \(max\)]\)", 12]],
coord1, {-1.4, 0}],
{Dashed, Thin, Line[{coord1, {-coord1[[1]], -coord1[[2]]}}]},
{Dashed, Thin, Line[{coord2, {-coord2[[1]], -coord2[[2]]}}]}
}
];
plotTitle = Grid[{
{"shear stress polar (stress vs. angle) trajectory",
SpanFromLeft},
Flatten@{TraditionalForm[
Style[#]] & /@ {"\!\(\*SubscriptBox[\(\[Sigma]\), \(x\)]\
\)", "\!\(\*SubscriptBox[\(\[Sigma]\), \(y\)]\)",
"\!\(\*SubscriptBox[\(\[Tau]\), \
\(x\[InvisibleComma]y\)]\)",
"\!\(\*SubscriptBox[\(\[Tau]\), \(max\)]\)",
"\!\(\*SubscriptBox[\(\[Theta]\), \(max\)]\)"},
SpanFromLeft},
{padIt1[\[Sigma]x, {4, 1}],
padIt1[\[Sigma]y, {4, 1}],
\[PlusMinus]padIt2[\[Tau]xy, {4, 1}],
padIt1[\[Tau]1, {4, 1}],
Row[{padIt1[(\[Theta]p1 + Pi/4)*180/Pi, {4, 1}], Degree, ",",
padIt1[(\[Theta]p1 + 3/4 Pi)*180/Pi, {4, 1}], Degree}],
SpanFromLeft}
}, Spacings -> {1, 1}, Frame -> All,
FrameStyle -> Directive[Thin]];
Show[p1, p2, PlotLabel -> plotTitle]
];
(*-------------------------------------------------------------*)
make2DStressDiagram[\[Sigma]x_?numeric, \[Sigma]y_?
numeric, \[Tau]xy_?numeric, \[Theta]_?numeric, annotate_?bool,
onPositiveSideOnly_?bool, limit_?numericStrictPositive,
gridLines_?numericPositive, {contentSizeW_?numericStrictPositive,
contentSizeH_?numericStrictPositive}] :=
Module[{\[Sigma]1, \[Sigma]2, \[Sigma]xx, \[Sigma]yy, \[Tau]xyxy,
r, \[Sigma]xxRightArrow, \[Sigma]xxLeftArrow, \
\[Sigma]yyTopArrow, \[Sigma]yyBottomArrow, \[Tau]RightArrow, \
\[Tau]LeftArrow, \[Tau]TopArrow, \[Tau]BottomArrow, \[Tau]1, \[Tau]2,
color, textSize = 11,
colorShear, \[Sigma]xxRightArrowText, \[Sigma]xxLeftArrowText, \
\[Sigma]yyTopArrowText, \[Sigma]yyBottomArrowText, \
\[Tau]RightArrowText, \[Tau]LeftArrowText, \[Tau]TopArrowText, \
\[Tau]BottomArrowText, rotationMatrix, coordinates, from, to,
rotatedAxisXText, rotatedAxisYText,
maxAbsoluteprincipalShearStress, thickness = Thick,
eps = 10^-9, \[Theta]p1, \[Theta]p2},
rotationMatrix = RotationMatrix[-\[Theta]];
rotatedAxisXText =
Text[Style["x", Italic, textSize], {0.3, 0}.rotationMatrix];
rotatedAxisYText =
Text[Style["y", Italic, textSize], {0, 0.3}.rotationMatrix];
{{\[Sigma]1, \[Theta]p1}, {\[Sigma]2, \[Theta]p2}} =
principalStresses[\[Sigma]x, \[Sigma]y, \[Tau]xy];
{\[Tau]1, \[Tau]2} =
maxAndMinShearStress[\[Sigma]x, \[Sigma]y, \[Tau]xy];
maxAbsoluteprincipalShearStress = Max[Abs[{\[Tau]1, \[Tau]2}]];
{\[Sigma]xx, \[Sigma]yy, \[Tau]xyxy} =
rotationStress[\[Sigma]x, \[Sigma]y, \[Tau]xy, \[Theta]];
If[Abs[\[Sigma]1] > 0,
{\[Sigma]xx, \[Sigma]yy} = {\[Sigma]xx, \[Sigma]yy}/
Abs[\[Sigma]1](*scale*)
];
If[maxAbsoluteprincipalShearStress > 0,
\[Tau]xyxy = \[Tau]xyxy/
maxAbsoluteprincipalShearStress(*scale*)
];
color = Red;
colorShear = Blue;
r = {White, EdgeForm[{Thin, Gray}],
Rectangle[{-0.5, -0.5}, {0.5, 0.5}]};
(*--------*)
If[\[Sigma]xx >= 0,
from = {0.6, 0};
to = {0.6 + \[Sigma]xx, 0};
coordinates = {If[annotate, 0.78, 0.68] + \[Sigma]xx,
0}.rotationMatrix
,
from = {0.6 + Abs@\[Sigma]xx, 0};
to = {0.6, 0};
coordinates = {If[annotate, 0.78, 0.68] + Abs@\[Sigma]xx,
0}.rotationMatrix
];
\[Sigma]xxRightArrowText = If[annotate,
Text[
Style[Column[{TraditionalForm[
Style["\!\(\*SubscriptBox[\(\[Sigma]\), \(x\)]\)"]],
padIt1[\[Sigma]xx*Abs[\[Sigma]1], {3, 1}]},
Alignment -> Center], textSize], coordinates, {0, 0}],
Text[
TraditionalForm[
Style["\!\(\*SubscriptBox[\(\[Sigma]\), \(x\)]\)",
textSize]], coordinates, {0, 0}]
];
\[Sigma]xxRightArrow = {thickness, Arrowheads[Medium], color,
Arrow[{from, to}, 0]};
(*--------*)
If[\[Sigma]xx >= 0,
from = {-0.6, 0};
to = {-0.6 - \[Sigma]xx, 0};
coordinates = {If[annotate, -0.78, -0.68] - \[Sigma]xx,
0}.rotationMatrix
,
from = {-0.6 - Abs@\[Sigma]xx, 0};
to = {-0.6, 0};
coordinates = {If[annotate, -0.78, -0.68] - Abs@\[Sigma]xx,
0}.rotationMatrix
];
\[Sigma]xxLeftArrowText = If[annotate,
Text[
Style[Column[{TraditionalForm[
Style["\!\(\*SubscriptBox[\(\[Sigma]\), \(x\)]\)"]],
padIt1[\[Sigma]xx*Abs[\[Sigma]1], {3, 1}]},
Alignment -> Center], textSize], coordinates],
Text[
TraditionalForm[
Style["\!\(\*SubscriptBox[\(\[Sigma]\), \(x\)]\)",
textSize]], coordinates]
];
\[Sigma]xxLeftArrow = {thickness, Arrowheads[Medium], color,
Arrow[{from, to}, 0]};
(*--------*)
If[\[Sigma]yy >= 0,
from = {0, 0.6};
to = {0, 0.6 + \[Sigma]yy};
coordinates = {0,
If[annotate, 0.75, 0.68] + \[Sigma]yy}.rotationMatrix
,
from = {0, 0.6 + Abs@\[Sigma]yy};
to = {0, 0.6};
coordinates = {0,
If[annotate, 0.75, 0.68] + Abs@\[Sigma]yy}.rotationMatrix
];
\[Sigma]yyTopArrowText = If[annotate,
Text[
Style[Column[{TraditionalForm[
Style["\!\(\*SubscriptBox[\(\[Sigma]\), \(y\)]\)"]],
padIt1[\[Sigma]yy*Abs[\[Sigma]1], {3, 1}]},
Alignment -> Center], textSize], coordinates],
Text[
TraditionalForm[
Style["\!\(\*SubscriptBox[\(\[Sigma]\), \(y\)]\)",
textSize]], coordinates]
];
\[Sigma]yyTopArrow = {thickness, Arrowheads[Medium], color,
Arrow[{from, to}, 0]};
(*--------*)
If[\[Sigma]yy >= 0,
from = {0, -0.6};
to = {0, -0.6 - \[Sigma]yy};
coordinates = {0, -0.75 - \[Sigma]yy}.rotationMatrix
,
from = {0, -0.6 - Abs@\[Sigma]yy};
to = {0, -0.6};
coordinates = {0, -0.75 - Abs@\[Sigma]yy}.rotationMatrix
];
\[Sigma]yyBottomArrowText = If[annotate,
Text[
Style[Column[{TraditionalForm[
Style["\!\(\*SubscriptBox[\(\[Sigma]\), \(y\)]\)"]],
padIt1[\[Sigma]yy*Abs[\[Sigma]1], {3, 1}]},
Alignment -> Center], textSize], coordinates],
Text[
TraditionalForm[
Style["\!\(\*SubscriptBox[\(\[Sigma]\), \(y\)]\)",
textSize]], coordinates]
];
\[Sigma]yyBottomArrow = {thickness, Arrowheads[Medium], color,
Arrow[{from, to}, 0]};
(*--------*)
If[\[Tau]xyxy >= 0,
from = {0.6, 0.5 - \[Tau]xyxy};
to = {0.6, 0.5};
coordinates = {If[annotate, 0.8, 0.7], 0.45}.rotationMatrix
,
from = {0.6, 0.5};
to = {0.6, 0.5 - Abs@\[Tau]xyxy};
coordinates = {If[annotate, 0.8, 0.7], 0.45}.rotationMatrix
];
\[Tau]RightArrowText = If[annotate,
Text[
Style[Column[{TraditionalForm[
Style["\!\(\*SubscriptBox[\(\[Tau]\), \
\(x\[InvisibleComma]y\)]\)"]],
padIt1[\[Tau]xyxy*maxAbsoluteprincipalShearStress, {3,
1}]}, Alignment -> Center], textSize], coordinates]
,
Text[
TraditionalForm[
Style["\!\(\*SubscriptBox[\(\[Tau]\), \
\(x\[InvisibleComma]y\)]\)", textSize]], coordinates]
];
\[Tau]RightArrow = {thickness, Arrowheads[Medium], colorShear,
Arrow[{from, to}, 0]};
(*--------*)
If[\[Tau]xyxy >= 0,
from = {0.5 - \[Tau]xyxy, 0.6};
to = {0.5, 0.6};
coordinates = {0.5, 0.75}.rotationMatrix
,
from = {0.5, 0.6};
to = {0.5 - Abs@\[Tau]xyxy, 0.6};
coordinates = {0.5, 0.75}.rotationMatrix
];
\[Tau]TopArrowText =
Text[TraditionalForm[
Style["\!\(\*SubscriptBox[\(\[Tau]\), \
\(y\[InvisibleComma]x\)]\)", textSize]], coordinates];
\[Tau]TopArrow = {thickness, Arrowheads[Medium], colorShear,
Arrow[{from, to}, 0]};
\[Tau]LeftArrow = {Arrowheads[Medium],
If[\[Tau]xyxy >= 0,
{
thickness, colorShear,
Arrow[{{-0.6, -0.5 + \[Tau]xyxy}, {-0.6, -0.5}}, 0]
}
,
{
thickness, colorShear,
Arrow[{{-0.6, -0.5}, {-0.6, -0.5 + Abs@\[Tau]xyxy}}, 0]
}
]};
\[Tau]BottomArrow = {thickness,
colorShear,
Arrowheads[Medium],
If[\[Tau]xyxy >= 0,
Arrow[{{-0.5 + \[Tau]xyxy, -0.6}, {-0.5, -0.6}}, 0]
,
Arrow[{{-0.5, -0.6}, {-0.5 + Abs@\[Tau]xyxy, -0.6}}, 0]
]
};
from = -(limit/40)*1.9;
to = -from;
Graphics[
{Rotate[r, \[Theta], {0, 0}],
If[Abs@\[Sigma]xx > eps,
{
Rotate[\[Sigma]xxRightArrow, \[Theta], {0, 0}],
\[Sigma]xxRightArrowText,
If[onPositiveSideOnly, Sequence @@ {},
Rotate[\[Sigma]xxLeftArrow, \[Theta], {0, 0}]]
},
Sequence @@ {}
]
,
If[Abs@\[Sigma]yy > eps,
{
Rotate[\[Sigma]yyTopArrow, \[Theta], {0, 0}],
\[Sigma]yyTopArrowText,
If[onPositiveSideOnly, Sequence @@ {},
Rotate[\[Sigma]yyBottomArrow, \[Theta], {0, 0}]]
},
Sequence @@ {}
]
,
If[Abs@\[Tau]xyxy > eps,
{
Rotate[\[Tau]RightArrow, \[Theta], {0, 0}],
\[Tau]RightArrowText,
Rotate[\[Tau]TopArrow, \[Theta], {0, 0}],
If[onPositiveSideOnly, Sequence @@ {},
{
Rotate[\[Tau]LeftArrow, \[Theta], {0, 0}],
Rotate[\[Tau]BottomArrow, \[Theta], {0, 0}]
}
]
},
Sequence @@ {}
]
,
{Gray, Thin, Dashed,
Rotate[{Arrowheads[Small],
Arrow[{{-0.25, 0}, {0.25, 0}}]}, \[Theta], {0, 0}]},
{Gray, Thin, Dashed,
Rotate[{Arrowheads[Small],
Arrow[{{0, -0.25}, {0, 0.25}}]}, \[Theta], {0, 0}]},
rotatedAxisXText,
rotatedAxisYText,
{PointSize[0.01], Point[{0, 0}]}
}
,
Axes -> False,
PlotRange -> {{from, to}, {from , to}},
ImageSize -> {contentSizeW, contentSizeH},
ImagePadding -> {{10, 10}, {10, 10}},
ImageMargins -> 0,
AspectRatio -> Automatic,
If[gridLines == 0, GridLines -> None,
{
GridLines -> {Range[from, to, (to - from)/(gridLines*20)],
Range[from, to, (to - from)/(gridLines*20)]},
GridLinesStyle -> Directive[Thickness[.001], LightGray]
}
],
Frame -> False
]
]
}
]