16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"多角形の面積と重心を求める"
この発言に対し以下のコメントが寄せられています
#00752 kiima さん RE:多角形の面積と重心を求める
多角形の面積と重心点を求める
nifty:FDELPHI/MES/19/62269 からのツリーで 裏目小僧 さんに教えてもらっ
た方法です。アルゴリズムの詳細はツリーを見ていただいたほうが解かりやす
いでしょう。(私の物分かりが悪かったので詳細に説明戴きました)(^^;
type
TPointF = record
x,y: Extended;
end;
function GetPolygonArea2(pt: array of TPointF; var gp: TPointF)
: Extended;
var
i,j: Integer;
Mx,My: Extended;
dax,sax,say: Extended;
dcgx,dcgy,scgx,scgy: Extended;
dx,dy: Extended;
wt: Extended;
begin
wt := 0; //面積累積をクリア
Mx:=0; //X軸モーメント累積レジスタをクリア
My:=0; //Y軸モーメント累積レジスタをクリア
for i:=0 to High(pt) do begin
j := (i+1) mod (High(pt)+1);
dy:=(pt[j].y-pt[i].y);
dx:=(pt[j].x-pt[i].x);
dax := dx*dy/2; //投影三角形の面積(X/Y共通)
sax := dx*pt[i].y; //X軸投影四角形の面積
say := dy*pt[i].x; //Y軸投影四角形の面積
dcgx := pt[j].x-dx/3; //X軸投影三角形の重心点X座標
dcgy := pt[j].y-dy/3; //Y軸投影三角形の重心点Y座標
scgx := pt[j].x-dx/2; //X軸投影三角形の重心点X座標
scgy := pt[j].y-dy/2; //Y軸投影三角形の重心点Y座標
Mx:=Mx+dax*dcgx+sax*scgx; //X軸投影回転モメント
My:=My+dax*dcgy+say*scgy; //Y軸投影回転モメント
wt := wt+dax+sax;
end;
gp.x:=Mx/wt; //重心X座標
gp.y:=My/(-wt); //重心Y座標
Result := Abs(wt);
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
|