平面多角形の慣性モーメント
平面多角形の面積を求めるプログラムに慣性モーメントを求める計算を追加してみました。
座標の入力や、入力ミスの確認は、面積の計算と全く同じで、慣性モーメントの計算には、面積を求める必要があるので、慣性モーメントを求める計算プログラムがあれば、単純に面積だけを求めるプログラムは、不要となります。
此処での慣性モーメントの計算は、単位面積の質量を 1 として計算しています。
本来の慣性モーメントを求める場合は、単位面積当たりの質量を入力する項目を追加し、此処で計算された面積から全質量を計算し、計算された慣性モーメントに、乗算して下さい。
座標の入力は、反時計回りです、時計回りに計算する場合は、計算式の変更が必要です。
慣性モーメントは、図形の重心を中心として回転する慣性モーメントと、座標原点を通る軸に対しての図形重心が回転する慣性モーメントがあり、両方を加算したものが座標原点を通る軸にたいする慣性モーメントです。
此処での計算では、座標原点を通る軸に対しての慣性モーメントを計算し、重心を通る軸に対する慣性ネーメントは、重心が座標原点軸に対する慣性モーメントを計算し、前記慣性モーメントから差し引いて、重心を通る軸の慣性モーメントを計算しています。
X軸に対する慣性モーメントIXとY軸に対する慣性モーメントIYを加算したものが、Z軸に対する慣性モーメントIZとなります。
左図は、X軸方向に対する慣性モーメントを表しています。
面積の計算と同じように、三角形の慣性モーメントを考えて見ます。
慣性モーメントの計算は、面積と同じで、上図ハッチング部分の慣性モーメントを計算し、総和を求めて慣性モーメントとします。
計算式は、座標原点を通るX軸にたいする慣性モーメントです。
X1-X2がマイナスになるのは、上図赤ハッチングの部分で、全部を加算すると、三角形部分の慣性モーメントとなります。
Y軸に対しての慣性モーメントは、Y軸を基準に計算式を変更すれば良いのですが、単にX1-X2をY1-Y2にすると、差分の値の符号が反対になるので、Y2-Y1にする必要があります。
此処での計算は、反時計回りとなっていますが、これは、座標系は全て反時計回りに定義されているからです。
もし、時計回りに計算する場合は、差分(X1-X2)を逆(X2-X1)にすれば、良い事になります。
重心位置の計算
上図は、反時計回りの最初の計算を表しています。
Aは斜線部分の面積です、マイナスの符号は、上図の場合減算する面積だからです、(X1-X2)にすればマイナスの符号は要りません。
慣性モーメント(二次モーメント)の計算と同じで、YGA
(一次モーメント) を計算し、全てを加算後、三角形面積で除算をすると、原点を通る軸からの三角形重心G迄の距離を求める事が出来ます。
重心Gを通るX軸に対する慣性モーメントは IX-YG2Aとなります。
上図のXGの計算式は、本プログラムでは利用していません、Y軸に対する慣性モーメント計算を軸を入れ替えることによって行っているので、YGの計算式のYをXに入れ替えることによって、XGの計算をしています。
次のプログラム例は、面積を求めるプログラムに対して、慣性モーメントを求める部分を追加したので、その追加ルーチンです。
var XG, YG : double; // 重心位置 IX, IY, IZ : double; // 慣性モーメント // イナーシャ計算 procedure TForm1.Inertia_Calc; // 慣性モーメント計算 var DX, DY : double; X1, X2, Y1, Y2 : double; SX, SY : double; I : Integer; IXo, IYo, IZo : Double; Xp, Yp : Integer; begin SX := 0; SY := 0; // 面積 XG := 0; YG := 0; // 重心位置 IX := 0; IY := 0; // 慣性モーメント X2 := Xd[N - 1]; Y2 := Yd[N - 1]; // 最後のデーターセット for I := 0 to N - 1 do begin X1 := X2; Y1 := Y2; X2 := Xd[I]; Y2 := Yd[I]; DX := X2 - X1; // X差分 DY := Y2 - Y1; // Y差分 SX := SX - DX * (Y1 + Y2) / 2; // 面積計算 SXとSYは同じ値と成ります SY := SY + DY * (X1 + X2) / 2; // 面積計算 XG := XG + DY * (X1 * X1 + X1 * X2 + X2 * X2) / 6; // 一次モーメントX 最後に全面積で除算します YG := YG - DX * (Y1 * Y1 + Y1 * Y2 + Y2 * Y2) / 6; // 一次モーメントY 最後に全面積で除算します IX := IX - DX * (Y1 + Y2) * (Y1 * Y1 + Y2 * Y2) / 12; // X軸慣性モーメント IY := IY + DY * (X1 + X2) * (X1 * X1 + X2 * X2) / 12; // Y軸慣性モーメント end; XG := XG / SX; // 面積で除算し重心位置にする YG := YG / SY; // 面積で除算し重心位置にする IZ := IX + IY; // Z軸慣性モーメント IXo := IX - YG * YG * SY; // 重心を通るX軸慣性モーメント IYo := IY - XG * XG * SX; // 重心を通るY軸慣性モーメント IZo := IXo + IYo; // 重心を通るZ軸慣性モーメント with Image1 do begin // Canvas.TextOut(20,50, 'SX=' + floatTostr(SX)); // Canvas.TextOut(20,70, 'SY=' + floatTostr(SY)); Canvas.TextOut(20,40, '重心位置 X= ' + floatTostr(XG)); Canvas.TextOut(20,60, '重心位置 Y= ' + floatTostr(YG)); Canvas.TextOut(20,80, 'X軸慣性モーメント= ' + floatTostr(IXo)); Canvas.TextOut(20,100, 'Y軸慣性モーメント= ' + floatTostr(IYo)); Canvas.TextOut(20,120, 'Z軸慣性モーメント= ' + floatTostr(IZo)); Canvas.TextOut(20,145, 'X軸原点慣性モーメント = ' + floatTostr(IX)); Canvas.TextOut(20,165, 'Y軸原点慣性モーメント = ' + floatTostr(IY)); Canvas.TextOut(20,185, 'Z軸原点慣性モーメント = ' + floatTostr(IZ)); end; Xp := 50 + Round((XG - Xmin) * Scale); // Xの位置計算 Yp := 550 - Round((YG - Ymin) * Scale) - 50; // Yの位置計算 Image1.Canvas.Pen.Color := clBlack; Image1.Canvas.Brush.Color := clGreen; Image1.Canvas.Ellipse(Xp - 4, Yp - 4, Xp + 5, Yp + 5); // 円を描画中を塗りつぶし end;
Polygon_Inertia.zip
各種プログラム計算例に戻る