【问题标题】:Is a point between two points?两点之间有一点吗?
【发布时间】:2015-07-03 19:47:36
【问题描述】:

在谷歌上搜索并查看 Stack 很长时间后,我才设法找到确定一个点是否落在连接两点的线上的方法。不幸的是,这不是我需要的。

请看本题末尾的图片。我提前为这张糟糕的照片道歉,但它抓住了重点(明白了吗?)。

我需要创建两条垂直线来连接点 x 和 y。它们需要在点 x 和 y 处与垂线相交。然后我需要判断点 z 是否出现在这两行之间。

感谢任何帮助。感谢您的宝贵时间!

【问题讨论】:

  • 这不是多边形中的点问题吗? - 这是一道数学题,更适合math.stackexchange.com
  • 问题是,我没有使用通用语言。但我使用的语言最像 Java。不过,我想我已经找到了自己问题的答案。获取从 x 到 y 的角度。现在得到从 x 到 z 的角度。如果绝对差小于 90,那不就在这两点之间吗?
  • 是的,但这不是编程问题
  • 为什么要标记 java 和 javascript?两种完全不相关的语言

标签: java math


【解决方案1】:

计算角度 xyz 和 yxz。如果其中一个大于 90,那么它在外面。

【讨论】:

    【解决方案2】:

    既然你用java 标记了你的问题,那么你去吧:

    import javafx.geometry.Point2D;
    ....
    // is z between parallel lines 
    boolean betweenLines(Point2D x, Point2D y, Point2D z) { 
        return  x.angle(y,z) < 90 && y.angle(x,z) < 90;
    }
    

    【讨论】:

      【解决方案3】:

      要确定 Z 点是否落在所需的条纹中,您可以确定 Z 到 X-Y 线的投影是否落在这些点之间。 定义向量 v = Y - Xw = Z - X。投影位于 XY 段,如果 参数 b 在 0..1 范围内。很简单的公式:

      b = DotProduct(w, v) / DotProduct(v, v)

      【讨论】:

        【解决方案4】:

        JavaScript 中的示例代码:

        // JavaScript function to determine if infinite strip generated
        // by x and y contains the point z
        // point structure is:
        //  {
        //      double x;
        //      double y;
        //  }
        // returns true or false
        function stripContainsPoint(x, y, z) {
            var distXZ = (x.x - z.x) * (x.x - z.x) + (x.y - z.y) * (x.y - z.y),
                distXY = (x.x - y.x) * (x.x - y.x) + (x.y - y.y) * (x.y - y.y),
                distYZ = (y.x - z.x) * (y.x - z.x) + (y.y - z.y) * (y.y - z.y);
        
            // if triangle is right or acute, or obtuse with hypotenuse XY, returns true
            return (distXZ + distXY >= distYZ) && (distYZ + distXY >= distXZ);
        }
        

        变量dist?? 用词不当,因为它们实际上是每个变量的距离平方。

        【讨论】:

        • 作为记录,当问题仍被标记为 JavaScript 时,我正在写这个答案
        【解决方案5】:

        所以一条线可以用y = mx + b来描述。假设您的第一行由y = 2x-1 表示。然后对于任何点 (u,v),您可以插入 x=u 以便 y = 2u-1。这使您可以确定 y 为您的行上的 x 位置。因此,如果v&gt;y,那么你的观点就在这条线的上方。否则,你的观点就在这条线的下方。

        通过使用两条平行线执行此操作,您最终会得到图片中明显的三种情况:

        1. y 大于两条线上的对应点
        2. y 大于其中一条线上的对应点
        3. y 小于两条线上的对应点

        编辑:

        阅读您帖子中的一些 cmets,听起来可能有比这更好的方法 :)

        【讨论】:

          【解决方案6】:

          基本上,这是一道数学题,而不是编程题。 (或者换句话说,一旦你理解了数学,编程就变得微不足道了。)

          我可以想到两种方法来做到这一点:

          1. 计算出穿过 x 和 y 的 2 条垂直线。如果z在x垂线之上,y垂线之下。

          2. 计算出 y-x-z 之间的角度和 x-y-z 之间的角度。如果两个角度都小于 90 度,则 z 位于两条线之间。

          【讨论】:

          • 3.确定每两点之间的距离平方。如果 X 和 Y 加上 X 和 Z 之间的距离平方小于 Y 和 Z 之间的距离,并且 X 和 Y 与 Y 和 Z 之间的距离平方小于 X 和 Z 之间的距离。(这比计算角度的计算成本要低得多)
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-10-23
          • 1970-01-01
          • 1970-01-01
          • 2013-07-27
          • 1970-01-01
          • 1970-01-01
          • 2011-06-30
          相关资源
          最近更新 更多