给定两个点,找出第三个点是在所形成的线的上方还是下方

时间:2019-04-09 18:41:43

标签: php math vector google-cloud-vision

我已经使用了Google Cloud vision API来识别带有表格的文档,但是有时图像会稍微旋转一下,试图使用我想要的键的boundingPoly来获取值,但是如何如果不在同一'y'上,我该怎么办?

我当时正在考虑在boundingBox的上方和下方划一条“线”,并确定该点是否位于两者之间,但我不知道该怎么做。

[18] => Array
(
  [description] => Date
  [boundingPoly] => Array
  (
    [vertices] => Array
    (
      [0] => Array
      (
        [x] => 698
        [y] => 289
      )
      [1] => Array
      (
        [x] => 729
        [y] => 289
      )
      [2] => Array
      (
        [x] => 729
        [y] => 301
      )
      [3] => Array
      (
        [x] => 698
        [y] => 301
      )
    )
  )
)
[66] => Array
(
  [description] => 25/03/2019
  [boundingPoly] => Array
  (
    [vertices] => Array
    (
      [0] => Array
      (
        [x] => 1007
        [y] => 290
      )
      [1] => Array
      (
        [x] => 1131
        [y] => 290
      )
      [2] => Array
      (
        [x] => 1131
        [y] => 307
      )
      [3] => Array
      (
        [x] => 1007
        [y] => 307
      )
    )
  )
)

1 个答案:

答案 0 :(得分:2)

给出点(x1, y1)(x2, y2),可以确定第三点(x3, y3)是否共线,如下所示。
首先,计算斜率m1 = (y2 - y1) / (x2 - x1)
接下来,计算斜率m2 = (y3 - y2) / (x3 - x2)
当且仅当m1 = m2时,线是共线的。 共线表示它们位于同一行上。
这仅对垂直线失败;可以按如下方式分别处理这些情况:x1 = x2 = x3,则这些点是共线的;如果x1 = x2x2 = x3而不是x1 = x2 = x3,则第三个点与前两个点不共线。


鉴于线(m1, h1)(m2, h2),您可以如下确定点(x3, y3)是否位于这些线之间。
计算y1 = h1 + m1 * x3y2 = h2 + m2 * x3
然后,当且仅当y1 <= y3 <= y2y2 <= y3 <= y1时,点位于线之间。
2.如果两条线都是垂直线x = x1x = x2,则当且仅当x1 <= x3 <= x2x2 <= x3 <= x1时,点才位于两条线之间。
如果恰好其中一行是垂直的(为便于表示,假设它是第一行),则计算x2 = (y3 - h2) / m2;那么,当且仅当x1 <= x3 <= x2x2 <= x3 <= x1时,点才在线之间。

(如果您的一条线是垂直的,另一条线是水平的,我想它们之间的唯一点就是它们的交点)。