带有边界框的2D线交叉点

时间:2011-07-31 14:52:56

标签: graphics trigonometry

用于计算以(θ,y)为角度的线与角度为θ的线的交点以及具有共同点(0,0至w,h)的边界矩形的有效算法是什么?假设行原点在框内。

在基本的ascii艺术中(对于从2,6和θ开始的线约为9π/ 8):

 h---------------...h,w
 .               ...
 .               ... 
 .               ...
 7               ...
 6   x           ...
 5  /            ...
 4 /             ...
 3/              ...
 2               ...
/1               ...
 0 1 2 3 4 5 6 7 ... w

除θ外,所有变量都是整数。

1 个答案:

答案 0 :(得分:2)

假设我们使用变量t对行进行参数化,即该行上的每个点都可以写为

[x(t),y(t)] = [x,y] + t * [dx,dy]

使用常量

dx = cos(theta)
dy = sin(theta)

然后你可以先计算垂直边界的切口:

if dx<0 then        // line going to the left -> intersect with x==0
  t1 = -x/dx
  x1 = 0
  y1 = y + t1*dy
else if dx>0 then   // line going to the right -> intersect with x==w
  t1 = (w-x)/dx
  x1 = w
  y1 = y + t1*dy
else                // line going straight up or down -> no intersection possible
  t1 = infinity
end

其中t1是交叉点的距离,[x1,y1]是点本身。其次,你对上下边界做同样的事情:

if dy<0 then        // line going downwards -> intersect with y==0
  t2 = -y/dy
  x2 = x + t2*dx
  y2 = 0
else if dy>0 then   // line going upwards -> intersect with y==h
  t2 = (h-y)/dy
  x2 = x + t2*dx
  y2 = h
else
  t2 = infinity
end

现在您只需选择与原点[x,y]距离较短的点。

if t1 < t2 then
  xb = x1
  yb = y1
else
  xb = x2
  yb = y2
end

请注意,此算法仅在起点位于边界框内时才有效,即0 <= x <= w0 <= y <= h