|
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
|