如果两条线使用叉积交叉

时间:2014-10-16 23:40:05

标签: java vector

我试图弄清楚两条线是否在平面中交叉。我一直在尝试使用向量的交叉积,但是大量的错误答案。我意识到其中一些原因是没有让所有东西都长,但即便在这种变化之后,我仍然发现了不存在的交叉点。任何人都可以注意到我已经滑倒了。我一直试图找出相当长的一段时间。

我的代码如下:

 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));
     }   

2 个答案:

答案 0 :(得分:0)

如果没有看到您的Line_Segment代码,我无法100%确定这一点,但根据您在此处发布的内容,我猜测xy字段是int s,您在long方法中投放到cross_product() s。

如果是这种情况,那么您在此处的演员表没有按照您的想法行事:例如,如果您创建一个名为Line_Segment的{​​{1}} p值溢出到50(即它比最大整数值多50,这意味着它存储为50),然后x为50,而你通过将其转换为p.x所做的只是为了{ {1}} - 它不会“撤消”溢出。

您需要将这些变量的类型更改为long,以便正确存储,并丢失演员表。 (呃,你在技术上不会失去演员,但他们没有意义)

答案 1 :(得分:0)

你应该让side_XX变量变长,这可能会解决你的问题。如果这些变量必须有小数,请使用double而不是float。

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

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