如何判断两个图形是否重叠(200)

  • 主题发起人 主题发起人 woodlee
  • 开始时间 开始时间
W

woodlee

Unregistered / Unconfirmed
GUEST, unregistred user!
各位高手,请教一个问题.在平面中,有两个不规则的图形,我只能知道这两个图形各个点的坐标及每个角的角度.我怎么能够去判断出这两个图形是否重叠呢?tks!在线等待......
 
假设图A有N个点,则图A由N个线段组成。假设图B有M个点,则图B由M个线段组成。这N个线段以及M个线段的坐标应该可以获得,剩下的就是判断N中的每个线段有没有可能和M个线段中的其中一个相交,发生相交则说明重叠。记得高中数学中,有一个关于计算两条线段的交点的方法。这是笨一点的方法,更好的方法我没有,呵呵
 
判断线段是否相交之前可以先过滤一下,大于第一个图形的最小坐标,并且小于第一个图形的最大坐标的点相关的线段才列入计算,反之依然
 
略有眉目了.如果A图形在B图形内部呢?怎么来判断?
 
uses Math;var NPoints:Array of TPoint; //图形A的点集合 MPoints:Array of TPoint; //图形B的点集合procedure CalcNum(N1,N2:TPoint; M1:TPoint; Var TopNum,BotNum:Integer);var TmpInt:Integer;begin //N1,N2为A图线段,M1为B图某个点 //从Y方向看,M1在线段上侧,则Inc(BotNum),在线段下侧,则Inc(TopNum) if N1.X=N2.X Then Exit; if Sign(N1.X-M1.X) <> Sign(M1.X-N2.X) then Exit; TmpInt := Sign((N2.Y-N1.Y)/(N2.X-N1.X)*(M1.X-N1.X) - M1.Y); if TmpInt>0 then Inc(BotNum) else if TmpInt<0 then Inc(TopNum);end;procedure TForm1.Button1Click(Sender: TObject);var N,M:Integer; TopNum,BotNum:Integer; XiangJiao,MinN:Boolean;begin MinN:=True;//M是否在N内部 XiangJiao:=False;//是否相交 for M:=Low(MPoints) to High(MPoints) do begin TopNum:=0; BotNum:=0; For N:=Low(NPoints) to High(NPoints) do begin if N=High(High(NPoints)) then CalcNum(NPoints[N],NPoints[0], MPoints[M], TopNum,BotNum) else CalcNum(NPoints[N],NPoints[N+1], MPoints[M], TopNum,BotNum); end; if ((TopNum Mod 2)=1) and ((BotNum Mod 2)=1) then XiangJiao:=True else MinN:=False; end;end;
 
刚才CalcNum函数有错误,改一下,呵呵procedure CalcNum(N1, N2: TPoint; M1: TPoint; var TopNum, BotNum: Integer);var TmpInt: Integer;begin //N1,N2为A图线段,M1为B图某个点 //从Y方向看,M1在线段上侧,则Inc(BotNum),在线段下侧,则Inc(TopNum) if N1.X = N2.X then Exit; if Sign(N1.X - M1.X) <> Sign(M1.X - N2.X) then Exit; TmpInt := Sign((N2.Y - N1.Y) / (N2.X - N1.X) * (M1.X - N1.X)+N1.Y - M1.Y); if TmpInt > 0 then Inc(BotNum) else if TmpInt < 0 then Inc(TopNum);end;
 
请问znxia,"var NPoints:Array of TPoint; //图形A的点集合 MPoints:Array of TPoint; //图形B的点集合"这些点是A/B图形边上的点的集合吗 ?
 
嗯,是的。不知道你那边是怎么定义的。我q号: 1 0 9 3 4 2 9 4 0 2
 
不规则图形中包含有弧度的
 
是矢量图,还是位图?如果是位图,可以把位图的切分为一个数组,点的坐标,颜色,然后比较数组。如果是矢量图,比较矢量图的类别和特征点。如直线,圆,弧等。
 
一个简单办法是用图象的xor,看点的颜色是否变了
 

Similar threads

回复
0
查看
848
不得闲
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部