以下解决方案使用为平行四边形优化的象限漫游算法。它是绕组数算法的一个导数。在
该算法将测试点p放在一个坐标系的中心,并按顺序遍历多边形的顶点,检查“正负轴交叉”。如果轴的交叉数是4的倍数(但不是0),则P在多边形内。直觉上P在多边形内部,如果顶点“穿过所有四个半轴”。因此是4的倍数。在
该算法可以高度优化(特别适合汇编程序实现),并且运行速度快。在
这是在Delphi中,使用与MBo的答案中给出的函数ptinpgm相同的参数顺序function PtInPlgm2( bx, by, ax, ay, cx, cy, px, py: double ): boolean;
var
Sum : integer;
dx, dy : double;
begin
Sum := 0;
dx := cx - bx + ax;
dy := cy - by + ay;
if ( px < ax ) <> ( px < bx ) then inc( Sum );
if ( py < ay ) <> ( py < by ) then inc( Sum );
if ( px < bx ) <> ( px < cx ) then inc( Sum );
if ( py < by ) <> ( py < cy ) then inc( Sum );
if ( px < cx ) <> ( px < dx ) then inc( Sum );
if ( py < cy ) <> ( py < dy ) then inc( Sum );
if ( px < dx ) <> ( px < ax ) then inc( Sum );
if ( py < dy ) <> ( py < ay ) then inc( Sum );
Result := (Sum mod 4 = 0) AND (Sum <> 0);
end;
我相信没关系,我没有提供Python实现