多角形平面多角形の慣性モーメント

平面多角形の面積を求めるプログラムに慣性モーメントを求める計算を追加してみました。

 座標の入力や、入力ミスの確認は、面積の計算と全く同じで、慣性モーメントの計算には、面積を求める必要があるので、慣性モーメントを求める計算プログラムがあれば、単純に面積だけを求めるプログラムは、不要となります。

此処での慣性モーメントの計算は、単位面積の質量を として計算しています。
本来の慣性モーメントを求める場合は、単位面積当たりの質量を入力する項目を追加し、此処で計算された面積から全質量を計算し、計算された慣性モーメントに、乗算して下さい。

座標の入力は、反時計回りです、時計回りに計算する場合は、計算式の変更が必要です。


三角形の例1 慣性モーメントは、図形の重心を中心として回転する慣性モーメントと、座標原点を通る軸に対しての図形重心が回転する慣性モーメントがあり、両方を加算したものが座標原点を通る軸にたいする慣性モーメントです。
此処での計算では、座標原点を通る軸に対しての慣性モーメントを計算し、重心を通る軸に対する慣性ネーメントは、重心が座標原点軸に対する慣性モーメントを計算し、前記慣性モーメントから差し引いて、重心を通る軸の慣性モーメントを計算しています。
X軸に対する慣性モーメントIXとY軸に対する慣性モーメントIYを加算したものが、Z軸に対する慣性モーメントIZとなります。
 左図は、X軸方向に対する慣性モーメントを表しています。

面積の計算と同じように、三角形の慣性モーメントを考えて見ます。

 慣性モーメント計算0
 慣性モーメントの計算は、面積と同じで、上図ハッチング部分の慣性モーメントを計算し、総和を求めて慣性モーメントとします。
計算式は、座標原点を通る軸にたいする慣性モーメントです。
X1-X2がマイナスになるのは、上図赤ハッチングの部分で、全部を加算すると、三角形部分の慣性モーメントとなります。
Y軸に対しての慣性モーメントは、Y軸を基準に計算式を変更すれば良いのですが、単にX1-X2Y1-Y2にすると、差分の値の符号が反対になるので、Y2-Y1にする必要があります。
此処での計算は、反時計回りとなっていますが、これは、座標系は全て反時計回りに定義されているからです。
もし、時計回りに計算する場合は、差分(X1-X2)を逆(X2-X1)にすれば、良い事になります。

 重心位置の計算
重心を通る軸の慣性モーメント
 上図は、反時計回りの最初の計算を表しています。
は斜線部分の面積です、マイナスの符号は、上図の場合減算する面積だからです、(X-Xにすればマイナスの符号は要りません。
慣性モーメント(二次モーメント)の計算と同じで、 (一次モーメント) を計算し、全てを加算後、三角形面積で除算をすると、原点を通る軸からの三角形重心迄の距離を求める事が出来ます。

重心を通る軸に対する慣性モーメントは IX-Yとなります。
上図のXの計算式は、本プログラムでは利用していません、Y軸に対する慣性モーメント計算を軸を入れ替えることによって行っているので、Yの計算式のYをXに入れ替えることによって、Xの計算をしています。

次のプログラム例は、面積を求めるプログラムに対して、慣性モーメントを求める部分を追加したので、その追加ルーチンです。

 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;


        download Polygon_Inertia.zip


        各種プログラム計算例に戻る