Graphics 具有边界框的二维直线交点

Graphics 具有边界框的二维直线交点,graphics,trigonometry,Graphics,Trigonometry,计算从a(x,y)开始的线与夹角为θ的边界矩形(0,0到w,h)的交点的有效算法是什么?假设线原点位于框内 在基本ascii艺术中(对于以2,6和θ约9π/8开始的线): 除了θ之外,所有变量都是整数。假设我们用一个变量t对直线进行参数化,即直线上的每个点都可以写成 [x(t),y(t)] = [x,y] + t * [dx,dy] 常数 dx = cos(theta) dy = sin(theta) 然后,可以首先计算穿过垂直边界的切割: if dx<0 then //

计算从a(x,y)开始的线与夹角为θ的边界矩形(0,0到w,h)的交点的有效算法是什么?假设线原点位于框内

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


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

假设我们用一个变量
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
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
如果t1

请注意,此算法仅在起点位于边界框内时有效,即
0。我很确定这不起作用。例如,对于(x,y)=(8,3)和0=7π/5(接近左侧水平),这将返回(xb,yb)=(7.02,0)的边界点,而它应该是(0,0.40)。克里斯·利什曼:你似乎使用了不同的θ概念。在我的示例中,角度是从x轴逆时针测量的(即,0向左,pi/2向上),而从y轴逆时针测量(即,0向上,pi/2向左)。你可以很容易地用π/2θ替换θ,公式与你的定义很吻合。是的,我不清楚角度原点,尽管我的ascii示例确实暗示了这一点。你认为将sin(0)应用于水平轴(如我所假设的)还是垂直轴(如你所假设的)更为常见?
if t1 < t2 then
  xb = x1
  yb = y1
else
  xb = x2
  yb = y2
end