16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"多角形の回転方向と内角を求める"
この発言に対し以下のコメントが寄せられています
#00762 kiima さん RE:多角形の回転方向と内角を求める
多角形データより、その多角形の回転方向の判別、指定された頂点の内角を求
めます。X軸右向きが+・Y軸下向きが+の座標系で考えています。
{時計回り多角形データで指定頂点の内角を求める}
function GetInteriorAngleR(PolygonDat: array of TPoint; idx: Integer)
: Extended;
var
p1,p2,ac: Integer;
a1,a2: Extended;
begin
ac := High(PolygonDat)+1;
p1 := (idx-1+ac) mod ac;
p2 := (idx+1) mod ac;
a1 := ArcTan2(PolygonDat[idx].y-PolygonDat[p1].y
,PolygonDat[idx].x-PolygonDat[p1].x);
a2 := ArcTan2(PolygonDat[p2].y-PolygonDat[idx].y
,PolygonDat[p2].x-PolygonDat[idx].x);
Result := Pi-a2+a1;
if Result >= Pi*2 then
Result := Result-Pi*2;
end;
{多角形データの回転方向(時計回りか?)をチェックする}
function ClockWise(PolygonDat: array of TPoint): Boolean;
var
i,ac: Integer;
a: Extended;
begin
ac := High(PolygonDat)+1;
a := 0;
for i := 0 to ac-1 do
a := a+GetInteriorAngleR(PolygonDat,i);
Result := Abs(a-Pi*(ac-2)) < 1;
end;
{多角形データの指定頂点の内角を求める}
function GetInteriorAngle(PolygonDat: array of TPoint; idx: Integer)
: Extended;
begin
Result := GetInteriorAngleR(PolygonDat,idx);
if not ClockWise(PolygonDat) then
Result := Pi*2-Result;
if Result >= Pi*2 then
Result := Result-Pi*2;
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
|