找到包围一点的线的算法

Posted

技术标签:

【中文标题】找到包围一点的线的算法【英文标题】:Algorithm to find the lines bracketing one point 【发布时间】:2010-10-22 13:41:41 【问题描述】:

我有以下任务:

在程序中,我们应该在位图显示上画线。一组n 实数对(a<sub>i</sub>,b<sub>i</sub>) 定义了ny<sub>i</sub> = a<sub>i</sub>*x + b<sub>i</sub>。这些行在x-间隔[0, 1] 中排序,因为y<sub>i</sub> &lt; y<sub>i+1</sub> 对于0n-2 之间的所有i 值以及[0, 1]x 的所有值

不太正式,线条不会在垂直板中接触。给定一个点(x,y),其中0 &lt; x &lt; 1,我们想要确定两行将点括起来。

我们怎样才能快速解决这个问题?

【问题讨论】:

【参考方案1】:
Function bracket( Real x, Real y, Array a[1..n],b[1..n] of Reals): Returns void 

  Integer i = 1;

  While (i<=n && (a[i] * x + b[i]) <= y, i++)

  If (i==1 || i == n+1) 
                        Print("Not bracket exists");
                         Exit()
                       
  If (a[i] * x + b[i]) == y)
                        Print("Point lies on line",i);
                         Exit()
                       
  Print("Point between lines ", i-1, " and ", i);
  

不过有一点小问题。见下图:

你会说点 F 被 [0,1]x[0,1] 中的两行“括起来”吗?这种情况下的正确答案是什么?

【讨论】:

也许二分搜索会更快? @Dialectus 也许我误解了 OP(“我们怎样才能快速解决这个问题?”)。如果“快速”意味着 O(logn) 你是对的,如果“快速”意味着只在一条指令中,那么上面的“while”循环就可以了。在这种情况下使用之前从未见过“快速”:)

以上是关于找到包围一点的线的算法的主要内容,如果未能解决你的问题,请参考以下文章

将点转换为矢量线的算法。 (光栅到矢量)

Dijkstra算法(求一点到任意一点的最短距离)

找到非常规二维形状的最长完全内部线的算法?

我可以使用 Lattice auto.key 或 key 来制作带有点的图例和其他数据的线吗?

包含一组点的多边形

绘制垂直于给定线的线