お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"多角形の面積と重心点を求める"




多角形の面積と重心点を求める
方式は、各辺を構成する線分と原点とで構成される3角形の面積と重心点を算
出し、それぞれを合成・削除をする事で、多角形の面積と重心を求める

type
  TPointF = record
    x,y: Extended;
  end;

function PointF(x,y: Extended): TPointF;
begin
  Result.x := x;
  Result.y := y;
end;

//三角形の重心点を求める
function GetDeltaGPos(p1,p2,p3: TPointF): TPointF;
begin
  Result.x := (p1.x+p2.x+p3.x)/3;
  Result.y := (p1.y+p2.y+p3.y)/3;
end;

//多角形の面積と重心点を求める
function GetPolygonArea(pt: array of TPointF; var gp: TPointF)
  : Extended;
var
  i,j: Integer;
  wp,wm,w: Extended;
  gpp,gpm,p: TPointF;
  //2重点を合成した重心点を求める
  function GetCgp(p1: TPointF; g1: Extended; p2: TPointf; 
    g2: Extended): TPointF;
  begin
    Result.x := p1.x+(p2.x-p1.x)*g2/(g1+g2);
    Result.y := p1.y+(p2.y-p1.y)*g2/(g1+g2);
  end;
begin
  wp := 0;
  wm := 0;
  gpp := PointF(0,0);
  gpm := gpp;
  for i := 0 to High(pt) do begin
    j := (i+1) mod (High(pt)+1);
    w := (pt[i].x*pt[j].y-pt[i].y*pt[j].x)/2;   //1辺と原点で構成される
                                                //三角形の面積
    p := GetDeltaGPos(PointF(0,0),pt[i],pt[j]); //その三角形の重心点
    if w <> 0 then begin
      //三角形を面積の正負で分類してそれぞれの合成した重心点を求める
      if w > 0 then begin
        gpp := GetCgp(gpp,wp,p,w);
        wp := wp+w;
      end else begin
        gpm := GetCgp(gpm,wm,p,w);
        wm := wm+w;
      end;
    end;
  end;
  Result := Abs(wp+wm);
  if Result <> 0 then
    gp := GetCgp(gpp,wp,gpm,wm) //正負2つの合成重心点をさらに合成する
  else
    gp := PointF(0,0);
end;

                          /*** kiima | CXG00064@nifty.ne.jp ***/

Original document by kiima           氏 ID:(CXG00064)


ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum