【问题标题】:If two lines intersect using cross product如果两条线使用叉积相交
【发布时间】:2014-10-16 23:40:05
【问题描述】:

我试图弄清楚两条线是否在平面中相交。我一直在尝试使用向量的叉积,但一直得到大量错误的答案。我意识到其中一些原因是因为一切都没有那么久,但即使在这个改变之后,我仍然在寻找不存在的交叉点。任何人都可以注意到我是否滑倒了。我一直在努力弄清楚。

我的代码如下:

 public static boolean intersecting_segments ( Line_Segment A, Line_Segment B)
     {

       float side_one;, side_two ,side_three, side_four ;

         side_one =  cross_product( A, B.p) ;
         side_two =  cross_product( A, B.q) ;
         side_three =  cross_product( B, A.p) ;
         side_four =  cross_product( B, A.q) ;

        return ( side_one >0 && side_two <0)|| ( side_one <0 && side_two >0) &&
        ( side_three >0 && side_four <0)|| ( side_three <0 && side_four >0);
     }


 public static long cross_product ( Line_Segment S, End_point r )
     {

    return (long)(((long)r.x -(long)S.p.x)*((long)S.q.y-(long)S.p.y)) -(((long)r.y- (long)S.p.y)*((long)S.q.x-(long)S.p.x));
     }   

【问题讨论】:

  • 您应该将Line_Segment 中的字段数据类型更改为long
  • 我已将 Line_Segment x 和 y 更改为 longs 和 side_XX 但是我似乎仍然遇到同样的问题。

标签: java vector


【解决方案1】:

您也应该使 side_XX 变量变长,这可能会解决您的问题。如果这些变量必须有小数,请使用双精度而不是浮点数。

原因是虽然 cross_product 函数返回一个 long,但它们被分配给的变量(side_one、side_two 等)是浮点数。这将强制从 long 转换为 float,这将失去精度并且在大数字时不准确。

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

【讨论】:

    【解决方案2】:

    如果没有看到您的 Line_Segment 代码,我无法 100% 确定这一点,但根据您在此处发布的内容,我猜 xy 字段是 ints,您在cross_product() 方法中将其转换为longs。

    如果是这种情况,那么您在此处的演员表并没有像您认为的那样做:例如,如果您创建一个名为 pLine_Segment,其 x 值溢出到 50(即它是比最大整数值多 50,这意味着它被存储为 50),然后p.x 是 50,而通过将其转换为 long 所做的只是使其成为 50L - 它不会“撤消”溢出。

    您需要将这些变量的类型更改为long,以便正确存储它们并丢失强制转换。 (呃,从技术上讲,您不必丢失演员表,但它们毫无意义)

    【讨论】:

    • 我已将 Line_Segment x 和 y 更改为 longs 和 side_XX,现在已经解决了我找不到确实存在的交叉点的问题。
    猜你喜欢
    • 2016-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多