快速确定与垂直线相交的两个线段的顺序

时间:2012-06-11 02:23:13

标签: algorithm

有没有更好的方法来确定与垂直线相交的两个线段的顺序?顺序是根据交点的y坐标。 天真的方法是计算交叉点并进行比较。

2 个答案:

答案 0 :(得分:0)

我可以给你一些解决这个问题的建议:

  • 查找行之间交叉点的更快捷方式可以是使用决定因素,如显示此Wikipedia entry
  • 解决这个问题的更一般版本的算法是Bentley–Ottmann algorithm,用于测试一组线段是否有任何交叉。

我相信Wikipedia关于线段交叉点的此条目包含您对此问题的查询。

答案 1 :(得分:0)

我假设使用端点指定了行。

一条线与端点(x0y0)/(x1y1)和一条x坐标x的垂直线的交点是于:

y = (dy/dx)(x - x0) + y0

其中dx = x1 - x0dy = y1 - y0

你有两行正在计算:

(day/dax)(x - ax0) + ay0 < (dby/dbx)(x - bx0) + by0

你可以将两边乘以dax * dbx来摆脱分歧:

(day * dbx)(x - ax0) + (ay0 * dax * dbx) < (dby * dax)(x - bx0) + (by0 * dax * dbx)

并简化一下:

(day * dbx)(x - ax0) - (dby * dax)(x - bx0) + (ay0 - by0)(dax * dbx) < 0

这不一定更好 - 这取决于具体情况:

  • 如果坐标是整数,这可以让你完全执行测试,但如果dax / dbx /等很大,它也容易出现溢出
  • 如果坐标是浮点数,则浮点除法可能会更快