如何判断一斜线是否与Rect相交(50分)

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

SharpExpress

Unregistered / Unconfirmed
GUEST, unregistred user!
例如
vP1,vP2: TPoint;//斜线
vRect: TRect;//矩形

请教算法?
 
转自:yostgxf

procedure TForm1.Button1Click(Sender: TObject);
var
Rect :TRect; //你的TRect
pt1, pt2, pt :TPoint; //pt1,pt2 你的线
i:integer;
begin
for i:=pt1.X to pt2.X do
begin
pt.X :=i;
pt.Y :=Trunc(((pt1.Y-pt2.Y)*pt1.X+pt2.X*pt1.Y+pt1.X*pt2.Y) div (pt1.X-pt2.X));
if not PtInRect(Rect, pt1)* PtInRect(Rect, pt) then
begin
//线 (斜线) 是与一TRect相交
end;
end;
end;

转自:http://www.delphibbs.com/delphibbs/dispq.asp?lid=2501855
感觉他用的算法很好,如果觉得适用,能否给我一点转贴费!
 
一条线条和一个矩形相交,则必与矩形至少一边相交。否则在矩形外或在矩形内。
这样就容易了。一条线和水平,垂直线是否相交很容易判断。
 
直线方程为 y = ax + b 或 x = cy + d
求得交点,看是否位于矩形内,楼上的算法效率太低了吧
 
呵呵,我算法的思想是:在线上找点,只要有一个点与一个顶点不同在矩形内(或外),则相交。不知道还有什么更高效的算法?讨论!

<注>我不要分,如果选用我的方法请给anna_yl加分。谢谢anna_yl的转贴。[:)]
 
首先得到直线方程,
然后分别和4条边求交点,判断是否位于矩形的另外两条边内
只用判断4次,
但如果按照线上的点逐个判断,如果线很长,岂不是会判断很多次
次数多了,效率能高吗?
 
在直线上有一个点在矩形上或内部就知道了!
 
直线方程一
a=(vP2_y - vP1_y)
b=(vP2_x - vP1_x)

if b=0 then
则如果两个点的x坐标位于矩形的两条垂直边之间,
而且直线与两条水平边的交点 的y坐标位于直线的两点的y坐标之间

否则,则
用直线方程和4条边分别求交点
如果是水平边,则交点的x坐标必须在直线的两个点y之间
如果是垂直边,则交点的y坐标必须在直线的两个点y之间

 
to anna_yl:
你的方法好像不能运行通过哦?
if not PtInRect(Rect, pt1)* PtInRect(Rect, pt) then//*?
///

那请问各位一下,
如何取得斜线上的各个点呢?

var
vPt1, vPt2: TPoint;//斜线
vPtArr: array of TPoint;//斜线上各个点的列表
?????????????????????????????
????????????????????
 
斜线上点是无穷个的,你怎么取斜线上各个点的列表?所以必须要选择一定的步长。

这段代码就是:
for i:=pt1.X to pt2.X do //步长
begin
pt.X :=i;
pt.Y :=Trunc(((pt1.Y-pt2.Y)*pt1.X+pt2.X*pt1.Y+pt1.X*pt2.Y) div (pt1.X-pt2.X));
//pt 就是斜线上各个点
end;
 
用简单的数学就可以解决这种问题,
一个点一个点去判断,谁用这么蠢的方法
 
不可能吧,
那怎么可能画斜线???
斜线应该还是经过一定的算法画出来的呀
 
?什么意思。我说的就是画斜线的算法呀
 
先判断是否有个端点在矩形内,如果不在,则判断是否和矩形的两条对角线相交,就可以了。
效率不是更高!
 
同意 lich , 可能那算法本身没有错误 ,只是本来就有公式直接判断的 ,有必要一个一个去对吗?
 
相交不就只能几种情况嘛
对几个点进行判断就可以知道是否相交,
求斜线或是画斜线或是方法都不好

更不能是用线上的每点一个一个的去判断, 这种思路就是错的(如果过份请原谅)
 
今天才发现数学是多么的重要!
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部