如何判断任意一点是在一个三角形的里面还是外面(50分)

  • 主题发起人 主题发起人 sem_bob
  • 开始时间 开始时间
S

sem_bob

Unregistered / Unconfirmed
GUEST, unregistred user!
毕业找工作,一个公司提了这么一个问题,可惜我的数学放了太久。。。
想过用FloodFill填充三角形的颜色,再用鼠标拾取任意一点的颜色。但通过坐标获取颜色
的方法(命令)不清楚。望哪位仁兄帮忙解决。(用数学方法,或者我想的这种方法)
 
任取两个点连成直线,这个点都和三角形剩下的另外一个点在直线的相同的一边
当然了,要判断3次(3条线)
 
将该点与三点相连,然后如果两两连线的角度(小于180度的三个)加起来是360度(2PI弧度),
就是在内部,否则就是在外面.
假设有三角形(x1,y1),(x2,y2),(x3,y3),判断一点x,y是否在其中:
function GetLen(x1,y1,x2,y2:Double):Double;
begin
Result:=Sqrt( Sqr(x1-x2)+Sqr(y1-y2) );
end;
function GetRad(x,y,x1,y1,x2,y2:Double):Double;
var
L1,L2,L3:Double;
begin
L1:=GetLen(x,y,x1,y1); //求长度
L2:=GetLen(x,y,x2,y2);
L3:=GetLen(x1,y1,x2,y2);
Result:=AcrCos( (Sqr(L1)+Sqr(L2)-Sqr(L3))/2/L1/L2 ); //获得角度,0~PI之间
end;
//判断点x,y是否在三角形内
function PntInTrngl(x,y:Double; x1,y1,x2,y2,x3,y3:Double):Boolean;
begin
try
if Abs( GetRad(x,y,x1,y1,x2,y2)+
GetRad(x,y,x2,y2,x3,y3)+
GetRad(x,y,x3,y3,x1,y1) -
2*PI) <= 1e-10 //防止运算误差
then Result:=True
else Result:=False;
except
Result:=True; //x,y与某个顶点重合
end;
end;
这个程序不难推广到n个顶点的情况.
 
还有一种所谓的跳栏杆的办法,你可以在前面的贴中寻找,就不赘述了.
 
Hypot(x-x1,y-y1)可以代替GetLen(x,y,x1,y1).
HyPot和ArcCos函数在Math单元中,用Use Math包含它.
 
为什么不用最简单的方法啊?这家公司???????????
首先创建三角形区域,然后判断点是否在区域里。
CreatePolygonRgn();
PtInRegion();
 
区域有理。。。。

经典。。。。。
 
to 卷起千堆雪tyn:
首先,CreatePolygonRgn()和PtInRegion()都只好接受整数形参数,精度有限.
另外,假如要自己写算法呢?
 
自己写算法,只能用"跳栅栏"算法了,计算机图形学里有现成的.
 
盛老头。
你发拉啊。
工作要搞定拉。 这么多人帮你解了这个问题。
 
多人接受答案了。
 
后退
顶部