16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"ある点が三角形の中か外か"
この発言に対し以下のコメントが寄せられています
#00082 龍平 さん RE:浮動小数点の誤差の話
#00786 裏目小僧 さん 多角形の内と外の判定
nifty:FDELPHI/MES/06/12800 の話題に対する、答案でもあります。
与えられた点Pが、三角形ABCの中にあるか外にあるかを判定します。
uses windows;
function getDistance(A,B:TPoint;P:TPoint):double;
{ABをとおる直線とPとの距離を符号付きで求める}
var
ABX,ABY:integer;
begin
ABX := A.x -B.x;//点Aと点Bのx座標の差
ABY := A.y -B.y;//点Aと点Bのy座標の差
result := (ABY*P.x-ABX*P.y+ABX*A.y-ABY*A.x)
/sqrt(sqr(ABX)+sqr(ABY));
end;
function isSameSide(A,B:TPoint;C,D:TPoint):Boolean;
{ABをとおる直線に対して、CとDが同じ側にあればtrue
反対側にあればfalseをかえす}
begin
result := ((getDistance(A,B,C)*getDistance(A,B,D)) >= 0);//*1*
end;
function InDelta(A,B,C:TPoint;P:TPoint):Boolean;
{三角形ABCの中にPがあればtrueをかえす}
begin
result :=
( (isSameSide(A,B,C,P))
and(isSameSide(B,C,A,P))
and(isSameSide(C,A,B,P)) );
end;
*1* ここの不等号を > にすると、線の上は外とみなすようになります。
現行では、線上は中とみなします。
わかりやすくするために、ABCが三角形でない(どれか二点が一致する)ときなどの
処置は省いてあります。
理論は、nifty:FDELPHI/MES/06/12812 のkiimaさんの
|A案:
| 1.3角形ABCの辺ABを延長した直線を算出
| 2.1の直線に対し、点Pが頂点Cと同じ側(線上を含む)に有るか判断
| 3.3辺に対し1〜2の処理をし、2がすべて真ならば点Pは3角形の内点
です
97/10/22(Wed) 05:08am
CQK00014 Dia
Original document by Dia 氏 ID:(CQK00014)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|